Help us understand the problem. What is going on with this article?

LambdaからDynamoDBの読み書きを行う

More than 1 year has passed since last update.

はじめに

先日、アマゾンで開催された「初めてのサーバーレス」ハンズオンの内容から LambdaからDynamoDB読み書きする部分をまとめておきます。Alexaスキルを作る上でも、DynamoDBの扱いを覚えたいと前々から思っていたので、有り難かったです。

LambdaからDynamoDBに書き込む

DynamoDBにテーブルを作成する

・ まずDynamoDBに予めテーブルを作成しておきます。
・ DynamoDB管理画面にアクセスします。
・ 適当な名前でテーブルを作成します。(名前は仮に[hogehoge_dynamodb_table]とします)
・ プライマリーキーにTrackと入力し、データ種類は文字列を選択します。
・ ソートキーの追加をチェックします。
・ Timestampと入力し、データ種類は数値を選択します。
・ 右下の作成をクリックします。

Lambdaで書き込み専用の関数を作る

・ Lambda管理画面にアクセスします。
・ 関数の作成から設計図を選択し、[simple-mobile-backend]を選択します。
・ 適当な関数名を入力します。
・ 新しいロールを作ります。(名前は例えば[lambda_dynamo]とします)
・ ポリシーテンプレートは[シンプルなマイクロサービスのアクセス権限]を選択します。
・ 右下の関数の作成をクリックします。
・ index.jsの中身を以下に置き換えて保存します。
注意:データ項目に、DynamoDBでテーブル作成時に定義したTrack、Timestamp以外に、Comment、Nameが加わっています。

console.log('Loading function');
var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();
exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));
  // TODO: テーブル名を確認してください
  var tableName = "hogehoge_dynamodb_table";
  var item = {
    Track: event.track,
    Comment: event.comment,
    Name: event.name,
    Timestamp: Number(Math.floor(Date.now() / 1000))
  };
  var params = {
    TableName: tableName,
    Item: item
    };
  dynamo.putItem(params, context.done);
};

書き込みテストを行う

・ テストイベントの設定ページに移ります。
・ [新しいテストイベントの作成]を選び、イベントテンプレート[Mobile Backend]を選択し、適当なイベント名を記入します。
・ イベント名の下の枠に書き込むデータを記入します。ここには自動で値の決まるTimestamp以外の全項目のデータが含まれてることが必要です。

{
  "track": "Test",
  "comment": "Hello AWS Lambda",
  "name": "xxxx"
}

・ 右下の作成ボタンを押し、Lambda関数のページに戻り、右上のテストをクリックします。
・ Execution Resultsで、Status:Succeededと表示されれば成功です。
・ DynamoDBに移り、作成したTable[hogehoge_dynamodb_table]、項目を選び、データが格納されていることを確認します。

LambdaからDynamoDBを読みに行く

ロールに読み込み権限を追加する

・ Lambdaで書き込み関数を作った際に設定したロール[lambda_dynamo]に読み込み権限を追加します。
・ IAM管理画面でロール[lambda_dynamo]選択します。
・ MicroserviceExecutionRoleを含むポリシーを選択します。
・ JSONタブを選択してActionに”dynamodb:Query”を追加します。
・ ポリシーの確認を押します。
・ 変更の保存を押します。

    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:ap-northeast-1:999999999999:table/*"
        }

Lambdaで読み込み専用の関数を作る

・ Lambda管理画面にアクセスします。
・ 関数の作成から設計図を選択し、書込み関数作成時と同じ[simple-mobile-backend]を選択します。
・ 適当な関数名を入力します。
・ 既存ロール[serice-role/lambda_dynamo]を選択します。
・ 右下の関数の作成をクリックします。
・index.jsの中身を以下に置き換えて保存します。

console.log('Loading function');
var doc = require('dynamodb-doc');
var docClient = new doc.DynamoDB();
exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));
  var params = {};
  // TODO: テーブル名を確認してください
  params.TableName = "hogehoge_dynamodb_table";
  params.KeyConditions = [docClient.Condition("Track", "EQ", event.track),
  docClient.Condition("Timestamp", "GT", 2000)];
  params.Limit = 40;
  params.ScanIndexForward = false;
  console.log(params);
  docClient.query(params, context.done);
};

読み込みテストを行う

・ テストイベントの設定ページに移ります。
・ [新しいテストイベントの作成]を選び、イベントテンプレート[Mobile Backend]を選択し、適当なイベント名を記入します。
・ イベント名の下の枠に読み込みたいデータの条件を記入します。
注意:条件にプライマリーキー”track”を含めることは必須です。

{
  "track": "Test",
  "comment": "Hello AWS Lambda",
  "name": "xxxx"
}

・ 右下の作成ボタンを押し、Lambda関数のページに戻り、右上のテストをクリックします。
・ Execution Resultsで、Status:Succeededと表示され、下枠に抽出結果が表示されれば成功です。

あとがき

ハンズオンではAPI Gateway接続もやったので、自分で再現できたら記事にする予定です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away