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

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

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)