【问题标题】:SAM Template: multiple microservice lambdas sharing a single AWS::ApiGateway::DomainNameSAM 模板:多个微服务 lambda 共享一个 AWS::ApiGateway::DomainName
【发布时间】:2018-04-27 22:21:36
【问题描述】:

我的目标是允许多个独立的 lambda 资源(微服务)共享一个用于测试环境的通用自定义域。使用下面的模板,部署微服务 #1 没有问题。但是,在部署微服务 #2 时,CloudFormation 失败并回滚,因为域名已分配给微服务 #1。

肯定可以在具有唯一路径的多个微服务之间共享一个公共自定义域吗?

服务 #1 模板.yaml

Resources:
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: !Sub ${apiGatewayStageName}
      DefinitionBody:
        swagger: "2.0"
        info:
          title: !Sub ${functionName}
        paths:
          "/service_one":
            post:
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${functionName}:live/invocations"
                httpMethod: POST
                type: aws_proxy

  ApiGatewayCustomDomainName:
    Type: AWS::ApiGateway::DomainName
    Properties:
      CertificateArn: !Sub "arn:aws:acm:${AWS::Region}:${AWS::AccountId}:certificate/${apiGatewayCDNCertificateId}"
      DomainName: !Sub "${envName}.${apiGatewayCustomDomainNameSuffix}"
    DependsOn:
      - "LogsSubscriptionFilter"
      - "ApiGatewayApi"

  ApiGatewayBasePathMapping:
    Type: AWS::ApiGateway::BasePathMapping
    Properties:
      DomainName: !Ref ApiGatewayCustomDomainName
      RestApiId: !Ref ApiGatewayApi
      Stage: !Ref apiGatewayStageName
    DependsOn: "ApiGatewayCustomDomainName"

Service #2 模板是相同的,只是路径不同(例如/service_two。

【问题讨论】:

    标签: aws-lambda microservices aws-api-gateway aws-sam-cli


    【解决方案1】:

    与 AWS 支持团队合作,深入了解这一问题。在当前形式(2018 年 5 月)中,如果您出于部署原因需要为每个 lambda 提供单独的 SAM 模板,但为这些 lambda 提供共享的 API Gateway 资源,那么您必须有一个单独的专用 API Gateway SAM 模板。此外,必须排除 AWS::Serverless::Function 中的 Events 参数,以支持 AWS::Serverless::Api 中的路径定义。

    最后,AWS::Serverless::Function(s) 必须在 Output 下导出,然后由 AWS::Serverless::Api 资源导入。

    【讨论】:

    • 问题:假设每个 Lambda 都在其自己的存储库中用于 CI/CD 目的。您有多个 Lambda 存储库,它们都共享一个通用 API 网关。这里最好的 CI/CD 存储库设置是什么? APIGW SAM 的单独存储库?整个 API 的真相……作为单个 lambda 存储库的 git 子模块包含在内?这是我现在能想到的最好的了。对你是怎么做的感兴趣。
    • 如果您使用 CloudFormation 创建完整堆栈(就像我们一样),则无法按照您的描述分离资源。我们现在所处的位置是每个 Lambda 存储库都通过 CloudFormation(包括 CloudFront 中的静态端点)生成一个完整的 AWS 堆栈。因此,我们有大量用于测试的静态 url;我们还没有生产的解决方案。
    • 我有一个关于副业的类似问题:stackoverflow.com/questions/51353076/…
    • 国内暂不支持跨栈资源引用。我必须将所有微服务组合在一个模板中,在一个 git repo 中部署在同一个 api 网关域下......你们有更灵活的解决方案吗?我想分离微服务的 CI/CD 管道。
    • @yayayahei 我已经迁移到 Terraform。无需堆栈和输出即可更轻松地交叉引用资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多