AWS IoTをつかってSORACOM GPSマルチユニットからAmazon Timestreamへ温湿度データを送信してみた

記事タイトルとURLをコピーする

こんにちは

先日、Amazon TimestreamがGAされましたね。

Amazon Timestreamはフルマネージド時系列データベースです。これまでAWSのマネージドな時系列データベースがなかったわけですが、DyanmoDBやAurora/RDSで代用したり、EC2で時系列データベースをたてたりしていました。もしくはS3に保存、、、でしょうか?DynamoDBやAuroraはまだしもEC2は運用負荷もそれなりなので、待っていた方々は多いのではないでしょうか。

さて、時系列データベースのユースケースはなんでしょうか。キャッチ―なのはIoTでしょう。というわけで今回はIoTデバイスからTimestreamにデータを突っ込んでみます。

デバイス

デバイスは手持ちのSORACOM GPSマルチユニットを利用します。プライベートで全然違う用途で購入したものですが、そちらが進められておらず、今回の検証に利用します。このGPSマルチユニットはその名の通りGPSで位置情報を取得できますが、その他にも温湿度も取得できます。加速度センサーもついているようですが、私は利用してません。今回は温湿度を取得してTimestreamへ送信します。

https://soracom.jp/products/kit/gps_multiunit/soracom.jp

構成

さて構成ですが以下のようにしました。SORACOM FunnelではAmazon Kinesisへも送信可能ですが、今回はデバイスが1つしかなく1分ごとの送信とそこまでデータの量が多くないのでAWS IoTを利用しました。SORACOM FunkでLambdaからTimestreamに投入することも考えられますが、コードを書かなくていいのでこちらの方法を選択しました。ちなみにKinesisを利用した場合、Timestreamへのデータの投入はLambdaかKinesis Data Analytics for Apache Flinkかを利用します。

  1. GPSマルチユニットからSORACOM Funnelを利用して、AWS IoTのMQTTトピックへ送信。
  2. AWS IoT CoreからAmazon Timestreamへ送信。
    f:id:swx-mine:20201124182925p:plain
    構成図

設定

1. SORACOM Funnel AWS IoT アダプター

SORACOM FunnelにはAWS IoT アダプターが用意されており容易に連携できます。ドキュメントに載っているので設定の説明は割愛します。トピック名は soracom としました。注意点としては、Amazon Timestreamが 東京リージョンでは未提供(2020/11時点)なので提供されているリージョンのエンドポイントを利用する必要があるということです。

https://dev.soracom.io/jp/start/funnel_aws_iot/dev.soracom.io

f:id:swx-mine:20201124184131p:plain
設定例

2. Amazon Timestream

Amazon Timestreamを作成します。

まずはデータベースを作成します。

f:id:swx-mine:20201124185457p:plain
作成をクリック

今回は Standard で作成します。サンプルも用意されているので気軽にTimestreamを試したいならそちらを使うのもGood。

f:id:swx-mine:20201124185620p:plain
サンプルも選べる

続いてテーブルを作成します。

f:id:swx-mine:20201124185926p:plain
テーブルを作成する

テーブル名の他に Memory store retensionMagnetic store retension という設定項目があります。詳しくは別のブログで解説しますが、それぞれの store でどれくらいの期間保存するかを設定します。ここの項目はクエリ速度や利用料金に関わるので実運用する際はちゃんと考えてください。ちなみに Magnetic store retension をすぎたデータは削除されるようです。

f:id:swx-mine:20201124190253p:plain
それぞれ保存期間を設定する

3. AWS IoT

さてAWS IoTの設定です。

3.1. テスト

↑で設定したトピックへデータが送信されいてるか確認します。データが送信されていなければ、マルチユニットの電源が入っているか、SORACOM側設定に問題ないか確認しましょう。

f:id:swx-mine:20201124184519p:plain
テスト画面で「トピックへのサブスクライブ」をクリック

3.2. ルール

さて、データがトピックに飛んできているのが確認できたら、ルールを設定してTimestreamへ投入します。

f:id:swx-mine:20201124184937p:plain
ルール一覧から「作成」をクリック

クエリステートメントは以下としました。マルチユニットから送信された temp (温度) と humi (湿度) を受け取ります。

SELECT payloads.temp AS temperature, payloads.humi AS humidity FROM 'soracom'

アクションを追加します。 Timestreamテーブルにメッセージを書き込む というのを選択します。

f:id:swx-mine:20201124190803p:plain
Timestream テーブルにメッセージを書き込む

今回、アクションの設定は以下のようにしました。 データベース・テーブルは前述の手順で作成したものを指定。ディメンションとはTimestreamに保存されるレコードのメタデータのようなものです。 ismiとはSIMカードの識別番号のようなものです。デバイスを識別するのにこれをつかってみるためにディメンションへ含めます。 timestamp はマルチユニットから送信されたUNIXタイムスタンプです。これもついでにディメンションへ含めます。

f:id:swx-mine:20201124191630p:plain
ディメンションを設定する

タイムスタンプは指定しなくてもokです。IAMロールは ロールの作成 から作成できます。

f:id:swx-mine:20201124191855p:plain
ロールがなければ作成

確認

さて、ルールの設定が完了し、Amazon Timestreamテーブル内にデータがたまるまで少し待ちます。

たまったかなと思ったらTimestreamのQuery Editorでサンプルのクエリを投げてみます。

f:id:swx-mine:20201124192230p:plain
サンプルクエリを投げてみる

今回の場合だとこんな感じで返ってきました。

f:id:swx-mine:20201124192355p:plain
こんな感じで返る

まとめ

今回はSORACOMとAWS IoTを利用してAmazon TImestreamへデータを投入してみました。Amazon Timestreamと他のAWSサービスの連携についてはドキュメントにも紹介されているのでいろいろと遊べそうです。今回ためたデータを使って可視化をしてもおもしろいかも。

Yusuke Mine(書いた記事を見る)

I get drunk but it's not enough 'Cause the morning comes and you're not my baby.