如何在AWS SAM模板中将API集成配置为非代理Lambda而非默认Lambda代理
SAM模板配置Lambda非代理集成及映射规则实现方法
核心配置逻辑
SAM默认生成的API Gateway Lambda集成为代理模式,要切换为非代理模式,需要显式定义AWS::Serverless::Api资源,不能使用隐式自动生成的API实例,同时在API的路径配置中指定集成类型为非代理、添加对应的请求/响应映射规则。
完整配置示例
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: # 显式定义API Gateway资源 MyNonProxyApi: Type: AWS::Serverless::Api Properties: StageName: prod DefinitionBody: swagger: '2.0' info: title: Non-proxy Lambda API paths: /test: post: # 配置非代理集成 x-amazon-apigateway-integration: type: aws uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyLambdaFunction.Arn}/invocations httpMethod: POST # 配置请求映射模板 requestTemplates: application/json: | { "body": $input.json('$'), "queryParams": { "foo": "$input.params('foo')" }, "headerParams": { "Content-Type": "$input.params('Content-Type')" } } # 配置响应映射规则 responses: default: statusCode: 200 responseTemplates: application/json: | $input.json('$.payload') # 配置方法级别的响应状态码 responses: '200': description: 成功响应 # Lambda函数定义 MyLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/ Handler: app.handler Runtime: python3.9 Events: ApiEvent: Type: Api Properties: # 关联上面显式定义的非代理API RestApiId: !Ref MyNonProxyApi Path: /test Method: post
关键配置说明
- 集成类型切换:
x-amazon-apigateway-integration下的type设置为aws即为Lambda非代理集成,对应代理模式的aws_proxy - 请求映射配置:
requestTemplates字段下可以按请求Content-Type定义不同的映射规则,自定义传递给Lambda的事件结构 - 响应映射配置:
responses字段下配置Lambda返回值到API Gateway响应的转换规则,同时可以指定响应头、状态码等参数
注意事项
- 非代理模式下不会自动透传全量请求信息,需要的请求参数、头、路径变量都要手动在请求映射模板中声明
- Lambda不需要返回代理模式要求的固定格式(包含statusCode、body、headers的结构),返回内容可以完全自定义,再通过响应映射模板转换为客户端需要的格式
内容的提问来源于stack exchange,提问作者Muhammad Ali
相关产品推荐
相关产品推荐

