今回やること
今回は、Lambda を使用して DynamoDB へ書込みを行います。
本来はデバイスから受信したデータをそのまま(または加工して)DynamoDB に書き込むのですが、今回はテスト的に定型文を DynamoDB に書き込むところにとどめます。
DynamoDB って何よ?
以下のサイトが参考になります。
端的にいうと以下の感じみたいです。
- NoSQL
- ACID 特性は無く、結果整合性となる(DB の仕様としてトランザクションに対応していない)
- だから、読み込み時はもしかしたら最新のデータでない場合もある
- スケーラビリティが高いらしい
- ストレージに容量制限がないとのこと
- スケーラビリティなどを含めてメンテナンスフリー
- HTTPベースのAPIで操作する
- 書込量や読込量で課金される
平たく言うと、KVS 的な感じでしょうか。
ただの KVS ではなく、ある程度テーブル構造を保持する KVS っぽいです。
主キーに似た概念もあります。(パーティションキーとソートキー)
DynamoDB にテーブルを作成する
テスト用に、以下のテーブルを作成します。
id | time | birth | name |
---|---|---|---|
1 | 書込み時間 | 1985-08-21 | Yamada |
テスト用なので山田さんだけです。
ただし、書込み時間の属性があるので、何度でもインサートできます。(レコードが重複しないから)
さっそくテーブルを作ります。
テーブル作成の段階ではパーティションキーとソートキーのみを指定します。
他の属性はデータ追加時に動的に作られるっぽいです。
テーブルにデータを追記する Lambda の作成
Lambda の画面に行き、以下のように新しい関数を作っていきます。
ちなみにこのままでは実行ロールが適切に設定されていないので、DynamoDB に書込みを実行しようとしたらエラーになります。
後で設定が必要です。
関数コード
関数コードに以下を書きました。(こちらのページのソースを参考にさせてもらいました)
# 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 = "my_first_test"
# 実行時間の記録
time_utc = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
try:
# DynamoDBテーブルのオブジェクトを取得
dynamotable = dynamodb.Table(table_name)
# DynamoDBへのデータ登録
res = dynamotable.put_item(
Item = {
"id" : "1",
"time" : time_utc,
"name" : "Yamada",
"birth" : "1985-08-21"
}
)
print("Succeeded.")
return
except Exception as e:
print("Failed.")
print(e)
return
関数コード欄に上記のコードを書き、忘れずに「保存」ボタンを押します。
実行テスト
記述した関数が正しく動作して DynamoDB にデータが書き込めるかをテストします。
「テスト」ボタンを押し、適当にイベント名をつけます。(jsonの中身も、今回は使用しないので適当でいいです)
ここで再度「テスト」ボタンを押すと・・・
エラーになります。
「アクセスできません」とのことなので、実行ロールを適切に設定してやる必要があります。
以下の通り、「実行ロール」でポリシーテンプレートで「テストハーネスのアクセス権」を選びます。
これでもう一度「テスト」すると、成功しました。
DynamoDB 側に戻って、テーブルを参照してみます。
ちゃんとデータが挿入されていました!
IoT Core を使ってもうちょっとテスト
新しいことをやるわけではないですが、前回作成した AWS IoT Core のルールを利用して、
「mockmock からデータを送信すると、DynamoDB にデータが追記される」
というのをやってみます。
といっても、トリガーの追加で AWS IoT を選択し、
トリガーの設定で前回作成したルールを選択するだけです。
これで、mockmock で送信をすると、 DynamoDB にデータが追記されました!
今回は以上です。
次はいよいよ本格的に、デバイス(といってもmockmockだけど)から送られたメッセージのペイロードを使用して、データを DynamoDB に格納するというのをやってみようと思います。
コメント