将项目从DynamoDB流复制到另一个表的最简单方法是什么?

时间:2017-05-04 19:51:14

标签: amazon-dynamodb amazon-dynamodb-streams

我有两个dynamoDB表,table1和table2,在table1上启用了一个流。两者都有一个名为" id"的字符串键。我还有一个lambda函数,它从流中读取对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);
             }
         });
      });            
    }

使用此功能会出现此错误:

  

一个或多个参数值无效:键ID的类型不匹配   预期:S实际:M

这条信息很容易解释,但我很困惑,因为我使用的id应该是一个字符串。另外,是否有一种简单的方法可以按原样插入整个项目?

1 个答案:

答案 0 :(得分:1)

问题是AWS文档客户端需要标准的JSON对象,而不是直接来自DB的带注释的AttributeValues。我使用dynamodb-data-types来解包数据,一切正常。具体来说,我添加了

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

然后将参数更改为

const params = {
    TableName: table2,
    Key: {
      id: id,
    },
    Item: attr.unwrap(input),
 };