首页 > 解决方案 > AWS API Gateway - Lambda 代理(集成请求) - 内部服务器错误

问题描述

与 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": "{}"
}

根据规范(afaict) ,此响应以编程方式定义为 Lambda 响应处理的一部分。

但是,当通过API Gateway中的测试运行时,我收到502内部服务器错误。我正在使用 Lambda-Proxy 集成,如下所示:

API Gateway Lamba 代理集成

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)是明智的。

关于缩小问题范围的任何想法/帮助?如果有帮助,我可以按要求发布更多信息。

标签: aws-lambdaapi-gateway

解决方案


好的,通过记录所有输出(并在 CloudWatch 中检查)解决了这个问题,特别是event对象。在Lambda 测试模式下运行时,ID 和其他 POST 属性在事件对象的根中传递。但是,当使用lambda-proxy模式时,集成会重新映射事件对象层次结构,并且 POST 属性会被 JSON 字符串化到body属性中。

一旦你了解它在做什么,这只是一个怪癖。也就是说,在依次测试 Lambda 和 API Gateway 时,相同的有效负载失败是很奇怪的。


推荐阅读