1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS IoT CoreからTimestreamにルーティングする際、デバイスで付与した日時をタイムスタンプにするIoT Ruleの作り方

Posted at

はじめに

Timesteramが東京リージョンで使えるようになりました!
IoTのデータを保存する際に、デバイスで付与した日時をタイムスタンプとして使用するためのIoTルールの設定の方法を記載します。

前提

  • デバイス~AWS IoT Coreは接続済み
  • Timestreamのテーブルは作成済み
  • IoTルールからTimestreamに書き込むためのIAM Roleは作成済み

サービスにつけた名前など

  • Timestreamデータベース名:ts-test
  • Timestreamテーブル名:ts-table
  • メモリストアの保存時間:3時間
    とりあえず3時間にした。

image.png

この記事では、IoT Ruleの作成方法を記載します。

IoT CoreのTopicに送信するデータ

日時は日本時間で、タイムゾーンはついていないものとします。

{
  "timestamp": "2022-08-04 17:50:00.111",
  "device_id": "device1",
  "condition": 10
}

と、ここで・・・

マネジメントコンソールからIoT Ruleを作ろうとすると、ルールアクションにTimestreamが出てこない:cry::cry::cry:
デベロッパーガイドなどに書いてあるので、IoT RuleからTimestreamに連携出来ないはずは無い。マネージメントコンソールが対応していないのでしょう。仕方ないので、CLIで作るとします:cry:

  2022/8/3 AWSにフィードバックは出しておいたので、そのうち対応してもらえるとは思います。
  今のところ、CLIで作成した後に、編集も出来ません。

手順

payload.jsonを作って、CLIでIoTルールを作成する。

IoT ルール作成

  • IoT ルール名:iot_timestream とする。

CLI

aws iot create-topic-rule --rule-name iot_timestream --topic-rule-payload file://payload.json
payload.json
{
    "sql": "SELECT * FROM 'topic/timestream'",
    "ruleDisabled": false,
    "awsIotSqlVersion": "2016-03-23",
    "actions": [
        {
            "timestream": {
                "roleArn": "arn:aws:iam::<アカウント>:role/<IAMロール>",
                "databaseName": "ts-test",
                "tableName": "ts-table",
                "dimensions": [
                    {
                        "name": "device_id",
                        "value": "${device_id}"
                    }
                ],
                "timestamp": {
                  "value": "${time_to_epoch(timestamp,'yyyy-MM-dd HH:mm:ss.SSS') - 32400000}",
                  "unit": "MILLISECONDS"
                }
            }
        }
    ],
    "errorAction": {
      "cloudwatchLogs": {
        "roleArn": "arn:aws:iam::<アカウント>:role/<IAMロール>",
        "logGroupName": "<CloudWatchのロググループ>"
      }
    }
}

IoT ルール削除のCLI

aws iot delete-topic-rule --rule-name iot_timestream

説明

  • IoTの"timestamp"をタイムスタンプにする方法
    actions.timestream.timestampにエポック日時を設定します。
    (エポック日時、UNIX timeは、1970年1月1日からの経過時間)
    デベロッパーガイドに、「time_to_epoch() 関数を使用して、メッセージペイロードで渡される日付または時刻の値から有効なタイムスタンプを作成できます。」とあります。
    関数を、actions.timestream.timestamp.valueに書きます。
    関数を使用するので、"sql"に書きたくなりますが、それだとうまくいきません。

  • タイムゾーンの変換
    変換前のデータ「例:"2022-08-04 17:50:00.111"」にタイムゾーンなどもなく、UTC日時として認識されてしまいます。ここでは、日本時間は+9H、つまり、9時間のミリ秒(32400000)を引き算して変換しています。。
    ここで、-の前後にスペースを入れる必要があります。

"timestamp": {
  "value": "${time_to_epoch(timestamp,'yyyy-MM-dd HH:mm:ss.SSS') - 32400000}",
  "unit": "MILLISECONDS"
}
  • Timestreamが受け取ってくれる時間の範囲
    格納できる時間の範囲があります。
    "2022-08-04 17:50:00.111"(日本時間)をキーにする場合、
     
    ここで、メモリストアを3時間にしています。
     
    "2022-08-04 08:50:31"(標準日時)にデータを格納すると、
    2022-08-04 05:45:31〜2022-08-04 09:25:31が格納可能な範囲のようです。
    3時間5分前から35分後まで
     
    範囲外のデータを格納しようとしたときは、以下のエラーが出ました。
    2022-08-04T08:50:31.407+00:00 The record timestamp is outside the time range [2022-08-04T05:45:31.270Z, 2022-08-04T09:25:31.270Z) of the memory store.

結果

IoTトピックに送信

image.png

テーブルに格納された結果

image.png

おわりに

Timestreamを使いこなしていきたい!

参考

  • デベロッパーガイド

  • IoT Coreのtime_to_epoch()関数

  • AWS CLI Command Reference
    aws iot create-topic-rule

  • IOT Core rules to map timestamp to timestream

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?