Edited at

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


はじめに

先日、アマゾンで開催された「初めてのサーバーレス」ハンズオンの内容から 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]、項目を選び、データが格納されていることを確認します。


Lamdaから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接続もやったので、自分で再現できたら記事にする予定です。