こんにちは、Michaelです。
今回は、AWS LambdaでDynamoDBのテーブルからデータを読み取ります。
今回の構成
Lambdaが起動されると、入力されたデータの「client_id」を基にDynamoDBのテーブル「device_properties」に登録されたデータを参照します。
IAMロールの設定
LambdaからDynamoDBにデータを登録するため、以下のポリシーを作成し、Lambdaに適用するIAMロールにアタッチします。このポリシーでは、テーブルの「読み取り」、「書き込み」、「更新」の最小限のポリシーのみ許可しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DescribeTable" ], "Effect": "Allow", "Resource": "*" } ] } |
コード
コードは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# coding: utf-8 # ①ライブラリのimport import datetime import decimal import boto3 from boto3.dynamodb.conditions import Key, Attr # ②Functionのロードをログに出力 print('Loading function') # ③DynamoDBオブジェクトを取得 dynamodb = boto3.resource('dynamodb') # ④Lambdaのメイン関数 def lambda_handler(event, context): # ⑤テーブル名を指定 table_name = "device_properties" # ⑥参照データのキーの設定 partition_key = {"client_id": event["client_id"]} # ⑦DynamoDBテーブルのオブジェクトを取得 dynamotable = dynamodb.Table(table_name) # ⑧データの読み取り res = dynamotable.get_item(Key=partition_key) item = res["Item"] return item |
コードの説明
コードの内容は以下の通りです。
項番 | 項目 | 内容 |
① | ライブラリのimport | 処理に必要なライブラリを指定してインポートします。 |
② | Functionのロードをログに出力 | Lambdaのコードがロードされたことが分かるようにログにメッセージを出力します。 |
③ | DynamoDBオブジェクトを取得 | DynamoDBと接続できるようにインスタンスを生成します。 |
④ | Lambdaのメイン関数 | トリガーにより実行される関数。 |
⑤ | テーブル名を指定 | データを参照するテーブル名を設定します。 |
⑥ | 参照データのキーの設定 | 読み取るデータのキーを設定します。 |
⑦ | DynamoDBテーブルのオブジェクトを取得 | DynamoDBのテーブルを操作できるようにインスタンスを生成します。 |
⑧ | データの読み取り | DynamoDBのテーブルからデータを読み取ります。レスポンスのデータには、メタデータが含まれるため、「Item」のキーを指定してデータを抽出します。 |
実行結果
テスト実行にあたり、テストイベントとして以下のJSONデータを登録しておきます。
1 2 3 |
{ "client_id": "device012" } |
DynamoDBの「device_properties」テーブルには以下のようなデータが入っています。参照する「device012」には千葉県庁の所在地が格納されています。
Lambdaのコードエディタの上部にある[テスト]をクリックすると、テスト実行されます。
テストを実行すると、テストイベントのデータに対応するデータを読み取れていることが確認できました。
まとめ
DynamoDBはKVSのため、テーブルとキーを指定するだけで簡単にデータを読み込みこむことができます。RDSのようにコネクションの確立やSELECT文のようなクエリが必要ないため、データストアとの連携がとてもシンプルに構成できます。
今回は以上となります。次回もお楽しみに!