【AWS IoTルールの基本 その4】メッセージをDynamoDBに保存する①

Pocket

こんにちは、Michaelです。
今回は、「AWS IoTルールの基本」の第3回として、メッセージをDynamoDBに保存するルール設定を紹介します。

AWS IoTからDynamoDBへのアクション

AWS IoTでDynamoDBにメッセージを保存する場合、以下の2種類のアクションを選択することができます。

アクション 内容
DynamoDB アクション 設定したパーティションキー、ソートキーに対し、メッセージを1つのカラムに保存
DynamoDBv2 アクション

メッセージのJSONをキーごとに別々のカラムに保存 (※メッセージはJSON形式に限定されます)

「DynamoDB アクション」と「DynamoDBv2 アクション」では、許容するメッセージ形式やDynamoDBへの保存形式が異なるため、環境、構成に合わせてアクションを選択する必要があります。
今回は、メッセージを1つのカラムに保存する「DynamoDB アクション」を使ってDyanmoDBにメッセージを保存してみます。

今回の構成

AWS IoTのトピック「test/pub」にPublishされたメッセージを、DynamoDBのテーブル「IoT_Device_Data」に保存します。
DynamoDB アクションでは、JSON、文字列のいずれのメッセージにも対応できるため、メッセージとしてJSONまたはCSVをPublishした場合の挙動を確認します

メッセージソースの設定

メッセージソースには以下のAWS IoT SQLクエリでメッセージをパススルーで出力するように設定します。

ルールアクションの設定

アクションとして「DynamoDB テーブルにメッセージを挿入する」を選択します。


設定内容は格納するDynamoDBテーブルとハッシュキー値、レンジキー値となります。テーブルを選択すると自動的にハッシュキー、レンジキーとそのタイプは入力されます。
ハッシュキー値とレンジキーの値には、AWS IoT SQLの関数「${clientid()}」、「${timestamp()}」を使ってClientIdと受信時刻を参照するように設定します。
「この列にメッセージデータを書き込む」は書き込むカラム名を指定できます。指定しない場合にはカラム名として「payload」が設定されます。

実行結果

MQTT.fxを送信デバイスとしてテストを実行してみます。
ClientIdに「device001」、Publish先トピックに「test/pub」を設定し、以下のようなセンサーデータをJSONとCSVの2形式でのメッセージでPublishします。

– JSON

– CSV

JSONメッセージをPublishすると、DynamoDBのテーブルにデータが書き込まれ、メッセージがpayload列に、DynamoDB JSONの形式に変換されて書き込まれていることが確認できました。DynamoDB JSON はDynamoDBのSDKから参照すると元の形式に再変換されるため、実用上は問題ありません。


CSVメッセージをPublishすると、メッセージは「payload_raw」という列に書き込まれました。仕様上、非JSONメッセージはバイナリに変換されて書き込まれ、コンソールではBase64エンコードされたものが表示されるようです。SDKから参照した場合もバイナリ型となるため、利用する場合には注意が必要です。

まとめ

DynamoDBもS3と同様にAWS IoTでメッセージログを保存するデータストアとしてよく使われます。DynamoDBであればクエリやスキャンの操作でまとまったデータを取り出すことができるため、S3に比べて容易にデータ参照ができます。
今回の方法は、特に文字列形式のメッセージを扱う場合には有用なルールアクションですが、Lambda等の既存システム連携の関係でDynamoDBのスキーマが決まっている場合にはDynamoDBv2アクションのほうが扱いやすいケースもあります。
次回は、JSONメッセージをキーごとに別カラムに保存するDynamoDBv2アクションの設定を紹介します。
お楽しみに!