You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:57:31