ESP32をAWSに接続してみた(3) OpenSearchの設定
システムの構成
今回構築するシステムの構成図は以下のようになります。前回までで、ESP32からIoT Coreまでは完成しました。今回は、OpenSearchを使用してデータを可視化できるようにします。また、OpenSearchにはCognitoによる認証をつけて、インターネットからアクセスしてもセキュリティ上問題ないようにします。
OpenSearchドメインの作成(1)
AWSマネジメントコンソールからOpenSearchを開き、ドメインの作成をクリックします。
ドメインの作成画面に遷移したら、ドメイン名にairsensor-opensearchと入力します。
デプロイタイプは、今回は「開発及びテスト」を選択します。
自動調整は「無効化」を選択します。
データノードは一番小さく、無料利用枠のある「t3.small.search」を選択します。そのほかのオプションはデフォルトのままにします。
ネットワークはパブリックアクセスを選択します。きめ細やかなアクセスコントロールのチェックを外します。
Cognito認証を有効にチェックを入れます。まず、Cognitoのユーザープールを作成しますので、ユーザープールの作成をクリックします。
Cognitoユーザープールの作成
Cognitoのユーザープールの作成画面に遷移します。サインインオプションの「ユーザー名」にチェックを入れて次へをクリックします。
パスワードポリシーはデフォルト、多要素認証は「MFAなし」を選択します。(今回は管理者のみがアカウントを作成でき、MFA等は使わない設定としました)
「セルフサービスのアカウント復旧を有効化」のチェックを外します。
サインアップエクスペリエンスを設定では、「自己登録を有効化」のチェックを外し、「Cognitoが検証と確認のためにメッセージを自動的に送信することを許可」のチェックを外します。
メッセージ配信を設定画面では、CognitoでEメールを送信を選択します。
アプリケーションを統合の画面に遷移します。ユーザープール名には「AirSensorOpenSearchUserPool」と入力しました。
「CognitoのホストされたUIを使用」に本当はチェックを入れたいのですが、ここでチェックを入れると、「最初のアプリケーション」のコールバックURLを入れなくてはならなくなるため、ここではチェックを入れません。(後で付けます)
アプリケーションクライアント名にはAirSensorOpenSearchと入力します。次へをクリックすると確認および作成画面が表示されますので、ユーザープールを作成をクリックします。
作成が完了するとユーザープールの一覧に遷移します。UIとユーザーの設定のために、今作成したユーザープール名をクリックします。
まずはUIを追加します。「アプリケーションの統合」をクリックします。
すべてのアプリケーションクライアントの設定画面に遷移したら、アクション→Cognitoドメインの作成をクリックします。
Cognitoドメインに「https://airsensoropensearch」と入力し、Cognitoドメインの作成をクリックします。
次にユーザーを作成します。ユーザーからユーザーの作成をクリックします。
お好みのユーザー名とパスワードを入力し、「ユーザーを作成」をクリックします。
IDプールの作成
Cognito左メニューのフェデレーティッドIDをクリックし、IDプールの作成画面に遷移します。新しいIDプールの作成をクリックします。
IDプール名に「AirSensorIDPool」と入力します。「認証されていないIDに対してアクセスを有効にする」をクリックし、プールの作成をクリックします。
IAMロールに関する確認画面が表示されます。許可をクリックします。
ロールの設定
IDプールを作成しましたが、同時に生成されたロールにOpenSearchへアクセスするためのポリシーが付いていません。
IAMからロールを開き、先ほど自動的に作成されたCognito_AirSensorIDPoolAuth_Roleをクリックします。
アクセス制限を追加からインラインポリシーを追加します。
サービスの選択をクリックします。
検索ボックスにopenserachを入力し、OpenSearch Serviceをクリックします。
アクションは「すべてのOpenSearch Service」を選択します。
リソースはすべてのリソースとします。気になる方はOpenSearchドメインの作成後、ARNを指定するとアクセス範囲をそのドメインのみに狭めることができます。
名前にOpenSerachAccessPolicyと入力し、ポリシーを作成します。
ロールにポリシーが追加できました。このロールのARNをコピーしておいだください。
OpenSearchドメインの作成(2)
ユーザープールとIDプールの作成、ポリシーの追加が終わったら、OpenSearchドメインの作成画面に戻ります。
更新ボタンをクリックし、ユーザープールとIDプールに先ほど作成した名前を選択します。
アクセスポリシーは「ドメインのアクセスポリシーを設定」を選択し、タイプはIAM ARN、プリンシパルには先ほど作成したロールのARNを指定、アクションは許可とします。ここまで設定出来たら「作成」をクリックします。
ドメインが作成されるまで10-20分ほどかかります。作成が完了しないと次の作業ができないので、完了まで待ちます。
IoT Coreルールの作成
AWSマネジメントコンソールからIoT Coreを開き、ACT→ルールを選択し、ルールを作成します。
名前に「AirSensorRule」を入力します。
ルールクエリステートメントには
select principal() as principal, parse_time("yyyy-MM-dd'T'HH:mm:ss.SSSZ", timestamp()) as server_timestamp, * from 'node/airsensor'
を入力します。
アクションの追加をクリックし、OpenSearch Serviceにメッセージを送信するを選択します。
ドメイン名には先ほど作成したOpenSearchドメインを選択し、IDには${newuuid()}、索引にはserver_timestamp、タイプにはtimestampをそれぞれ入力します。ロールの作成をクリックし、AirSensorRole-OpenSearchを入力します。アクションの追加をクリックします。
ルールの作成画面に戻ったら、ルールの作成をクリックします。
これでIoT CoreからOpenSearchへデータが送信できるようになりました!
OpenSearchの設定
AWSマネジメントコンソールからOpenSearchを開き、先ほど作成したドメインを選択します。
「OpenSearch Dashboards の URL」に表示されているアドレスをクリックすると、Cognitoのログイン画面が表示されますので、作成したアカウントとパスワードを入力してログインしてください。
ダッシュボードが表示され、Add dataをクリックしそうになりますがこちらではなく、メニューからDiscoverをクリックします。
Create index patternをクリックし、index pattern nameにserver_timestampを入力してNext stepをクリックします。
Time fieldはserver_timestampを選択し、Create index patternをクリックすると、現在の状況が表示されます。
グラフを作成するには、メニューのVisualizeからNew Visualizationを選択し、LINEを選択します。
Y軸はMedian(中央値)、Fieldにはtemperatureかhumidityを選択します。
X軸はadd→X-axisを選択し、Date Histogramを選択します。
右下のUpdateをクリックして結果を確認、右上のSaveでグラフの設定を保存できます。
温度と湿度、それぞれのグラフを作成したら、Dashboardとしてまとめて同時に見ることができるようになりました!表示するデータの期間を自由に選んで表示することができます。
おわりに
ESP32で取得したデータをAWSに送信し、OpenSeachに表示できるようになりました!最初の目標を達成することはできました。
一つ忘れていたこととして、ほこりセンサーの出力が単に電圧情報であるということがあります。次回は、この値をほこり濃度に変換してOpenSearchに表示したいと思います。
参考にしたページ