AWSIoTCore検証メモ②:IoT rule 編


公式ドキュメント
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-rules.html

 IoT ruleとは

AWS IoT Core->ACT->RuleにIoT ruleを追加することでTopicへ送られてくるメッセージに対してアクションを行う事ができます。
IoT ruleを使うことで、デバイスから送られてくるメッセージをもとに他のAWSサービスと連携することができます。

例)

  • デバイスから受け取ったデータの加工またはフィルタ処理を行う。
  • デバイスから受け取ったデータを Amazon DynamoDB データベースに書き込む。
  • Lambda 関数を呼び出してデータを抽出する。
  • MQTT メッセージから Amazon Machine Learning にデータを送信して、Amazon ML モデルに基づいて予測を行う。
  • ウェブアプリケーションまたはサービスにメッセージデータを送信する。

IoT ruleの設定

IoT ruleの作成は[AWS IoT Core]->[ルール]->[作成]で新規ルールを作成できます。
クエリステートメントにルールクエリを記載することで送られてきたメッセージに対して加工を行うことができます。

#topicに送られてくる全てのメッセージをトリガー
SELECT * FROM "<topic>"

ルールクエリには以下の組み込み関数が利用可能

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sql-functions.html#iot-func-abs

使用頻度の高そうな組み込み関数

  • clientid() : メッセージを送信している MQTT クライアントのID
    • clientid() AS client_id
  • timestamp():ミリ秒単位で現在のタイムスタンプ
    • timestamp() AS timestam
  • traceid() : MQTT メッセージのトレース ID (UUID)
    • traceid() AS trace_id

例)Topic:test/testingに送られてくるすべてのメッセージ内にデバイスのclientIDとtimestanpを追加するルールクエリ

SELECT clientid() AS client_id, timestamp() AS timestamp, * FROM "test/testing"

デバイスから以下のデータをTopic:test/testingに送信すると

"data": {
    //元のデバイスからのメッセージ
    "message": "SendSensorData",
    "SensorData": 2
}

ルールクエリ内でclient_idとtimestampが送られてきたメッセージに追加される

"data": {
    //元のデバイスからのメッセージ
    "message": "SendSensorData",
    "SensorData": 2,
    //ルールクエリで追加されたclientIDとtimestamp
    "clientID": "10PC202010012",
    "timestamp": 1617598518923
}

DynamoDBに保存された静的データとの連携

ルール内でDynamoDBからのテーブルの抽出も可能

DynamoDBからルールクエリ内でデータを抽出する際の書式

get_dynamoDB (tableName、partitionKeyName、partitionKeyValue、sortKeyName、sortKeyValue, roleArn)

get_dynamoDB() の使用方法の例として、AWS IoT に接続されているすべてのデバイスのデバイス ID と位置情報を含む DynamoDB テーブルがあるとします。次の SELECT 文は、 get_dynamoDB() 関数を使用して、指定したデバイス ID の場所を取得することができます。
以下のような内容でDynamoDBにテーブルを用意し、

ルールクエリに以下のクエリを指定します。
クエリの内容は、timestampの追加と、DynamoDBのIoTCoreTestテーブルからclientIDが一致するデータをDBdataとして追加するといった内容になっています。

SELECT *, timestamp() AS timestamp,get_dynamoDB("IoTCoreTest", "clientID" , clientID ,"arn:aws:iam::941279141676:role/DynamoDBTest").* AS DBdata FROM 'Test/IoTDevice01'

ルールクエリを動かしてみると以下のようなデータが取得できます。

"data": {
  //元のデバイスからのメッセージ
  "message": "SendSensorData",
  "SensorData": 2,
  //ルールクエリで追加されたclientIDとtimestamp
  "clientID": "10PC202010012",
  "timestamp": 1617598518923,
  //ルールクエリ内でDynamoDBから抽出したデータ
  "DBdata": {
    "address": "東京都墨田区押上1丁目1−2",
    "clientID": "10PC202010012",
    "Tell": "yyy-yyyy-yyyy",
    "GeoJSON": {
      "coordinates": [
        139.764658,
        35.688752
      ],
      "type": "POINT"
    },
    "InstallationDate": "2021/04/05",
    "Admin": "Tom_zono",
    "LastCommunication": "",
    "DeviceName": "LIFEBOOK_U939"
  }
}      

ルールクエリを設定することにより、デバイスから送られてきたメッセージに対して、DBに保存してある静的データの追加等の処理が行えるようになりました。
初回のユースケースの構成では今回の内容は赤枠内のトピックからルールまでの設定部分になります。

IoT ruleの使いどころ

AWSのサービスとデバイスからのメッセージを連携させて処理させるときにはIoT ruleのRuleActionを使えば簡単に連携させることができる。

デバイスからのデータにclientIDを追加することによって、AWS以外のサービスを使うときにもどのデバイスからデータが送信されてきてるのかの判別が容易になる。
このデータに、DynamoDBに保存されているデバイスの静的データ(設置場所の情報、設置時期、デバイスの管理者etc...)が加わってくれば付加価値の高いデータとしてリアルタイム処理を行うことができそう。
センサー等の動きのあるデータはデバイス上のプログラムから送信して、変更される頻度が少ないデータはDynamoDBに保存して、その都度呼び出してあげたほうがよさそうですね。
後はWHERE句を使うことでセンサー値n以上の場合処理を行うなど取った設定もできるので、閾値の設定などlambda等を使う必要がない簡単な処理はルールクエリを活用するといいと思います。

次回は届いたメッセージの内容に応じて何らかのアクションを起こす[ IoT action ]について検証を行っていきます。
AWS IoT CoreCore検証メモ③:IoT action について


AWS IoT CoreCore検証内容一覧へ