こんにちは、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クエリでメッセージをパススルーで出力するように設定します。
1 |
SELECT * FROM 'test/pub' |
ルールアクションの設定
アクションとして「DynamoDB テーブルにメッセージを挿入する」を選択します。
設定内容は格納するDynamoDBテーブルとハッシュキー値、レンジキー値となります。テーブルを選択すると自動的にハッシュキー、レンジキーとそのタイプは入力されます。
ハッシュキー値とレンジキーの値には、AWS IoT SQLの関数「${clientid()}」、「${timestamp()}」を使ってClientIdと受信時刻を参照するように設定します。
「この列にメッセージデータを書き込む」は書き込むカラム名を指定できます。指定しない場合にはカラム名として「payload」が設定されます。
実行結果
MQTT.fxを送信デバイスとしてテストを実行してみます。
ClientIdに「device001」、Publish先トピックに「test/pub」を設定し、以下のようなセンサーデータをJSONとCSVの2形式でのメッセージでPublishします。
– JSON
1 2 3 4 5 |
{ "temperature": 26.3, "humidity": 58, "pressure": 994.2 } |
– CSV
1 |
26.3,58,994.2 |
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アクションの設定を紹介します。
お楽しみに!