2017-05-04 18 views
0

私は2つのdynamoDBテーブルtable1とtable2を持っていて、ストリームはtable1で有効になっています。どちらも "id"という文字列キーを持っています。私はまた、ストリームからtable1への挿入を読み取り、それらが特定の基準を満たす場合にはtable2にミラーリングするラムダ関数を持っています。ここではかなりのない仕事をして、私のJSコード(ES6構文は)です:DynamoDBストリームから別のテーブルにアイテムをコピーする最も簡単な方法は何ですか?

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); 
      } 
     }); 
     });    
    } 

この機能を使用すると、このエラーを与える:

One or more parameter values were invalid: Type mismatch for key id expected: S actual: M

メッセージを解釈するのは簡単ですが、私は混乱しています私が使用しているidは文字列でなければならないからです。また、アイテム全体をそのまま挿入する簡単な方法はありますか?

答えて

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), 
}; 
へのparamsを変更しました
関連する問題