CDK中如何访问Lambda关联的API Gateway并新增API端点?
答复
你完全可以访问该Lambda绑定的API Gateway并完成扩展。你当前跨文件仅通过ARN加载了Lambda实例,缺少API Gateway的实例引用,只要补全API的参数存储与加载逻辑,即可正常新增端点,具体实现步骤如下:
1. 补全API参数存储(在创建API的原栈中操作)
你之前创建my_api时没有存储API的核心标识,跨文件无法直接定位到该API实例,需要在创建API的代码块后补充以下逻辑,把API ID和根资源ID存入SSM参数存储:
# 存储API ID ssm.StringParameter( self, "param-my-api-id", parameter_name="my-api-id", string_value=my_api.rest_api_id ) # 存储API根资源ID,新增路由时必须依赖该参数 ssm.StringParameter( self, "param-my-api-root-id", parameter_name="my-api-root-resource-id", string_value=my_api.rest_api_root_resource_id )
2. 跨文件加载已存在的API实例
在你需要扩展API的文件中,除了原有加载Lambda的逻辑,补充读取上述两个SSM参数,通过CDK提供的from_rest_api_attributes方法加载已有API实例:
# 原有加载Lambda的逻辑保留 _lambda_arn = ssm.StringParameter.value_for_string_parameter(self, "my-executor-lambda-arn") self.my_executor_lambda = _lambda.Function.from_function_arn(self, "my_executor", _lambda_arn) # 新增:加载已有API Gateway实例 _api_id = ssm.StringParameter.value_for_string_parameter(self, "my-api-id") _root_resource_id = ssm.StringParameter.value_for_string_parameter(self, "my-api-root-resource-id") self.loaded_api = _apigateway.RestApi.from_rest_api_attributes( self, "imported-my-api", rest_api_id=_api_id, root_resource_id=_root_resource_id )
提示:你初始化API时开启了
proxy=True,默认创建了根路径下的{proxy+}全路径代理路由,会把所有未匹配到明确路由的请求转发给绑定的my_executorLambda,新增端点时只要配置了明确路径,优先级会高于通配符代理路由,不会冲突。
3. 新增自定义API端点
拿到API实例后,即可按需创建路径资源、绑定请求方法、对接后端服务,以下是两个常见场景的示例:
场景A:新增GET /health检查端点,复用原有Lambda
# 创建/health路径资源 health_res = self.loaded_api.root.add_resource("health") # 绑定GET方法,对接原有Lambda health_res.add_method( "GET", _apigateway.LambdaIntegration(self.my_executor_lambda) )
场景B:新增POST /order/submit业务端点,对接独立新Lambda
# 先定义新的业务处理Lambda submit_order_lambda = python_lambda.PythonFunction( scope=self, id="submit-order-lambda", runtime=_lambda.Runtime.PYTHON_3_8, role=existing_role_for_lambda, memory_size=256, function_name="submit-order-handler", entry="./logs/src/order", index='controller.py', handler="lambda_handler", timeout=core.Duration.seconds(30) ) # 逐级创建/order/submit路径 order_res = self.loaded_api.root.add_resource("order") submit_res = order_res.add_resource("submit") # 绑定POST方法对接新Lambda submit_res.add_method( "POST", _apigateway.LambdaIntegration(submit_order_lambda) )
注意事项
- CDK会自动检测API的资源变更,同步更新对应的部署阶段,不需要手动触发重新部署
- 新增端点会自动继承你之前配置的全局CORS规则,不需要重复配置跨域逻辑
- 如果需要给新端点配置独立的限流、鉴权规则,可以在
add_method时单独传入对应配置,不会影响原有接口 - 新Lambda需要配置API Gateway的调用权限,CDK在使用
LambdaIntegration时会自动添加对应权限,不需要手动处理
内容的提问来源于stack exchange,提问作者back-new
相关产品推荐
相关产品推荐

