0
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-07

はじめに

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

DynamoDBを作成

DynamoDBダッシュボード>テーブルの作成
スクリーンショット 2020-01-07 21.10.06.png

概要タブのARNはインラインポリシー作成時に使いますので、コピーしときます
スクリーンショット 2020-01-07 21.11.36.png

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

IAMダッシュボード>ロール>ロールの作成
スクリーンショット 2020-01-07 20.00.58.png

AWSサービス>Lambda>次のステップ
スクリーンショット 2020-01-07 20.01.32.png

AWSLambdaExecute選択>次のステップ
スクリーンショット 2020-01-07 20.02.57.png

次のステップ
スクリーンショット 2020-01-07 20.03.12.png

ロール名入力>ロールの作成
スクリーンショット 2020-01-07 20.04.14.png

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

S3バケットの作成

S3ダッシュボード>バケットを作成する>バケット名を入力>作成
スクリーンショット 2020-01-07 20.13.35.png

Lambda関数の作成と設定

  • Lambdaダッシュボード>関数の作成
  • 関数名入力>既存ロール選択(上記で作成したロール)
    スクリーンショット 2020-01-07 20.29.54.png

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

  • イベントタイプ選択>サフィックス入力>追加
    スクリーンショット 2020-01-07 20.33.45.png
    ソース

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ダッシュボード>今回使うバケットを選択>ファイル追加>アップロード
スクリーンショット 2020-01-07 21.49.15.png
使用した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ファイル通りの内容になっていることを確認
スクリーンショット 2020-01-07 21.55.54.png

最後に
次はサーバレスでRESTful ウェブサービスを作っていきたいと思っています。
Lambda(NodeJS)+API GateWay+DynamoDB+Cognitoを組み合わせる予定です。

0
1
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
0
1