AWS IoTルールでMQTTメッセージを再発行する
AWS IoTには、AWS IoTルールという機能があります。
AWS IoT ルールは、デバイスから他の AWS のサービスにデータを送信します。特定の MQTT メッセージをリッスンし、メッセージペイロード内のデータをフォーマットし、結果を他の AWS のサービスに送信します。
デバイスデータを他の のサービスにルーティングする AWS IoT ルールの作成
AWS IoTルールを使用すれば、メッセージ内のデータをさまざまなAWSリソースに送信できます。
この記事では、AWS IoTルールとIAMロールを作成し、特定のトピックに発行されたメッセージを別のトピックに再発行します。これにより、メッセージの内容を抽出・加工して、別のトピックへ効率的に再配信できます。
以下のページを参考に、受信したMQTTメッセージを再発行する方法を確認します。
構成
- AWS IoTルールを作成し、特定のトピックに発行されたメッセージを別のトピックに再発行します。
- AWS IoTルール用のIAMロールを作成します。
リソース
AWS IoTルール
ルールはSQL文のような構造で定義します。詳細は以下のページを参照してください。
データ
今回のルールでは、device_idとtemperatureの2つのデータで構成されるメッセージを作成します。
- temperature:ルールの対象となったメッセージに含まれている同名のデータを使用します。
- device_id:topic関数を用いて、トピック名をスラッシュで分割した際の2番目の文字列を使用します。
ルールをトリガーしたメッセージが送信されたトピックを返します。パラメータが指定されていない場合、トピック全体が返されます。
topic(10 進数)
FROM句
FROM句でデータを取得するトピック名を指定します。トピックdevice/+/dataを対象とします。
SQLバージョン
SQLバージョンを設定できます。今回は「2016-03-23」を指定します。AWS公式では以下のように説明されています。
2016-03-23 – 2016 年 3 月 23 日にビルドされた SQL バージョン (推奨)。
SQL バージョン
再配布アクション
Qosプロパティでサービス品質(QoS)のレベルを設定できます。今回は「0」を指定します。AWS公式では以下のように説明されています。
送信回数 0 回以上
このレベルは、信頼できる通信リンクを介して送信されるメッセージや、見逃しても問題がないメッセージに使用する必要があります。
MQTTサービス (QoS) 品質オプション
再発行先のトピックにdevice/data/tempを指定します。
IAMロール
信頼ポリシーでiot.amazonaws.comサービスがこのIAMロールを引き受けることを許可します。IAMロールにアタッチしたIAMポリシーでは、iot:Publishアクションを許可します。再発行先のトピックのARNを指定して、このトピックに対してメッセージを送信することを許可します。
CloudFormationテンプレート
AWS IoTルール
Resources:
TopicRule:
Type: AWS::IoT::TopicRule
Properties:
RuleName: republish_temp
TopicRulePayload:
Actions:
-
Republish:
Qos: 0
RoleArn: !GetAtt TopicRuleRole.Arn
Topic: !Ref DestTopicName
AwsIotSqlVersion: 2016-03-23
RuleDisabled: false
Sql: !Sub "SELECT topic(2) as device_id, temperature FROM '${SourceTopicName}'"
Code language: YAML (yaml)
IAMロール
Resources:
TopicRuleRole:
Type: AWS::IAM::Role
DeletionPolicy: Delete
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
Service:
- iot.amazonaws.com
Policies:
- PolicyName: TopicRulePolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- iot:Publish
Resource:
- !Sub "arn:aws:iot:${AWS::Region}:${AWS::AccountId}:topic/${DestTopicName}"
Code language: YAML (yaml)
テンプレート全体
動作確認
MQTTテストクライアントページにアクセスして動作を確認します。
まず、2つのトピックをサブスクライブします。
- device/+/data
- device/data/temp
次に、トピックdevice/22/dataにメッセージを発行します。
device/+/dataで先ほどのメッセージを受信できています。このトピックはワイルドカード表記によって、発行されたメッセージを受け取ることができます。
次に、device/data/tempを確認します。
こちらにもメッセージが届いています。AWS IoTルールによって、このトピックにメッセージが再発行されました。
メッセージの内容を見ると、device_idとtemperatureの2つのデータを含んでいます。device_idはトピック名の一部、temperatureは再発行前のメッセージに含まれていたデータです。
まとめ
AWS IoTルールを使用して、メッセージを再発行する方法を確認しました。ルールのSQL式を適切に設定することで、再発行するメッセージの内容を抽出・加工できます。これにより、IoTデータの効率的な再配信が可能になります。