如何通过SAM CLI将Lambda部署至已有API Gateway与自定义授权器?
使用SAM CLI将Lambda部署至现有API Gateway(Terraform创建)
要在SAM模板中引用Terraform创建的现有API Gateway和自定义授权器,核心是通过资源ID或导入值关联现有资源,以下是具体步骤:
1. 获取现有资源的关键标识
首先需要拿到已创建资源的ID:
- API Gateway RestApiId:执行
aws apigateway get-rest-apis,从返回结果中找到目标API的id字段。 - 自定义授权器AuthorizerId:执行
aws apigateway get-authorizers --rest-api-id <你的RestApiId>,找到目标授权器的id字段。
如果DevOps团队用Terraform管理资源,可要求他们将这两个ID设为导出输出(Terraform的export = true),这样SAM能直接通过导入值引用,避免硬编码。
2. 修改SAM模板关联现有资源
修改template.yaml,在Lambda的Events配置中指定现有API Gateway和授权器。以下是完整示例:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: 关联现有API Gateway的Lambda部署模板 # 可选:用参数传递ID,避免硬编码 Parameters: ExistingRestApiId: Type: String Description: Terraform创建的API Gateway的RestApiId ExistingAuthorizerId: Type: String Description: Terraform创建的自定义授权器的AuthorizerId Resources: YourLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./src/ # 保持你本地的代码路径 Handler: app.lambda_handler # 你的Lambda handler路径 Runtime: python3.11 # 替换为你的运行时 Events: ApiGatewayIntegration: Type: Api Properties: RestApiId: !Ref ExistingRestApiId # 关联现有API Path: /your-endpoint # 替换为你要绑定的API路径 Method: POST # 替换为对应的HTTP方法 Authorizer: Id: !Ref ExistingAuthorizerId # 关联现有自定义授权器 Type: CUSTOM # 固定为CUSTOM类型(匹配Terraform创建的授权器类型)
若Terraform已导出资源ID
如果Terraform已将RestApiId和AuthorizerId设为导出输出,可直接用!ImportValue替换!Ref,无需参数:
RestApiId: !ImportValue terraform-exported-rest-api-id Authorizer: Id: !ImportValue terraform-exported-authorizer-id
3. 用SAM CLI部署
执行部署命令,若用参数传递ID:
sam deploy --guided --parameter-overrides ExistingRestApiId=<你的RestApiId> ExistingAuthorizerId=<你的AuthorizerId>
首次部署后,SAM会生成samconfig.toml保存配置,后续直接执行sam deploy即可。
常见问题排查
- 部署后API无法触发Lambda:检查Lambda的执行角色是否有
lambda:InvokeFunction权限(SAM默认会生成该权限),或API Gateway是否已正确关联Lambda集成。 - 授权器不生效:确认AuthorizerId是否正确,且授权器的类型(如CUSTOM)与模板中指定的
Type一致。 - 模板验证失败:检查YAML格式是否正确,参数引用是否无误。
内容的提问来源于stack exchange,提问作者el n00b
相关产品推荐
相关产品推荐

