AWS API Gateway - Lambda 代理(集成请求) - 内部服务器错误
Posted
技术标签:
【中文标题】AWS API Gateway - Lambda 代理(集成请求) - 内部服务器错误【英文标题】:AWS API Gateway - Lambda Proxy (Integration Request) - Internal Server Error 【发布时间】:2019-10-26 07:12:52 【问题描述】:与 DynamoDB 进行简单的 Lambda POST 集成。在执行时将一条记录插入 Dynamo。在 AWS Lambda 中进行测试时效果很好。
响应输出为:
"isBase64Encoded": false,
"statusCode": 204,
"headers":
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true
,
"body": ""
根据the spec(afaict),此响应以编程方式定义为 Lambda 响应处理的一部分。
但是,当通过 API Gateway 中的测试运行时,我收到 502
内部服务器错误。我正在使用 Lambda-Proxy 集成,如下所示:
Cloudwatch 日志显示:
ValidationException: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes
at Request.extractError
使用有限的堆栈跟踪(webpack 已经很好地散列了代码)。上述错误表明 DynamoDB 没有正确接收有效负载,或者没有以它想要的格式接收所需属性。但是,我从 lambda 中采用了用于(成功)测试(调整 ID 在运行之间唯一)的相同 JSON,并且相信我的请求标头(Content-Type:application/json)是明智的。
对缩小问题范围有任何想法/帮助吗?如果有帮助,我可以按要求发布更多信息。
【问题讨论】:
【参考方案1】:好的,通过记录所有输出(并在 CloudWatch 中检查)解决了这个问题,特别是 event
对象。在 Lambda 测试 模式下运行时,ID 和其他 POST 属性在事件对象的根中传递。但是,当使用 lambda-proxy 模式时,集成会重新映射事件对象层次结构,并且 POST 属性会被 JSON 字符串化为 body
属性。
只是一个怪癖,一旦你了解它在做什么,它就会变得有意义。也就是说,在依次测试 Lambda 和 API Gateway 时,相同的有效负载失败,这很奇怪。
【讨论】:
以上是关于AWS API Gateway - Lambda 代理(集成请求) - 内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章
AWS API Gateway - Lambda - 内部服务器错误
是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?
通过 API-Gateway 将动态路径传递给 AWS-Lambda
如何将特定 AWS API Gateway 阶段连接到特定 AWS lambda 别名