如何用Python CDK实现API Gateway按Stage调用Lambda对应别名?
解决API Gateway多阶段对应Lambda别名的问题
针对API Gateway的stg/prd阶段无法匹配对应Lambda别名的问题,直接给你两个关键修复步骤及CDK代码示例:
1. 给API Gateway的Lambda集成添加别名变量
在配置API与Lambda的集成时,必须在Lambda的ARN末尾拼接:${stageVariables.alias},让API Gateway能根据当前阶段的变量动态调用对应别名的Lambda版本。
CDK代码示例:
from aws_cdk import aws_apigateway as apigw, aws_lambda as _lambda # 假设已定义好Lambda函数my_lambda及stg别名 my_lambda = _lambda.Function(...) stg_alias = _lambda.Alias(self, "StgAlias", alias_name="stg", version=my_lambda.current_version) # 创建带别名变量的Lambda集成 lambda_integration = apigw.LambdaIntegration( my_lambda, integration_responses=[{"statusCode": "200"}], # 关键:在Lambda ARN后添加别名变量占位符 uri=f"arn:aws:apigateway:{self.region}:lambda:path/2015-03-31/functions/{my_lambda.function_arn}:${{stageVariables.alias}}/invocations" ) # 将集成绑定到API资源 api = apigw.RestApi(self, "MyApi") api.root.add_method("POST", lambda_integration)
2. 为stg阶段配置别名变量并添加Lambda触发器权限
给stg阶段设置alias变量值为stg,同时添加API Gateway调用对应Lambda别名的权限。
CDK代码示例:
# 创建stg阶段并配置别名变量 stg_stage = api.deployment_stage.add_stage( "stg", stage_name="stg", variables={"alias": "stg"} # 关联Lambda的stg别名 ) # 给stg阶段添加Lambda调用权限 _lambda.CfnPermission(self, "StgApiLambdaPermission", action="lambda:InvokeFunction", function_name=f"{my_lambda.function_name}:stg", principal="apigateway.amazonaws.com", source_arn=f"{stg_stage.stage_arn}/*/*" ) # 同步配置prd阶段(如果之前未正确设置) prd_stage = api.deployment_stage.add_stage( "prd", stage_name="prd", variables={"alias": "prd"} # 若有prd别名则填prd,否则用$LATEST ) _lambda.CfnPermission(self, "PrdApiLambdaPermission", action="lambda:InvokeFunction", function_name=f"{my_lambda.function_name}:prd", principal="apigateway.amazonaws.com", source_arn=f"{prd_stage.stage_arn}/*/*" )
注意:如果prd阶段不需要专用别名,可将变量值和函数名替换为$LATEST,但建议给prd也创建专用别名便于版本管理。
内容的提问来源于stack exchange,提问作者jiminssy
相关产品推荐
相关产品推荐

