AWS IoT CoreからAmazon Timestreamへの連携時に任意のタイムスタンプを指定する

2020.10.06

ども、ゲストの大瀧です。先日リリースされた AWS のマネージド時系列データベースサービス Amazon Timestream は皆さんお使いでしょうか?
早速IoT プラットフォーム SORACOMとの連携例をブログに書いたので、良かったらこちらも合わせてどうぞ!(宣伝)

さて、本ブログでは、IoT(Internet of Thing)のテレメトリーデータを扱うAWS IoT CoreからTimestreamにデータを送るときのタイムスタンプについて、ユーザーが任意のタイプスタンプを自分で指定する方法を紹介します。

AWS管理コンソールには設定項目が無い

はい、そうなんです。↓のスクリーンショットはAWS IoT CoreからTimestreamに転送する設定画面(AWS IoT Coreのルールアクション)なのですが、タイムスタンプの項目がありません。

管理コンソールから設定すると、AWS IoT Coreのメッセージ転送時の時刻が設定されます。ただ、IoT向けの場合、システムの用途目的によってはイベントの起きた時刻が非常に重要な要素で、特に他の機器やシステムと連携、同調させるときにタイムスタンプの厳密な突き合わせを求められることが多いのです。

AWS CLIでやる

任意のタイムスタンプを設定するためには、APIおよびCLIを利用できます。例えば↑と同等の項目で任意のタイプスタンプ設定をCLIで行う場合は、以下のルールドキュメントを rule.json ファイルとして作成します。

{
    "sql": "SELECT payloads.temp, payloads.humi, payloads.x, payloads.y, payloads.z, payloads.lon, payloads.lat, payloads.bat FROM 'data/#'",
    "ruleDisabled": false,
    "awsIotSqlVersion": "2016-03-23",
    "actions": [
        {
            "timestream": {
                "roleArn": "arn:aws:iam::<AWSアカウントID>:role/my-iot-role",
                "databaseName": "soracomSampleDB",
                "tableName": "gpsMultiunit",
                "dimensions": [
                    {
                        "name": "deviceId",
                        "value": "${imsi}"
                    }
                ],
                "timestamp": {
                	"value": "${timestamp}",
                	"unit": "MILLISECONDS"
                }
            }
        }
    ]
}

actions.timestream.timestamp がタイムスタンプの項目です。 value をAWS IoT SQLのステートメント(imsi キーの要素)参照にすることで、IoTデバイスのデータからタイムスタンプを拾えます。 unit で単位を指定しますが、UNIXタイムスタンプにする必要があるので、デバイスから送るデータがその形式でない場合はtime_to_epoch関数などでごにょごにょできるか検討しましょう。

で、AWS CLI で rule.json ファイルを読み込みルール作成を操作します。

aws iot create-topic-rule --region us-west-2 --rule-name rule1 --topic-rule-payload file://rule.json

これでOKです。Timestreamでクエリしてみると。。。

きちんとタイムスタンプとして入ってますね。

まとめ

AWS IoT CoreからAmazon Timestreamへの連携時に任意のタイムスタンプを指定する方法として、AWS CLIの例をご紹介しました。TimestreamにIoTのデータをドンドン溜めて分析していきましょう!

参考URL