はじめに
前回ではAPI Gateway(REST API)+Lambda(NodeJS)+DynamoDBの組み合わせてCRUDを作りました。今回はS3+Lambda+DynamoDBを組み合わせていきます。S3をトリガー(S3バケットにJsonファイルがアップロードされた段階)にし、Lambda(NodeJS)で取得したJson形式のデータをDynamoDBテーブルに保存します。
表現等がわかりにくければ、容赦無くご指摘いただければ幸いです。
※サーバレスでピンとこない方はこちらをご覧ください。
DynamoDBを作成
概要タブのARNはインラインポリシー作成時に使いますので、コピーしときます
IAMでロールとインラインポリシーの作成
インラインポリシーの作成はここを参考にしてください。
ちなみに今回はDynamoDBテーブルに書込みをするだけなので、アクション(権限)はPutItemだけでOKです。
S3バケットの作成
S3ダッシュボード>バケットを作成する>バケット名を入力>作成
Lambda関数の作成と設定
- Lambdaダッシュボード>関数の作成
- 関数名入力>既存ロール選択(上記で作成したロール)

- トリガーを追加>S3選択>バケット名選択(上記で作成したやつ)
- イベントタイプ選択>サフィックス入力>追加

const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const documentClient = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event) => {
const { name } = event.Records[0].s3.bucket;
const { key } = event.Records[0].s3.object;
const getObjectParams = {
Bucket: name,
Key: key
};
try {
const s3Data = await s3.getObject(getObjectParams).promise();
const usersStr = s3Data.Body.toString();
const usersJSON = JSON.parse(usersStr);
console.log(`Jsonファイル取得結果 ::: ${usersStr}`);
//取得した文のJson結果をDynamoDBテーブルに追加する
await Promise.all(usersJSON.map(async user => {
const { id, firstname, lastname } = user;
const putParams = {
TableName: "JsonDataFromS3",
Item: {
id: id,
firstname: firstname,
lastname: lastname
}
};
await documentClient.put(putParams).promise();
}));
} catch(err) {
console.log(err);
}
};
結果の確認
S3ダッシュボード>今回使うバケットを選択>ファイル追加>アップロード
使用したJson内容
[
{
"id": "5ac6be6b-8064-4159-9de6-89178a9f8a54",
"firstname": "Matt",
"lastname":"Hansen"
},
{
"id": "4b912da3-66aa-45c1-a87f-9f79a256e570",
"firstname": "Brad",
"lastname":"Lunsford"
},
{
"id": "8ef0c795-42d4-439d-962e-75afe957e069",
"firstname": "Jeremy",
"lastname":"Kane"
}
]
DynamoDBテーブルの中身がS3にアップロードしたJsonファイル通りの内容になっていることを確認
最後に
次はサーバレスでRESTful ウェブサービスを作っていきたいと思っています。
Lambda(NodeJS)+API GateWay+DynamoDB+Cognitoを組み合わせる予定です。