部署至AWS的Serverless Lambda API如何用curl传JSON测试及403报错排查
问题背景
- 开发的简易API核心逻辑:从传入的JSON文件中读取键值,到数据库校验对应值是否存在
- 本地测试通过的调用方式:执行
serverless invoke local --function getVin --path input/input_212.json - 部署到AWS后测试异常:两种curl调用均返回CloudFront生成的403错误,报错提示请求为错误请求、无法连接到对应应用服务器
- 业务使用的输入JSON结构示例:
{"key1": 1,"key2": "abcdefg"}
已尝试的失败调用方式
- 方式1:
curl --request GET 'https://xxxx.execute-api.us-east-1.amazonaws.com/dev/vin' --header 'content-type: text/plain' --data-raw @input.json - 方式2:
curl -H "Content-Type: application/json" -X GET -d '{"CustomerId": 213,"VIN": "WDBJF65J1YB039213"}' https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/vin
403问题排查与正确测试方案
- 首先明确报错来源:该403为边缘节点(API Gateway前置层、CloudFront/WAF)拦截,不是Lambda函数本身的业务返回,常见触发点如下:
- 路由与请求方法不匹配:本地
serverless invoke local调用不需要匹配HTTP方法,但部署后API Gateway会严格校验请求方法与路径是否和绑定配置一致。如果函数绑定的是POST方法,发送GET请求会直接被拦截;带请求体的GET请求不符合HTTP通用规范,大部分边缘节点会直接拦截这类请求,不建议给GET接口传body参数 - 访问控制配置拦截:如果API部署时开启了API密钥校验、IP白名单资源策略,未携带合法密钥、IP不在允许列表的请求会被直接返回403
- 自定义域名配置不匹配:如果使用了CloudFront自定义域名,源站映射错误、WAF规则拦截、缓存策略不兼容也会触发该类403
- 路由与请求方法不匹配:本地
- 正确的curl测试写法(适配多数场景:函数绑定POST方法、路径为
/dev/vin):
直接用curl -X POST https://xxxx.execute-api.us-east-1.amazonaws.com/dev/vin \ -H "Content-Type: application/json" \ -d @./input/input_212.json@引用和本地测试完全一致的JSON文件即可,不需要手动拼接JSON字符串到命令行参数 - 快速定位问题的验证方法:
直接调用API Gateway分配的原始默认域名测试,如果默认域名请求正常、自定义域名报403,问题出在CloudFront/WAF配置层;如果默认域名也返回403,问题出在API Gateway的访问控制、路由配置层
注:调用时如果API开启了API密钥校验,需要在请求头里加上
x-api-key: 你的API密钥才能通过校验
内容的提问来源于stack exchange,提问作者bruvio
相关产品推荐
相关产品推荐

