AWS初心者が触るIoTルールとS3の連携
実務でIoTルールを作成することがあり、意外にも簡単に作成することができたので、記事にしてみました。
IoTルールとは
AWS IoTルールアクションは、トピックやメッセージ内容の条件を基に、発行されたメッセージを他のAWSサービスに連携させるためのサービスです。例えばIoTルールに受信したメッセージをS3に保存したり、トリガーとしてLambdaを起動したりといった場合に設定をします。また、SQLベースのクエリを用いて簡易的なメッセージの加工をすることもできます。IoTルールで連携できるサービス一覧はこちら。
実際に作成する
それでは実際にIoTルールをS3と連携して、IoTルールに送信したメッセージをS3に保存するようにIoTルールを作成していきます。
(今回はIoTルールの作成を行うのでS3bucketの作成は省略します。)
IoTルール作成画面に移動
AWSにログインする。
検索スペースに「IoT Core」と入力して、サービス一覧からIotCoreを選択する。
サイドメニューから「メッセージルーティング」から「ルール」をクリックします。するとIoTルール一覧画面に遷移します。
IoTルールのプロパティを指定
「ルール作成」をクリックするとIoTルールを新規作成できます。
IoTルールのプロパティの各項目に下記の通り実施する。
- 「ルール名」にルール名に任意の名前にする。
- ルール説明とタグは任意です。
入力できたら、「次へ」をクリック。
SQL ステートメントを設定
SQL ステートメントの設定を下記の通り実施する。
- 「SQL のバージョン」は
2016-03-26
のままにする。- 「SQL のバージョン」ルールを評価する際に使用する SQL ルールエンジンのバージョンのこと。
2016-03-26
は2015-10-08
の改良版で、「入れ子になっているJSONオブジェクトの選択修正」や「配列クエリに関する修正」などが改善されている。詳細はこちら。
- 「SQL のバージョン」ルールを評価する際に使用する SQL ルールエンジンのバージョンのこと。
- 「SQLステートメント」では
SELECT * FROM ‘任意のトピック名’
にする。- SELECT句は受信されたメッセージのデータを抽出し、そのデータに対しての変換を実行します。例の場合だと
*
(ワイルドカード)はすべてのデータを対象になっています。ので、受信したデータは全て対象になる。また、使用するデータはFROM 句で指定されたトピックフィルターによって識別されます。 - FROM句はデータを抽出するメッセージを識別する MQTT メッセージトピックフィルターを識別します。ここで指定されたトピックフィルタに一致する MQTT トピックに送信されるメッセージごとに、ルールがトリガーされます。
ようはFROM句で指定したトピックにメッセージを送信すると作成したルールが起動するということ。
※''
で忘れずに囲みましょう。 - 今回は使用していませんが、FROM句の後にWHERE句というものがあります。
WHERE句はルールで指定したアクションが実行されるかどうかを決定する条件付きロジックを追加します。例えば受信したデータに「name」プロパティがないとルールを機能させない等の設定ができる。
入力できたら、「次へ」をクリック。
- SELECT句は受信されたメッセージのデータを抽出し、そのデータに対しての変換を実行します。例の場合だと
ルールアクションをアタッチ
ルールアクションの設定を下記の通り実施する。
- 「SQL ステートメント」は前のページで入力したSQLステートメントが表示されている。
- 「ルールアクション」はSQLステートメントの条件に一致した時に実行する内容を選択します。今回はメッセージをS3に保存するので「S3 bucket」を選択する。「S3 bucket」を選択すると項目が追加されます。
- 「S3 URL」にはデータの書き込み先のS3buketを指定してください。(今回ではS3 bucketの作成は紹介していません。画像では空白になっていますが選択するとS3bucket名が表示されます。)
- 「キー」にはデータの書き込み先として指定するファイルのパスを入力します。例だと
${topic()}/${timestamp()}
というキーが入力されています。
${topic()}/${timestamp()}
の${topic()}
はSQLステートメントで設定したトピックフィルターが入ります。例の場合だとtest/topic/inoue
が入る。また、${timestamp()}
は現在の時間が代入されます。
例:test/topic/inoue/1670574091355
- 「既定 ACL」は「private」のまま。
- 「IAM ロール」はAmazon S3 バケットへのアクセスを許可する IAM ロールを選択、または作成する。作成する場合にも任意のロール名を入力するだけでできます。
入力できたら、「次へ」をクリック。
確認と作成
- 作成するIoTルールを表示しています。不備がないか確認できたら、「作成」をクリックしましょう。これでIotルールが作成できましたので、MQTTテストクライアントでテストしてみましょう。
MQTTテストクライアントで試験運用
MQTTテストクライアントを使用して、作成したIoTルールにメッセージを送ってS3に保存されるのを確認してみます。MQTTテストクライアントとはトピックによって識別されるMQTTメッセージを発行し、そのメッセージをIoTに伝えることができます。IoTは受信したMQTTメッセージからデバイスおよびアプリに変更とイベントを通知します(今回の場合だとS3に受信したメッセージを保存する)。
また、MQTTメッセージをモニタリングすることもできます。サブスクライブを設定することで、送受信されるMQTTメッセージをモニタリングできます。
モニタリングの設定
まず、モニタリングの設定をしていきます。
- AWS IoTのサイドメニューの「テスト」項目から「MQTTテストクライアント」をクリックするとMQTTテストクライアントに画面遷移します。
- 「トピックをサブスクライブする」を選択する。
- 「トピックのフィルター」に
#
を入力して、「サブスクライブ」をクリックすると#
がサブスクリプションリストに表示されます。これでモニタリングの設定ができました。-
#
(ワイルドカード)はメッセージブローカーによって受信されるすべてのトピックがサブスクライブされます。また、topic/#
のようにするとtopic/
で始まるトピックをすべてサブスクライブします。 -
#
ではなくIoTルールで設定したトピック名でも大丈夫です。(例だとtest/topic/inoue
) - サブスクリプションリストのトピック名の横にある「♡」マークをクリックするとお気に入り設定することができ、これをすることでサブスクライブの設定を毎回しなくても良くなる。
-
MQTTテストクライアントの実施
トピックを指定して、MQTTメッセージを発行してみます。
- 「トピックに公開する」を選択します。
- 「トピック名」には自身が作成したIoTルールのトピック名を入力します。(例だと
test/topic/inoue
) - 「メッセージペイロード」は今回はそのままで。(SQLステートメントの設定でSELECT句を
*
にしている場合) - 「発行」をクリックするとメッセージをIoTルールに発行します。すると、発行メッセージペイロードウィンドウの下の MQTTクライアントにメッセージが表示されます。
S3に保存されていることの確認
では、IoTルールにメッセージを発行することはできましたので、S3に保存されているか確認してみます。
- 検索スペースに「S3」と入力し、サービス一覧からS3を選択します。
- 「バケット」一覧画面でIoTルールで設定したバケット選択をする。
- バケット内はIoTルール作成時の「ルールアクションをアタッチ」で設定した「キー」の階層になっています。例の場合だと
test/topic/inoue/1670574091355
のような階層になっており、1670574091355
がIotルールによって作成されたファイルになります。実際にクッリクして「開く」をするとMQTTテストクライアントで発信した内容になっていると思います。
まとめ
実務で初めて触ってみましたが簡単にIoTの設定をすることができました!いつかRas Piを組み合わせたり、Athenaを活用したデータ分析などもできればいいなと思います。
以下参考資料
Discussion