将特定 AWS API Gateway 阶段连接到 CloudFormation 模板中的特定 Lambda 别名

Posted

技术标签:

【中文标题】将特定 AWS API Gateway 阶段连接到 CloudFormation 模板中的特定 Lambda 别名【英文标题】:Connect specific AWS API Gateway stage to specific Lambda alias in CloudFormation template 【发布时间】:2018-10-29 01:08:59 【问题描述】:

我为我的 AWS API Gateway 和 Lambda 函数创建了 CloudFormation 模板,我需要将特定的 API Gateway 阶段连接到特定的 Lambda 别名。我有两个别名 - QA 和 Prod,以及两个 API 阶段(QA 和 Prod),在 CloudFormation 模板中看起来像:

AWSTemplateFormatVersion: "2010-09-09"

Transform: "AWS::Serverless-2016-10-31"

Description: Lambda function configuration

Resources:
  EndpointLambda:
    Type: "AWS::Lambda::Function"
    Properties:
      FunctionName: "endpoint-lambda"
      Handler: "com.test.aws.RequestHandler::handleRequest"
      Runtime: java8
      Code:
        S3Bucket: "lambda-functions"
        S3Key: "test-endpoint-lambda-0.0.1.jar"
      Description: Test Lambda function
      MemorySize: 256
      Timeout: 60
      Environment:
        Variables:
          ES_HOST: test-es-host-url
          ES_ON: true
          ES_PORT: 443
          ES_PROTOCOL: https
          REDIS_URL: test-redis-host-url

  QaLambdaAlias:
    Type: "AWS::Lambda::Alias"
    Properties:
      FunctionName: !Ref EndpointLambda
      FunctionVersion: 1
      Name: "QA"
      Description: "QA alias"

  ProdLambdaAlias:
    Type: "AWS::Lambda::Alias"
    Properties:
      FunctionName: !Ref EndpointLambda
      FunctionVersion: 1
      Name: "Prod"
      Description: "Production alias"

  RestApi:
    Type: "AWS::ApiGateway::RestApi"
    Properties:
      Name: "test-rest-api"
      Description: "Test REST API"

  RestApiResource:
    Type: "AWS::ApiGateway::Resource"
    Properties:
      RestApiId: !Ref "RestApi"
      ParentId: !GetAtt "RestApi.RootResourceId"
      PathPart: "/test"

  RestApiDeployment:
    Type: "AWS::ApiGateway::Deployment"
    Properties:
      RestApiId: !Ref "RestApi"

  QaRestApiStage:
    Type: "AWS::ApiGateway::Stage"
    Properties:
      DeploymentId: !Ref "RestApiDeployment"
      RestApiId: !Ref "RestApi"
      StageName: "qa"

  ProdRestApiStage:
    Type: "AWS::ApiGateway::Stage"
    Properties:
      DeploymentId: !Ref "RestApiDeployment"
      RestApiId: !Ref "RestApi"
      StageName: "prod"

如何在模板中描述 QA API 阶段应该调用 Lambda 函数的 QA 别名,以及 Prod 阶段 - Prod 别名?

【问题讨论】:

【参考方案1】:

首先了解如何使用 GUI 进行操作。这里有一些关于你想要做什么的文档。如果这是您第一次设置这些权限,您还需要添加一些额外的权限 -

https://docs.aws.amazon.com/apigateway/latest/developerguide/stage-variables.html

但是为了快速回答您要查找的是 $:stageVariables.stage ,它的作用是链接您要触发的 lambda 的别名。在 GUI 中,它看起来像这样:

这将允许您的 lambda 触发某个别名。输入后,您将能够在 API 网关中使用测试功能时看到一个新选项。所以在这里你要指定 QA。

因此,为了在 Cloudformation 中反映这一点,我们需要做一些类似的事情 -

  RestApi:
      Type: "AWS::ApiGateway::RestApi"
      Properties:
          Name: "test-rest-api"
          Description: "Test REST API"
          paths:
              /ExamplePath:
                put:
                    #Here will go all the configuration setting you want
                    #Such as security, httpMethod, amd passthroughBehavior
                    #But what you need is
                    uri: 'arn:aws:apigateway:$AWS:Region:lambda:path/2-15/03/31/functions/$LambdaARN:$!stageVariables.stage/invocations'

更多信息可以在这里找到: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html 你想看到的是在页面的最底部。 希望这会有所帮助!

【讨论】:

以上是关于将特定 AWS API Gateway 阶段连接到 CloudFormation 模板中的特定 Lambda 别名的主要内容,如果未能解决你的问题,请参考以下文章

将托管在 AWS EC2 上的 Asp.net Web api 连接到 AWS API Gateway

尝试连接到 AWS Gateway 私有 API 时出现 UnknownHostException

如何使用 AWS CloudFormation 在 AWS API Gateway 集成中指定阶段变量?

将 AWS API Gateway 和私有 EC2 实例拼接在一起

如何将无服务器代码部署到 AWS API Gateway 中的阶段

是否可以使用 AWS SAM 配置具有不同 lambda 版本的不同 API Gateway 阶段