IoT Coreに来たデータをAmazon Timestreamに保存してみる

デバイスがIoT Coreに送ったデータについて、時系列特化データベースであるAmazon Timestreamに保存してみました。
2020.10.01

IoTにおいて、次のような要件(ニーズ)は多いと思います。

  • デバイスから来たデータを時系列に取得したい
  • デバイス毎、時間毎、といった検索をしたい
  • リアルタイムなデータ分析を行いたい

これまでは、DynamoDBに保存してquery()で取得するなどなど頑張っていましたが、Amazon Timestreamを使うと簡単にできるようになります。SQLが使えますからね!

本記事では、IoT Coreで受け取ったデータをAmazon Timestreamに保存してみました。

仕様を決める

ここでは、IoTデバイスとして河川にある水位センサーを想定します。 水位センサーは一定期間毎にIoT Coreにデータを送信しています。

  • データ詳細:下記のJSON
    • 水位(メートル):waterLevel
    • 時刻(ミリ秒):timestamp
{
    "waterLevel": 10,
    "timestamp": 1601258079088
}
  • MQTTトピック:sample/<デバイスID>/waterLevel

Amazon Timestreamの準備をする

データベースを作成する

Standard databaseを選択します。

  • データベース名:IoT-Sample-Database

テーブルを作成する

さきほど作成したデータベースにテーブルを追加します。

  • テーブル名:water-level-table
  • メモリストア保持:1日
  • 磁気ストア保持:7日

この時点ではデータ0件

クエリ実行してみると、結果は0件です。

SELECT * FROM "IoT-Sample-Database"."water-level-table"
ORDER BY time DESC LIMIT 10

IoT Ruleアクションを作成する

ルールクエリステートメント

SELECT waterLevel FROM 'sample/+/waterLevel'

アクション

「Timestreaテーブルにメッセージを書き込む」があるので選択します。

データベースとテーブルは、さきほど作成したものを選択します。

ディメンションはKey-Valueの関係です。

ディメンション名 ディメンション値
deviceId ${topic(2)}
timestamp ${timestamp}

最後にIAMロールを作成します。

IoT Coreにデータを送信する

IoT Coreのテスト画面を使ってデータを送信します。

  • MQTTトピック:sample/w0001/waterLevel
{
    "waterLevel": 10,
    "timestamp": 1601529491031
}

Amazon Timestreamのデータを確認する

シンプルなデータ取得

さきほど送信したデータを取得できました!

SELECT * FROM "IoT-Sample-Database"."water-level-table"
ORDER BY time DESC LIMIT 10

複数のデータを追加で送信し、再度データ取得するとバッチリ増えました!

デバイスIDを指定してデータ取得

デバイスIDを指定してデータ取得もできますね。

SELECT * FROM "IoT-Sample-Database"."water-level-table"
WHERE deviceId = 'w0001'
ORDER BY time DESC LIMIT 10

デバイスIDと時刻を指定してデータ取得

特定のデバイスについて、StartとEndの時刻を指定して、データ取得してみました。

  • 1601529480000 : 2020-10-01T14:18:00
  • 1601529720610 : 2020-10-01T14:22:00
SELECT * FROM "IoT-Sample-Database"."water-level-table"
WHERE deviceId = 'w0001' AND timestamp BETWEEN '1601529480000' AND '1601529720610'
ORDER BY time DESC LIMIT 10

さいごに

お手軽にできました。データ検索でSQLが使えるのは強いですね……!

参考