IoT機器で温湿度を測定してクラウドでグラフ化 DynamoDB設定編 (その3)
Contents
温湿度推移のグラフ化
RaspberryPi Zeroと温湿度モジュール(DHT22)を使用して温湿度を指定した間隔(分)で測定してクラウド(AWS IoT Core)にデータをアップロードしてグラフ化するまでの3回目。
今回の記事の範囲はAWS DynamoDBの設定とする。
システム概要図
システム概要図と今回の記事の範囲は以下の通り。
主な実現したい機能は以下の通り。
- 指定した間隔(分)で温湿度を測定する
- 指定した間隔(分)でデータをサーバーにアップロードする
- アップロードしたデータは集計、グラフ表示する
- 温湿度のしきい値(上限、下限)を超えた場合はアラートを発信する
- しきい値は場所毎に異なる値を指定出来るようにする
- 設定情報はGoogle Sheetで一括指定して設定値を変更したら各端末に速やかに反映させる
- それぞれの端末は遠隔で再起動等の操作が出来るようにする
- 測定端末は複数台設置するが基本的に室内とする(屋外には設置しない)
- 100V電源を確保できる場所とする(バッテリー駆動も一応試してみる)
- 初期コスト、ランニングコストともに出来るだけローコストで実現する
DynamoDB
DynamoDBへデータを保存する
温湿度の通常データはElasticsearch Serviceに送ってkibanaでヴィジュアル化する同時にDynamoDBにも送信する仕様とする。
全てElasticsearch Serviceに保存するとデータが蓄積されてきた時にkibanaの表示のパフォーマンスに影響が出そうなのでElasticsearch Serviceには直近1ヶ月程度の保存として長期のデータ保存はDynamoDBを使うことにする。
DynamoDBはNoSQLデータベースサービスでリレーショナルデータベースの様にSQLは使えないがプライマリーキーによるデータの指定やソートキーやフィルターによる範囲指定等でデータを取り出すことができる。
またキャパシティ5(1秒間に5回の書き込み)程度だと1ヶ月で3.32ドル程度のローコストで利用できるのもありがたい。
DynamoDBの設定
DynamoDBでテーブルの作成を行う。
AWSにログインをしてサービスからDynamoDBを選択する。
テーブルの作成
”ダッシュボード”から「テーブルの作成」ボタンをクリックする。
- テーブル名:temp_humi_record
- プライマリキー:tempkeyindex
- ソートキーの追加:チェックする
- ソートキー:clientid
- デフォルト設定の使用のチェックを外す
セカンダリインデックスやキャパシティなど
デフォルト設定の使用のチェックを外すと既定の設定が展開されるので、
- セカンダリインデックス:未設定(後から追加で設定する事ができる)
- 読み込み/書き込みキャパシティモード:プロビジョンド
を選択する。
キャパシティ
キャパシティはDynamoDBの利用料金に影響する。
ざっくり言うと書き込みは1ユニット=1秒間に1回の書き込み、読み込みは1ユニット=1秒間に2回の読み込みが可能なので使用状況に応じて適切な値を設定する。
最初は大きめの値を設定してCloudWatchで状況を見ながら小さくしていくのが常套手段らしい。
画面ショットでは5(デフォルト値)だが読み書き共に2に変更した所、見積もり料金は1.33ドル/月になった。
保管時の暗号化
保管時の暗号化はデフォルトのままで「作成」ボタンをクリックする。
よりセキュアなKMS(AWS Key Management Service)を使用する場合は別途料金が発生する。
tep_humi_recordテーブルが作成された。
IoT Core ACT
ルールの作成
続いてAWS IoT CoreのACTにルールの作成を行い、温湿度の通常データがIoT CoreにPublish(Edge端末からAWS IoT Coreへのデータの送信)された際に先ほど作成したDynamoDBのテーブルにデータ送信するように設定を行う。
IoT Coreのメニューより”ACT”、”ルール”、「作成」ボタンをクリックする。
名前と説明
- 名前:to_temp_dynamo
- 説明:temp_himi DynamoDB(ここは日本語が使えない)
を入力する。
ルールクエリステートメント
ルールクエリステートメントにはTOPICの抽出条件を指定する。
通常データ(温湿度情報)の抽出を行いたいので以下のselect文を指定する。
SELECT * FROM 'dt/TempAndHumi/#'
「アクションの追加」ボタンをクリックする。
DynamoDBにメッセージ送信
IoT Coreから送信可能なサービスの一覧が表示されるので”データベーステーブル(DynamoDBv2)の複数列にメッセージを分割する”を選択する。
JSON形式の1項目がテーブルの1項目に対応してメッセージ送信が行われる。
ひとつ上の”DynamoDBテーブルにメッセージを送信する”を選択するとDynamoDBの一つの項目にJSONデータの全ての項目を格納するレイアウトになる。
下にスクロールして「アクションの設定」ボタンをクリックする。
アクションの設定
テーブル名で先ほど作成した”temp_humi_record”をプルダウンメニューより選択する。
「ロールの作成」をクリックする。
ロールの作成
- 名前:dynamo_temp_humi_role
「ロールの作成」ボタンをクリックする。
アクションの追加
自動で作成されたポリシーがアタッチされたロールが設定されるので「アクションの追加」ボタンをクリックする。
ルールの作成
先程の画面に戻ってアクションが追加されているので「ルールの作成」ボタンをクリックする。
エラーアクションは今回は設定していないが、例えばDynamoDBへのメッセージの送信が失敗した場合にエラーメールを飛ばしたい時は「アクションの追加」でAmazon SNS(Simple Notification Service)などを指定する。
ルールの有効化
ルールが作成されるので右端の”・・・”を選択して「有効化」をクリックすると有効化される。
テスト
実際にプログラムからIoT CoreにデータをPublishしてDynamoDBでデータが送信されるかを確認する。
尚、プログラムについては別記事とする。
IoT Coreのテスト
IoT Coreのメニューからテストを選択してトピックのサブスクリプションに”#”を指定して「トピックへのサブスクライブ」ボタンをクリックする。
プログラムからIoT Coreがデータを受信すると画面中央に表示される。
DynamoDBの”テーブル”、”項目”タブでデータが格納されていればテストは終了。
続く
長くなったので今回の記事はこれで終了。
次回はElasticsearch Serviceの設定の記事としたい。
最近のコメント