3

我的目标是允许多个独立的 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"

服务 #2 模板是相同的,只是路径不同(例如/service_two.

4

1 回答 1

3

与 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 资源导入。

于 2018-05-09T21:39:51.100 回答