1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

S3にCSVファイルがアップロードされるとLambdaがDynamoDBへデータを挿入します

Posted at

#概要
S3へjsonファイルがアップロードされるとLambdaがそのファイルの中身を解析して、DynamoDBへデータを挿入します。

#jsonファイルの構成
dataキーに配列があり、配列の要素はオブジェクトとなっています。

{
    "data": [
        {
            "item1": "sample data1",
            "item2": 123,
            "item3": "test data1"
        },
        {
            "item1": "sample data2",
            "item2": 1234,
            "item3": "test data2"
        },
    ]
}

#主な流れ

  1. S3へファイルがアップロードされるとLambdaが起動
  2. アップロードされたファイルの中身を取得
  3. dataキーから配列を取得
  4. 配列をforEachで各要素をDynamoDBへPUTするためのパラメーター化
  5. さらにパラメーター化したオブジェクトを配列に格納
  6. その配列をbatchWriteするためにパラメーター化
  7. 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メソッドが良いと思われます。

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?