使用 SQS-Lambda 集成将项目插入 DynamoDB 时出错

Error while inserting Item into DynamoBD with SQS-Lambda integration

我创建了一个 Lambda 函数,它使用 Node.js 10.x 将项目放入 DynamoDB table。 Lambda 函数已通过触发器与 SQS 队列集成。当我在队列中放入一条消息时,Lambda 被调用,但在 DynamoDB table.

中插入一个项目时抛出错误

消息 -> SQS -> Lambda -> DynamoDB

我将 TableName 和 Item 作为输入传递给 DynamoDB put 方法。但是,CloudWatch Logs 表示缺少 TableName 和 Item 参数。以下是代码片段和屏幕截图。

我确实花了很多时间,但没能解决这个问题。有人可以帮助我吗?

Lambda 代码

console.log('Loading function');

var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, context, callback) {

    console.log('Received event:', JSON.stringify(event, null, 2));
    event.Records.forEach(record => {
      const { body } = record;
      console.log("Input to DynamoAPI :", body);
      dynamo.put(body, callback);
    });

  return {};
}

进入队列的消息

{
  "TableName": "user-transaction",
  "Item" : {
    "transaction-id": 1
  }
}

来自 CloudWatch 的错误消息

我检查了我自己的一个类似的 lambda,它成功地做了一个 put。

var params = {
                TableName: dynamoUserTableName,
                Item:{
                    "userId" : { S: event.request.userAttributes.sub},
                    "email" : { S: event.request.userAttributes.email},
                    "userName" : { S: event.userName},
                    "createdDate" : { S: createdDate },
                    "version" : { N: '1'}
                }
            };
        console.log(params);
        dynamodb.putItem(params, function(err, data) {...

这是我的控制台在 put

之前的输出
{ TableName: 'Users',
  Item:
   { userId: { S: 'xxxxxxxxxxxxxxxxxxxxxxxxx' },
     email: { S: 'test@example.co.uk' },
     userName: { S: 'xxxxxxxxxxxxxxxxxxxxxxxx' },
     createdDate: { S: '2020-05-02T07:49:23.478' },
     version: { N: '1' } } }

我注意到我的属性名称周围没有引号,这可能是个问题?

我没有尝试过,但在我看来,dynamo put 调用中的 body 变量周围缺少 JSON.parse()

据我所知,SQS 将正文字符串化并且不会自动解析。 我在 SO 上找到的以下答案完美地总结了这一点:[1].

参考资料

[1]