質問編集履歴

1 タイトルを修正、コードをわかりやすく修正

akabei

akabei score 21

2016/03/29 21:47  投稿

DynamoDBに複数の項目を追加する方法について
DynamoDBに複数の項目を追加するプログラムでcontext.done()をコールするタイミングがわかりません
AWSのLambdaでS3にアップロードされたJSONファイルを読み込んで
その内容をDynamoDBへ書き込むプログラムを作成しています。
JSONファイルには複数のデータがありこれを全てDynamoDBへ書き込みます。
以下が作成したソースコードとJSONファイルの内容です。
```JavaScript
console.log('Loading function ...');
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var dynamo = new aws.DynamoDB({region: 'ap-northeast-1'});
//読み込んだJSONをDynamoDBのパラメータ形式に変換
function getItemList(table) {
   var items = [];
   for (var i = 0; i < table.length; i++) {
       var item = {};
       var record = table[i];
       console.log(record);
       for (var column in record) {
           item[column] = {'S': record[column]};
       }
       items[i] = item;
   }
   return items;
}
exports.handler = function(event, context) {
   //console.log('Received event:', JSON.stringify(event, null, 2));
   //S3からJSONファイルを読み込む
   var bucket = event.Records[0].s3.bucket.name;
   var key = event.Records[0].s3.object.key;
   console.log("Bucket:", bucket, "Key:", key);
   console.log('Bucket:', bucket, ' Key:', key);
   s3.getObject({Bucket: bucket, Key: key}, function(err, data) {
       if (err) {
           console.log(err);
           context.fail("S3 object get error!! " + err.code + ":" + err.message);
           context.fail('S3 object get error!! ' + err.code + ":" + err.message);
       }
       else {
           //console.log("Body:", String(data.Body));
       //テーブル名
           var tablename = 'test';
           //読み込んだJSONをDynamoDBのパラメータ形式に変換
           var content = JSON.parse(String(data.Body));
           var items = [];
           for (var table in content) {
               tablename = table;
               console.log('Table: ', tablename, ' Count: ', content[table].length);
               items = getItemList(content[table]);
           }
           console.log('Table:', tablename, ' Count:', content[tablename].length);
           var items = getItemList(content[tablename]);
           for (var i = 0; i < items.length; i++) {
               //console.log(items[i]);  
               var params = {
                   TableName: tablename,
                   Item: items[i]
               };
               //DynamoDBへ書き込む
               dynamo.putItem(params, function (err, data) {
                   if (err) {
                       console.log(err);
                       context.fail("DynamoDB put error!! " + err.code + ":" + err.message);
                       context.fail('DynamoDB put error!! ' + err.code + ':' + err.message);
                   }
                   else {
                       console.log("data uploaded successfully.", data);
                       console.log('data uploaded successfully.');
                       //★1)doneを呼び出すタイミングは?
                       //context.done();
                   }
               }); //★2)ワーニング: Don't make functions within a loop.
           }
       }
   });
}
```
```JSON
{
   "test": [
       {
           "id": "1",
           "key": "000001",
           "data1": "abcdefg"
       },
       {
           "id": "2",
           "key": "000002",
           "data1": "abcdefg",
           "data2": "ABCDEFG"
       },
       {
           "id": "3",
           "key": "000003",
           "data1": "abcdefg",
           "data2": "ABCDEFG",
           "data3": "1234567"
       }
   ]
}
```
動作するのは確認できたのですが
わからないところが2点あります。
動作するのは確認できたのですが、わからない点が2つあります。
★1) DynamoDBへ書き込む際、複数回putItem()をコールしたときcontext.done()をコールするタイミングがわからない。
★2) putItem()のfunctionでワーニングが発生してしまいます。functionはループ内に作成してはいけないようですがどのように修正したらよいでしょうか?
context.done()はコールしなくてもよいのか?全ての書き込みが終了したことを判断する方法が別にあるのでしょうか?
functionは別に分けてみましたがcontextが参照できなくなってしまいました。
BatchWriteItem()で一度にまとめて書き込めることは分かったのですが
今回のように引数にfunctionをもつ関数を複数回コールしたいときどのようにプログラムしたらよいのでしょうか?
今回のように引数にfunctionをもつ関数を複数回コールしたいときどのようにプログラムするのがいいのでしょうか?
同様のプログラムを作成された方がいましたら
教えていただけると助かります。
教えていただけると助かります。
追記)
★2はコードをテキストファイルにコピーして貼り付けなおしたところワーニングは消えました。
これでいいのかわかりませんが・・・。
引き続き★1について何かわかることがあれば教えて下さい。
  • JavaScript

    27937 questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • AWS(Amazon Web Services)

    3741 questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る