Какой самый простой способ скопировать элемент из потока DynamoDB в другую таблицу?

У меня есть две таблицы DynamoDB, table1 и table2, с включенным потоком на table1. Оба имеют строковый ключ с именем "id". У меня также есть лямбда-функция, которая считывает вставки из таблицы table1 из потока и отражает их в table2, если они соответствуют определенным критериям. Вот мой код JS (синтаксис ES6), который не совсем работает:

const dynamoDb = new AWS.DynamoDB.DocumentClient();

function mirrorInserts(event, context, callback) {
  event.Records.forEach((record) => {
    if (record.eventName != 'INSERT') {
      console.log('Ignored ' + record.eventName + ' stream event.');
      return;
    }

    var input = record.dynamodb.NewImage;
    var id = input.id.S
    if (myCondition(input)( {
        const params = {
            TableName: table2,
            Key: {
              id: id,
            },
            Item: input,
         };
         dynamoDb.put(createParams, (result, error) => {
             if (error) {
                 console.error(error);
             }
         });
      });            
    }

Использование этой функции дает эту ошибку:

Одно или несколько значений параметров недопустимы: ожидаемое несоответствие типа идентификатора ключа: фактическое S: M

Сообщение достаточно легко интерпретировать, но оно меня смущает, поскольку используемый мной идентификатор должен быть строкой. Кроме того, есть ли простой способ просто вставить весь элемент, как есть?

1 ответ

Проблема заключалась в том, что клиент документов AWS ожидает стандартные объекты JSON, а не аннотированные значения AttributeValues, которые поступают непосредственно из БД. Я использовал DynamodBat-типы данных, чтобы развернуть данные, и все работало. В частности, я добавил

const attr = require('dynamodb-data-types').AttributeValue;

а затем изменил параметры на

const params = {
    TableName: table2,
    Key: {
      id: id,
    },
    Item: attr.unwrap(input),
 };
Другие вопросы по тегам