AWS+NodeJSでサーバレスな環境構築⑤


はじめに

前回ではAPI Gateway(REST API)+Lambda(NodeJS)+DynamoDBの組み合わせてCRUDを作りました。今回はS3+Lambda+DynamoDBを組み合わせていきます。S3をトリガー(S3バケットにJsonファイルがアップロードされた段階)にし、Lambda(NodeJS)で取得したJson形式のデータをDynamoDBテーブルに保存します。
表現等がわかりにくければ、容赦無くご指摘いただければ幸いです。
※サーバレスでピンとこない方はこちらをご覧ください。

DynamoDBを作成

DynamoDBダッシュボード>テーブルの作成

概要タブのARNはインラインポリシー作成時に使いますので、コピーしときます

IAMでロールとインラインポリシーの作成

IAMダッシュボード>ロール>ロールの作成

AWSサービス>Lambda>次のステップ

AWSLambdaExecute選択>次のステップ

次のステップ

ロール名入力>ロールの作成

インラインポリシーの作成はここを参考にしてください。
ちなみに今回はDynamoDBテーブルに書込みをするだけなので、アクション(権限)はPutItemだけでOKです。

S3バケットの作成

S3ダッシュボード>バケットを作成する>バケット名を入力>作成

Lambda関数の作成と設定

  • Lambdaダッシュボード>関数の作成
  • 関数名入力>既存ロール選択(上記で作成したロール)

  • トリガーを追加>S3選択>バケット名選択(上記で作成したやつ)

  • イベントタイプ選択>サフィックス入力>追加

    ソース

indedx.js
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内容

JsonDataFromS3.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を組み合わせる予定です。