AWSのLambdaでS3にアップロードされたJSONファイルを読み込んで
その内容をDynamoDBへ書き込むプログラムを作成しています。
JSONファイルには複数のデータがありこれを全てDynamoDBへ書き込みます。
以下が作成したソースコードとJSONファイルの内容です。
JavaScript
1console.log('Loading function ...'); 2 3var aws = require('aws-sdk'); 4var s3 = new aws.S3({ apiVersion: '2006-03-01' }); 5var dynamo = new aws.DynamoDB({region: 'ap-northeast-1'}); 6 7//読み込んだJSONをDynamoDBのパラメータ形式に変換 8function getItemList(table) { 9 var items = []; 10 for (var i = 0; i < table.length; i++) { 11 var item = {}; 12 var record = table[i]; 13 console.log(record); 14 for (var column in record) { 15 item[column] = {'S': record[column]}; 16 } 17 items[i] = item; 18 } 19 return items; 20} 21 22exports.handler = function(event, context) { 23 //console.log('Received event:', JSON.stringify(event, null, 2)); 24 //S3からJSONファイルを読み込む 25 var bucket = event.Records[0].s3.bucket.name; 26 var key = event.Records[0].s3.object.key; 27 console.log('Bucket:', bucket, ' Key:', key); 28 s3.getObject({Bucket: bucket, Key: key}, function(err, data) { 29 if (err) { 30 console.log(err); 31 context.fail('S3 object get error!! ' + err.code + ":" + err.message); 32 } 33 else { 34 //テーブル名 35 var tablename = 'test'; 36 37 //読み込んだJSONをDynamoDBのパラメータ形式に変換 38 var content = JSON.parse(String(data.Body)); 39 console.log('Table:', tablename, ' Count:', content[tablename].length); 40 var items = getItemList(content[tablename]); 41 for (var i = 0; i < items.length; i++) { 42 var params = { 43 TableName: tablename, 44 Item: items[i] 45 }; 46 //DynamoDBへ書き込む 47 dynamo.putItem(params, function (err, data) { 48 if (err) { 49 console.log(err); 50 context.fail('DynamoDB put error!! ' + err.code + ':' + err.message); 51 } 52 else { 53 console.log('data uploaded successfully.'); 54 //★1)doneを呼び出すタイミングは? 55 //context.done(); 56 } 57 }); //★2)ワーニング: Don't make functions within a loop. 58 } 59 } 60 }); 61}
JSON
1{ 2 "test": [ 3 { 4 "id": "1", 5 "key": "000001", 6 "data1": "abcdefg" 7 }, 8 { 9 "id": "2", 10 "key": "000002", 11 "data1": "abcdefg", 12 "data2": "ABCDEFG" 13 }, 14 { 15 "id": "3", 16 "key": "000003", 17 "data1": "abcdefg", 18 "data2": "ABCDEFG", 19 "data3": "1234567" 20 } 21 ] 22}
動作するのは確認できたのですが、わからない点が2つあります。
★1) DynamoDBへ書き込む際、複数回putItem()をコールしたときcontext.done()をコールするタイミングがわからない。
★2) putItem()のfunctionでワーニングが発生してしまいます。functionはループ内に作成してはいけないようですがどのように修正したらよいでしょうか?
context.done()はコールしなくてもよいのか?全ての書き込みが終了したことを判断する方法が別にあるのでしょうか?
functionは別に分けてみましたがcontextが参照できなくなってしまいました。
BatchWriteItem()で一度にまとめて書き込めることは分かったのですが
今回のように引数にfunctionをもつ関数を複数回コールしたいときどのようにプログラムするのがいいのでしょうか?
同様のプログラムを作成された方がいましたら
教えていただけると助かります。
追記)
★2はコードをテキストファイルにコピーして貼り付けなおしたところワーニングは消えました。
これでいいのかわかりませんが・・・。
引き続き★1について何かわかることがあれば教えて下さい。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/30 07:28
2016/03/31 02:01