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
相关产品推荐
相关产品推荐

