データ蓄積先の選定
前回までの記事で、電源、センサーとりつけ、AWS IoT へのデータ送信を行ってきました。
M5Stack Toughと土壌水分量センサーでプランター菜園をモニタリングするVol.1(電源編)
M5Stack Toughと土壌水分量センサーでプランター菜園をモニタリングするVol.2(センサー取り付け編)
M5Stack Toughと土壌水分量センサーでプランター菜園をモニタリングするVol.3(AWS IoT 編)
とりあえずAWS IoT にはデータが届いている状態なのでルールエンジンを用いてデータの蓄積を考えていくことになります。データ蓄積する際は、データベースを使ったりAmazon S3などのオブジェクトストレージを使ったりするケースが多いかと思います。最近だと、何でも貯めることができてデータ型とか気にしなくてよいオブジェクトストレージにとりあえず放り込み、その後どうするか考えるという蓄積系と分析系を分離(疎結合)にするデータレイクの考え方を取るケースも増えてきていると思います。今回は、リアルタイムに近い形で可視化したかったので、データレイクの形は取らず、データベースに直接投入する方法を選びました。
データベースを選定するにあたって、MySQLやPostgreSQLなどの一般的なRDBMSを使う方法もありますし、AWSだとDynamoDBやTimestreamといったNoSQL型のデータベースもあります。IoTの分野では時系列でデータを取り扱うことになるため、TimestreamやInfluxDBなどの時系列データベースが得意としています。
今回はAWSで組んでいることもあり、また、データベースのインフラのお世話や細かいことを考えたくなかったので、AWSの Amazon Timestream で構築することにしてみます。
Timestream の準備
データベースの構築は、AWS のマネジメントコンソールで Timestream の画面に移動したのち、標準データベース を選んで名前をつけ、データベースを作成 をクリックするだけです。
テーブルは、作成したデータベースを選択してテーブル名を付け、パーティションキーにこだわりが無ければデフォルトパーティショニングを選択してテーブルを作成をクリックします。
DBの細かいこと考えるのが面倒くさいと思ってしまう私にはちょうど良い感じです。
AWS IoT から Timestream にデータを投入する
AWS IoTに届いたメッセージをTimestreamのテーブルに投入する場合、IoT のマネジメントコンソールで 管理 - メッセージのルーティング - ルールにてルールの作成をクリックします。
適当なルール名を設定し、次へをクリックします。
今回は、iotfarm-m5t というトピックに対してメッセージを送っているため、SQL ステートメントに下記のクエリを設定します
SELECT * FROM 'iotfarm-m5t'
設定したら、次へをクリックします
ルールアクションには下記のように設定していきます。
設定項目 | 設定値 |
---|---|
アクション1 | Timestream table |
データベース名 | demo-db |
テーブル名 | demo-table |
ディメンション名 | deviceid |
ディメンション値 | ${deviceid} |
タイムスタンプ値-オプション | ${sampletime} |
タイムスタンプの単位 | MILLISECONDS |
IAMロール | Timestreamへのアクセス権限を持つIAMロール |
データベース名とテーブル名は上記で作成したものを利用します。
ディメンション名は時系列レコードの属性を表します。今回のようなデバイス名や、工場名などを付けてセンサの値を識別できるようにします。ディメンション値に ${deviceid} と記述することで、IoTのメッセージの deviceid に紐づく値を読み取ってくれるようになります。同様にメッセージに含んでおいたタイムスタンプ値は ${sampletime} で取得することが出来ます。今回タイムスタンプはミリ秒単位で送っているため、MILLISECONDS を選択します。
{
"deviceid":"m5t01", <-- ${deviceid} で読み取れる
"moisture":516,
"temperature":28.3,
"sampletime":"1688779815000" <-- ${sampletime} で読み取れる
}
下記のように設定出来たら、次へをクリックします。
確認画面で設定を確認したのち、作成をクリックします。
Timestream への書き込みを確認
IoTでデータを受信している状態でTimestream のマネジメントコンソールにてクエリエディタを開きます。
Choose a database to query で作成したデータベースを選択し、下に表示されたテーブル名の横の3つの点をクリックしデータをプレビューをクリックします。
クエリエディタに自動的にSQLクエリが記述されるので、実行 をクリックします。実行した結果、下記のように表示されれば成功です。
表示されない場合はIoTのルールアクションでエラーアクションを設定し、CloudWatch Logs などにログを出力できるようにしておくことでトラブルシューティングに役立ちます。
ここまでのまとめ
IoTのデータはS3やRDBMSに蓄積するだけではなく、Timestreamのような時系列データベースに保管する方法もあります。サーバーレス型のデータベースを利用することで手軽に時系列データを保管してクエリで探索がかけられるようになるので、IoT系でのデータ蓄積の選択肢として入れていけそうです。
次回
Amazon Managed Grafana を活用してTimestreamに保管されたデータの可視化をしてみたいと思います。