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

AWS SAM部署使用阶段变量关联Lambda别名的API Gateway栈时失败

AWS SAM部署使用阶段变量关联Lambda别名的API Gateway栈时失败

看起来你在尝试用API Gateway阶段变量关联Lambda别名的时候踩了个小坑,错误提示已经很明确了——集成的ARN格式不符合要求,咱们一步步来修复这个问题:

1. 修正API Gateway集成Uri的阶段变量引用

你当前的Uri拼接里用了${lambda_alias},但这个变量根本没有定义,而且API Gateway里引用阶段变量的正确语法是${stageVariables.变量名}。你在Stage里定义的阶段变量是function_alias,所以Uri里要改成对应的引用方式:

修改ResourceMethodGet的Integration.Uri部分:

Uri: !Join
  - ""
  - - "arn:aws:apigateway:"
    - ${AWS::Region}
    - ":lambda:path/2015-03-31/functions/"
    - !GetAtt HelloWorldFunction.Arn
    - ":${stageVariables.function_alias}"
    - "/invocations"

2. 添加Lambda调用权限(关键遗漏项)

API Gateway要调用Lambda别名,必须有对应的权限许可,否则就算ARN格式对了,后续调用也会报错。你需要在模板里添加Lambda权限资源:

ApiGatewayLambdaPermission:
  Type: AWS::Lambda::Permission
  Properties:
    FunctionName: !Sub "${HelloWorldFunction.Arn}:*" # 允许调用所有别名
    Action: lambda:InvokeFunction
    Principal: apigateway.amazonaws.com
    SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${AppApi}/*/*/hello-world"

3. 给Deployment添加依赖关系

CloudFormation部署的时候,需要确保API方法已经创建完成再生成部署包,否则可能出现部署时方法还未就绪的问题。给你的两个Deployment资源加上DependsOn:

ProductionDeployment:
  Type: AWS::ApiGateway::Deployment
  Properties:
    RestApiId: !Ref AppApi
  DependsOn: ResourceMethodGet

StagingDeployment:
  Type: AWS::ApiGateway::Deployment
  Properties:
    RestApiId: !Ref AppApi
  DependsOn: ResourceMethodGet

错误原因复盘

你之前的错误是因为Uri里的${lambda_alias}是无效的变量引用,API Gateway无法识别这个占位符,导致生成的ARN格式不符合Lambda集成的要求(必须包含正确的路径/别名部分),所以抛出了BadRequestException。

现在把这些修改应用到你的template.yaml里,重新运行sam build && sam sync --stack-name hello-world-app应该就能正常部署了。

备注:内容来源于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:37:42