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 别名

使用代理通过 AWS API Gateway 的 Lambda 错误

如何调试 AWS Api Gateway 和 Lambda 的“AWS/ApiGateway 5XXError”