AWS IoT Core を使ってみる その4 ~Lambda で DynamoDB に書込み~

クラウド

今回やること

今回は、Lambda を使用して DynamoDB へ書込みを行います。

本来はデバイスから受信したデータをそのまま(または加工して)DynamoDB に書き込むのですが、今回はテスト的に定型文を DynamoDB に書き込むところにとどめます。

DynamoDB って何よ?

以下のサイトが参考になります。

AWS再入門 Amazon DynamoDB 編 | DevelopersIO
【AWS】今更ながらDynamoDB入門 - Qiita
この記事は自分のブログからの転載です。NoSQLデータベースであるDynamoDBに今更ながら入門してみようと思います。こちらの記事を参考に手を動かしながら、感覚をつかもうと思います。AWS再…

端的にいうと以下の感じみたいです。

  • 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 に格納するというのをやってみようと思います。

コメント

タイトルとURLをコピーしました