AWS IoT Coreで受け取ったデバイスデータをAmazon DynamoDBに保存してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
IoTデバイスデータを保存したい
おのやんです。
みなさん、IoTデバイスから送信されるデータをデータベースに保存したいと思ったことはありませんか?私はあります。
AWSには、IoTデバイスをAWSと接続して簡単にデータがやりとりできるAWS IoT Core(以下、IoT Core)というサービスがあります。IoT Coreを経由すれば、IoTデバイスから送信されたデバイスデータをAWSの他のサービスに受け渡すことができます。
今回は、IoTデバイスからIoT Coreに送信されたデータをAmazon DynamoDB(以下、DynamoDB)に保存する機会がありましたので、そのやり方などをまとめていきたいと思います。
構成
今回はこちらのシンプルな構成で進めます。IoT Coreに接続したデバイスからIoT Core に向けてデバイスデータが送信されてきます。このデータをIoT Coreのルールでクエリし、DymanoDBに格納します。

デバイスデータの構造
IoTデバイスから送信されるデータは、今回このような構造になっています。各キーは、検証用のためチュートリアルで紹介されているデータを流用させてもらいます。
{
"TEMPERATURE": 28,
"HUMIDITY": 80,
"BAROMETER": 1013,
}
また、IoTデバイスのトピックに関しては、device-0001/pubの形を取っています。ですので、IoTデバイスのデータをIoT Core側で受け取ると、このようなメッセージが表示されます。

この状態から、以下のJSONデータに整形してDynamoDBに格納したいと思います。
{
"deviceId": "device-0001",
"timestamp": "1722238795"
"temperature": 28,
"humidity": 80,
"barometer": 1013,
}
DynamoDBテーブルの作成
まずはデバイスデータを格納するDynamoDBテーブルを作成します。各項目の値は以下の通りです。テール部設定の部分は、今回は特別な要件は必要ないのでデフォルト設定で進めます
| 項目 | 値 | 備考 |
|---|---|---|
| テーブル名 | aws-test-device-data | |
| パーティションキー | deviceId | 文字列型 |
| ソートキー | timestamp | 数値型 |
| テーブル設定 | デフォルト設定 |

このように、作成したDynamoDBテーブルがアクティブになればOKです。

IoT Coreルールの作成
次に、IoT Coreで受け取ったデバイスデータをDynamoDB用にクエリするIoT Coreルールを作成します。

最初の画面では、以下の項目を設定します。
| 項目 | 値 | 備考 |
|---|---|---|
| ルール名 | aws_test_device_data_query_rule | -(ハイフン)が使えないため、_(アンダースコア)を使用 |
| 説明 | IoT Coreで受信したデバイスデータを DynamoDBに保存する |

次に、SQL設定画面でSQL文を設定します。
今回、デバイスIDはデーバイスデータではなくトピックから取得できるため、IoT Core組み込み関数のtopic()を使ってdeviceIdとしてクエリしています。たとえば、device-0001/sub/pubのトピック名だった場合、topic(1)でdevice-0001、topic(2)でsubが取得できます。
またDynamoDBで将来TTLを設定したい時に、TTLで指定するtimestampデータの単位を秒に合わせる必要があるので、ミリ秒で取得しているtimestampをFLOOR(timestamp() / 1000)で秒に変換しています。
SELECT
topic(1) AS deviceId,
timestamp() AS timestamp,
TEMPERATURE AS temperature,
HUMIDITY AS humidity,
BAROMETER AS barometer,
FROM
'device-0001/pub'

次の画面では、SQLでクエリしたデータを使って発火させるアクションを設定します。今回はDynamoDBのテーブルにデータを入れたいため、DynamoDBv2を選択します。

また、IoT CoreからDynamoDBテーブルへの書き込み処理をIAMで許可する必要があるので、「新しいロールを作成」から作成します。

動作確認
それでは、実際にデバイスデータがDynamoDBに送信されているか確認しましょう。
IoT Coreのナビゲーションバーに「MQTT テストクライアント」の項目があるので、こちらをクリックします。ここでトピックのフィルターにdevice-0001/pub、メッセージペイロードにさきほどのデバイスデータを入力して、「発行」ボタンをクリックします。入力したメッセージペイロードは変わらないので、何回か「発行ボタン」をクリックすると、同様のデータが下部にどんどん表示されます。

DynamoDBテーブル内のデータは、DynamoDB画面のナビゲーションバーにある「項目を探索」から確認できます。さきほどのメッセージペイロードで何回か発行したデータが、すべてDynamoDBテーブルに保存されていることが確認できます。

IoT Coreで簡単にデータをやり取りできる
一般的に複雑な処理になりがちなIoTデバイスデータの処理ですが、IoT Coreを通すことで AWS上で簡単にデータのやり取りができます。
IoT Core経由でDynamoDBにデータを保存する際に、本記事が参考になれば幸いです。では!







