SAM模板:多个微服务lambda共享一个AWS :: ApiGateway :: DomainName

时间:2018-04-27 22:21:36

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

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

当然,必须能够在具有独特路径的多个微服务中共享一个共同的自定义域吗?

服务#1 template.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模板是相同的,但路径不同(.e.g。/service_two

1 个答案:

答案 0 :(得分:1)

使用AWS支持来深入了解这一支持。在当前形式(2018年5月)中,如果出于部署原因需要为每个lambda分别使用SAM模板,但是为这些lambda拥有共享API网关资源,则必须具有单独的专用API网关SAM模板。此外,必须排除AWS :: Serverless :: Function中的Events参数,以支持AWS :: Serverless :: Api中的路径定义。

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