如何通过AWS SAM CLI实现API Gateway不同阶段关联Lambda不同版本/别名?
如何通过AWS SAM CLI实现API Gateway不同阶段关联Lambda不同版本/别名?
我完全懂你从传统开发转AWS云开发的困惑——一开始确实会觉得Lambda的版本、别名和API Gateway的阶段搭配起来有点绕,尤其是想纯用CLI/SAM搞定而不想碰控制台的话,得摸清楚正确的配置姿势。咱们一步步来解决你的问题:
核心思路:用API Gateway阶段变量关联Lambda别名
首先要明确,AWS推荐的方式是复用同一个API Gateway,通过阶段变量来指向不同的Lambda别名/版本,而不是给每个环境单独建网关。这样你可以在API Gateway里创建prod和staging两个阶段,每个阶段用不同的变量值,来关联对应的Lambda别名。
解决Lambda别名创建的CLI报错问题
你之前执行aws lambda create-alias时报错,是因为shell把$LATEST当成了环境变量解析,导致参数缺失。只要给$LATEST加双引号就能解决:
aws lambda create-alias --function-name test-hello-world --name staging --function-version "$LATEST"
如果想关联到特定版本(而不是最新的$LATEST),直接把"$LATEST"换成具体的版本号就行,比如1。
关键:在SAM模板里配置阶段变量和Lambda集成
这是解决SAM部署覆盖配置的核心——你必须把阶段变量和Lambda集成的关联逻辑写到template.yaml里,不然每次sam deploy都会重置API Gateway的集成配置。下面给你一个完整的示例片段:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs18.x AutoPublishAlias: live # 自动发布live别名,每次部署后指向最新版本 # 其他函数配置按需添加 MyApi: Type: AWS::Serverless::HttpApi Properties: StageName: prod # 默认创建prod阶段 Variables: LambdaAlias: live # prod阶段用live别名 DefinitionBody: openapi: 3.0.1 info: title: !Ref AWS::StackName paths: /hello: get: responses: {} x-amazon-apigateway-integration: # 用阶段变量引用Lambda别名,关键就在这里! uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${HelloWorldFunction.Arn}:${stageVariables.LambdaAlias}/invocations httpMethod: POST type: aws_proxy # 手动创建staging阶段,配置对应的变量 StagingStage: Type: AWS::ApiGatewayV2::Stage Properties: ApiId: !Ref MyApi StageName: staging Variables: LambdaAlias: staging # staging阶段用staging别名 AutoDeploy: true
这段配置的作用:
AutoPublishAlias: live:SAM会自动帮你管理Lambda的版本和live别名,每次部署函数时,都会发布新版本并把live别名指向它,不用手动管版本号。- API集成的
uri里用${stageVariables.LambdaAlias}:这样不同阶段会自动替换成对应的别名,实现prod调用live版本、staging调用staging版本的效果。 - 单独定义
StagingStage资源:明确创建staging阶段并设置变量,SAM部署时会保留这个配置,不会覆盖。
完整的部署流程
- 第一次部署执行
sam deploy --guided,跟着向导完成配置,这会创建Lambda函数、prod阶段和live别名。 - 创建staging别名:用刚才修正的CLI命令,注意函数名要和模板里的一致(或者用栈输出的函数名称):
aws lambda create-alias --function-name HelloWorldFunction --name staging --function-version "$LATEST" - 后续更新代码后,直接执行
sam deploy即可:SAM会自动更新Lambda的新版本和live别名,而staging别名不受影响,两个阶段的关联关系也会保留。
这样一来,你就完全用CLI和SAM实现了不同API阶段关联不同Lambda版本/别名的需求,不用再依赖控制台操作啦!
备注:内容来源于stack exchange,提问作者fudo
相关产品推荐
相关产品推荐

