こんにちは!園部です。
「IoTのためのクラウドシステム構築」の続きです。今回はセンサデータの可視化をやっていきます!
◇ 全体の流れ
- cognito(認証サービス)の設定をする
- Opensearchにドメインを立てる
- IoTCoreのルールを設定する
- センサデータをAWSに送るプログラムを作成し、実行する
- OpenSearch Dashboardsでグラフ化
※ 前提としてAWSアカウントは持っているものとします
1.cognitoの設定
1-1.ユーザープールの作成
- cognitoの画面に行き、ユーザープールの作成ボタンを押す
- Cognito “ユーザープールのサインインオプション”で”ユーザー名”を選択し他はそのまま次へ
- セキュリティ要件を設定画面では”多要素認証”の設定で”MFA なし”を選択し、”ユーザーアカウントの復旧”のチェックを外して次へ
- サインアップエクスペリエンスを設定画面では”セルフサービスのサインアップ”の”自己登録を有効化”のチェックを外し”属性検証とユーザーアカウントの確認”の”Cognito が検証と確認のためにメッセージを自動的に送信することを許可 – 推奨”からチェックを外し次へ
- メッセージ配信を設定画面では”E メールプロバイダー”で”Cognito で E メールを送信”を選択し次へ
- アプリケーションを統合画面では”ユーザープール名”と”アプリケーションクライアント名”を入力し”クライアントのシークレットを生成しない”を選択し次へ
- 確認および作成画面で設定を確認しユーザープールを作成
- 作ったユーザープールの画面に入り、ユーザーを作成する(自分でテストする分には画像の設定がおすすめです)
cognito ユーザーを作成
1-2.フェデレーティッド ID作成
-
- cognitoの画面左のメニューの”フェデレーティッド ID”を選択
- 新しい ID プールの作成画面に来たら、”ID プール名”を入力し”認証されていない ID に対してアクセスを有効にする”にチェックを入れて”プールの作成”ボタンを押す
- “Identify the IAM roles to use with your new identity pool”と書かれた画面に飛んだらそのまま許可する(詳細のロールの設定は”新しいIAMロールの作成”のままで大丈夫です。)
- 作成したロールに”ESHttpGet”を許可する
- 最後にユーザープールの”Cognitoドメイン”を作成する
ドメインは使用可能であれば何でも良いです。
2.Opensearchドメインを立てる
-
- Amazon OpenSearch Serviceの画面で、”ドメインの作成ボタン”を押す
- ドメイン名を入力する
※これ以下は今回設定することだけを書くので、それ以外はそのままで大丈夫です。
-
- デプロイタイプで”開発およびテストを選ぶ
- データノードの”アベイラビリティーゾーン”、”インスタンスタイプ”、”ノードの数”を画像のように設定する
-
- Amazon Cognito 認証で”Amazon Cognito 認証を有効化”にチェックする
- リージョンを先ほどcognitoのプールを作成したリージョンにする
- Cognito ユーザープールルとCognito ID プールを設定する
-
- ネットワークをパブリックアクセスにする
- きめ細やかなアクセスコントロールで”きめ細やかなアクセスコントロールを有効化”のチェックを外す
- アクセスポリシーで”ドメインレベルのアクセスポリシーの設定”を選択し、アクションを許可に変更、プリシンパルに自分のIAMユーザーのARNを入力
※IAMユーザーのARNはIAMの画面から持って来れます。
-
- 作成ボタンを押す
※ドメインの作成には数分かかります。
これでドメインの設定は以下のようになったと思います。
3.IoTCoreのルールを設定する
- IoTCoreの画面、左メニューの”メッセージのルーティング”→”ルール”を選択し、ルールを作成ボタンを選択する
- ルール名を入力し次へ
- SQL ステートメントを設定画面で”SQLステートメント”に「SELECT * FROM ’任意のトピック’」を記入する。今回はトピック名を’SENDtoOS’にし次へ
- 作成ボタンを押しルール作成完了
- ”ルールアクション”で”Amazon OpenSearch Serviceにメッセージを送信します”を選択
- “ドメイン名”先ほど作ったドメインを選択
- “インデックス名”に任意の名前(今回は「bme_sensor」)、”ドキュメントID”に「${newuuid()}」、”ドキュメントタイプ”に任意の名前(今回は「sensor_data」)を入力する
- ”IAMロール”を選択し、”次へ”を押す(今回はAmazonESFullAccessがついているもの)
4.センサデータをAWSに送るプログラムを作成し、実行する
■ 実行プログラムの作成
bme280toS3.py
- #coding: utf-8
- from smbus2 import SMBus
- import time
- import datetime
- import json
- import clientConfig as client
- from bme280_get_data import BME280
- #AWS SDKsのインポート
- from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
- sensor = BME280()
- clientName = client.clientName
- endpoint_path = client.endpoint_path
- amazonroot_path = client.amazonroot_path
- privatekey_path = client.privatekey_path
- certificate_path = client.certificate_path
- #クライアント情報を設定する
- def set_mqttclient(name=clientName,endpoint=endpoint_path,root=amazonroot_path,key=privatekey_path,certificate=certificate_path):
- MQTTClient = AWSIoTMQTTClient(name)
- MQTTClient.configureEndpoint(endpoint, 8883)
- MQTTClient.configureCredentials(root, key, certificate)
- MQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Pubblish queueing
- MQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz
- MQTTClient.configureConnectDisconnectTimeout(10) # 10 sec
- MQTTClient.configureMQTTOperationTimeout(5) # 5 sec
- return MQTTClient
- if __name__ == ‘__main__’:
- myMQTTClient = set_mqttclient()
- try:
- myMQTTClient.connect()
- while True:
- messageJson = sensor.getMessage()
- myMQTTClient.publish(‘your topic’, messageJson, 1) #publish関数の第一引数をマネコンで設定したトピックに置き換える
- time.sleep(60)
- except KeyboardInterrupt:
- pass
※ インポートされている”clientConfig”は前回記事の物と同じです。