#概要
S3へjsonファイルがアップロードされるとLambdaがそのファイルの中身を解析して、DynamoDBへデータを挿入します。
#jsonファイルの構成
data
キーに配列があり、配列の要素はオブジェクトとなっています。
{
"data": [
{
"item1": "sample data1",
"item2": 123,
"item3": "test data1"
},
{
"item1": "sample data2",
"item2": 1234,
"item3": "test data2"
},
]
}
#主な流れ
- S3へファイルがアップロードされるとLambdaが起動
- アップロードされたファイルの中身を取得
-
data
キーから配列を取得 - 配列を
forEach
で各要素をDynamoDBへPUTするためのパラメーター化 - さらにパラメーター化したオブジェクトを配列に格納
- その配列を
batchWrite
するためにパラメーター化 -
batchWrite
メソッドで一気にDynamoDBへ書き込み
#Lambdaのコード
indes.js
const S3 = require('aws-sdk/clients/s3');
const s3 = new S3({ apiVersion: '2006-03-01', region: 'ap-northeast-1' });
const s3Params = {};
const dynamodb = require('aws-sdk/clients/dynamodb');
const docClient = new dynamodb.DocumentClient({"convertEmptyValues":true}); //convertEmptyValuesをtrueにすると空の値がtrueになる。(多分他の値にしたほうが良い)
const TABLE_NAME = process.env.DYNAMO_TABLE_NAME; // 環境変数から取得する
exports.handler = async (event) => {
console.log('Received event:', JSON.stringify(event, null, 2));
const key = event.Records[0].s3.object.key;
const bucket = event.Records[0].s3.bucket.name;
console.log(bucket, key);
s3Params.Bucket = bucket;
s3Params.Key = key;
try {
const data = await s3.getObject(s3Params).promise();
const jsonBody = data.Body.toString(); // toString()しないとBuffer形式になる
const orders = JSON.parse(jsonBody).data;
const requestArry = [];
orders.forEach( order => {
const requestObj = {
PutRequest: {
Item: order
}
};
requestArry.push(requestObj);
});
const dynamoBatchPrams = {
RequestItems: {
[TABLE_NAME]: requestArry
}
};
await docClient.batchWrite(dynamoBatchPrams).promise();
console.log('Success DynamoDB PutRequest!');
} catch (error) {
console.log(error);
}
};
#Lambdaの設定
##環境変数
DynamoDBのテーブルを作成したらLambdaの環境変数へテーブル名を入力してください。
##Lambdaの実行ロール
デフォルトの設定で作成後、IAMコンソールでDynamoDB FullAccess
のポリシーを追加してください。
##トリガーの追加
S3を選択して、バケットとイベントタイプを選択して、トリガーを追加してください。
#DynamoDBのテーブル
DynamoDBのテーブルは名前とプライマリーキーを設定して作成してください。
#最後に
複数のレコードを書き込む際はPUTではなく、batchWrite
メソッドが良いと思われます。