LoginSignup
1
5

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