AWS Lambda函数从API网关返回错误,但在直接调用时则不会

时间:2016-09-19 15:24:58

标签: amazon-web-services aws-lambda aws-api-gateway

我有一个简单的Lambda函数,它将项目写入DynamoDB表。 username是分区键,createDateTime是sort键。

从Lambda本身调用此函数会成功将项插入表中。但是,当通过API网关调用时,我收到以下错误

loc[0]['address_components'][0]['long_name'] 
# or loc[0]['address_components'][1]['long_name'] for second nested dict

我无法理解为什么我的代码在本地调用时有效,但在通过API网关调用时则无法理解?代码如下:

{
  "errorMessage": "Error putting order into dynamodb: MultipleValidationErrors: There were 14 validation errors:\n* InvalidParameterType: Expected params.Item['createDateTime'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '1' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '2' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '3' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '4' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '5' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '6' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '7' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '8' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '9' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '10' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '11' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '12' found in params.Item['createDateTime']"
}

2 个答案:

答案 0 :(得分:1)

您的地图模板中很可能存在问题。我建议您打开API的CloudWatch日志记录进行故障排除。

请参阅https://rpgreen.wordpress.com/2016/08/30/easy-api-gatewaylambda-serverless-api-loggingdebugging/

答案 1 :(得分:-1)

我也有类似的经验,并学到了以下内容:当独立测试Lambda函数(使用AWS Lambda控制台的内置“测试”功能)时,Event参数是 object ;使用内置的API网关测试功能时,事件是 string 。我通过比较两种不同方案的CloudWatch日志并注意到这两种情况下的输入看起来都相似,但用于构成格式正确的JSON的所有换行字符在事件字符串中均产生了'\ n'个字符,我的Lambda函数(使用JSON.parse()用Node.js编写)无法解释。因此,我在防弹功能中添加了以下代码,它似乎运行良好(请注意,我的代码正在检查Event内部的“ body”对象,但如果需要,可以在整个Event对象上使用):

  var body;

  switch(typeof(event.body)) {
    case "string":
      //strips all-types of linebreak and carriage return characters from the event.body string
      var str = event.body.replace(/[\r\n]+/gm,"");
      body = JSON.parse(str);
      break;
    case "object":
      body = event.body;
      break;
    default:
      throw("invalid input for event.body");
  }