将特定 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 实例拼接在一起