####はじめに
先日、アマゾンで開催された**「初めてのサーバーレス」ハンズオン**の内容から 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接続もやったので、自分で再現できたら記事にする予定です。