【问题标题】:Error while inserting Item into DynamoBD with SQS-Lambda integration使用 SQS-Lambda 集成将项目插入 DynamoBD 时出错
【发布时间】:2020-08-22 11:11:22
【问题描述】:

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

消息 -> SQS -> Lambda -> DynamoDB

我将 TableName 和 Item 作为输入传递给 DynamoDB put 方法。但是,CloudWatch Logs 说缺少 TableName 和 Item 参数。下面是代码sn-ps和截图。

我确实花了很多时间,但无法解决问题。有人可以帮我吗?

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 的错误消息

【问题讨论】:

  • 看来是对的,可以添加你的dynamoDb表的定义吗?您是否添加了 transaction-id 作为 key?
  • @desoss 我创建了一个 'user-transaction' 表,其中 'transaction-id' 作为分区键,但我认为它与表结构没有任何关系。它在验证失败并且没有命中数据库。如果没有表格,我也会遇到同样的错误。

标签: node.js amazon-web-services aws-lambda amazon-dynamodb amazon-sqs


【解决方案1】:

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

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

参考文献

[1]https://stackoverflow.com/a/56925968/10473469

【讨论】:

  • Martin - 添加 JSON.parse() 帮助了我 - 谢谢
【解决方案2】:

我检查了我自己的一个类似的 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) {...

这是我的控制台在放置之前的输出

{ 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' } } }

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

【讨论】:

  • 删除属性名称周围的引号没有帮助。我也可以在调用 Lambda 函数时发送消息。当我通过将消息放入队列来调用 Lambda 时,事情就开始中断了。你试过了吗?
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 2017-07-01
  • 2021-07-22
  • 2015-11-02
相关资源
最近更新 更多