AWS SAM本地调用API如何返回Lambda事件的version 2.0格式
问题根因
你当前的配置存在两处错误导致始终拿到v1版本的event:
- 函数触发事件的
Type设置为Api,该类型对应API Gateway REST API(v1版本event格式),和你线上使用的HTTP API不匹配 - 没有显式指定HTTP API的负载格式版本为2.0,SAM本地环境默认会 fallback 到v1格式
修改方案
按如下内容调整你的template.yml:
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Resources: MyFunction: Type: 'AWS::Serverless::Function' Properties: Handler: index.handler Runtime: nodejs14.x CodeUri: .output/healthz Timeout: 10 Events: ApiEvent: # 把Type从Api改成HttpApi Type: HttpApi Properties: Path: /health Method: GET # 显式指定负载格式版本为2.0 PayloadFormatVersion: '2.0' Globals: HttpApi: # 可以全局指定所有HttpApi的负载格式版本,避免每个事件重复配置 PayloadFormatVersion: '2.0' CorsConfiguration: AllowOrigin: "'http://localhost:3000'" AllowMethods: "'POST, OPTIONS, GET, PUT'" AllowHeaders: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
验证操作
修改完成后:
- 首先建议升级SAM CLI到最新版本,避免旧版本对HttpApi的支持存在缺陷
- 重新执行
sam local start-api启动本地服务,调用接口即可拿到符合2.0格式的event,和线上部署效果一致
内容的提问来源于stack exchange,提问作者Greg Wozniak
相关产品推荐
相关产品推荐

