Ошибка при вставке элемента в DynamoBD с интеграцией SQS-Lambda - PullRequest
0 голосов
/ 07 мая 2020

Я создал лямбда-функцию, которая помещает элемент в таблицу DynamoDB, используя Node.js 10.x. Функция Lambda была интегрирована с SQS Queue через триггер. Когда я помещаю сообщение в очередь, Lambda вызывается, но выдает ошибку при вставке элемента в таблицу DynamoDB.

Сообщение -> SQS -> Lambda -> DynamoDB

I я передаю TableName и Item в качестве входных данных для метода put DynamoDB. Но в журналах CloudWatch говорится, что параметры TableName и Item отсутствуют. Ниже приведены фрагменты кода и снимки экрана.

Я потратил много времени, но не смог решить эту проблему. Может ли кто-нибудь мне помочь?

Лямбда-код

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

enter image description here

Ответы [ 2 ]

3 голосов
/ 10 мая 2020

Я не пробовал это, но мне кажется, что отсутствует JSON.parse() вокруг переменной тела в вызове динамо-вставки. не анализируется автоматически. Следующий ответ, который я нашел на SO, отлично резюмирует это: [1].

Ссылки

[1] { ссылка }

0 голосов
/ 07 мая 2020

Я проверил аналогичную собственную лямбду, которая успешно выполняет команду 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' } } }

Я заметил, что есть имена моих атрибутов не заключаются в кавычки, может это проблема?

...