AWS IoTルールでMQTTメッセージを再発行する

目次

AWS IoTルールでMQTTメッセージを再発行する

AWS IoTには、AWS IoTルールという機能があります。

AWS IoT ルールは、デバイスから他の AWS のサービスにデータを送信します。特定の MQTT メッセージをリッスンし、メッセージペイロード内のデータをフォーマットし、結果を他の AWS のサービスに送信します。

デバイスデータを他の のサービスにルーティングする AWS IoT ルールの作成

AWS IoTルールを使用すれば、メッセージ内のデータをさまざまなAWSリソースに送信できます。

この記事では、AWS IoTルールとIAMロールを作成し、特定のトピックに発行されたメッセージを別のトピックに再発行します。これにより、メッセージの内容を抽出・加工して、別のトピックへ効率的に再配信できます。

以下のページを参考に、受信したMQTTメッセージを再発行する方法を確認します。

あわせて読みたい
チュートリアル: MQTT メッセージの再発行 - AWS IoT Core このチュートリアルでは、指定した MQTT メッセージを受信したときに MQTT メッセージを発行する AWS IoT ルールを作成する方法を示します。受信メッセージペイロードは、...

構成

Diagram of creating AWS IoT rules and republish MQTT messages.
  • AWS IoTルールを作成し、特定のトピックに発行されたメッセージを別のトピックに再発行します。
  • AWS IoTルール用のIAMロールを作成します。

リソース

AWS IoTルール

Detail of AWS IoT 1.

ルールはSQL文のような構造で定義します。詳細は以下のページを参照してください。

あわせて読みたい
AWS IoT SQL リファレンス - AWS IoT Core 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 バージョン

再配布アクション

Detail of AWS IoT 2.

Qosプロパティでサービス品質(QoS)のレベルを設定できます。今回は「0」を指定します。AWS公式では以下のように説明されています。

送信回数 0 回以上

このレベルは、信頼できる通信リンクを介して送信されるメッセージや、見逃しても問題がないメッセージに使用する必要があります。

MQTTサービス (QoS) 品質オプション

再発行先のトピックにdevice/data/tempを指定します。

IAMロール

Detail of IAM Role 01.
Detail of IAM Role 02.

信頼ポリシーで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)

テンプレート全体

GitHub
awstut-fa/158 at main · awstut-an-r/awstut-fa Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

動作確認

MQTTテストクライアントページにアクセスして動作を確認します。

まず、2つのトピックをサブスクライブします。

  • device/+/data
  • device/data/temp
Detail of AWS IoT 3.

次に、トピックdevice/22/dataにメッセージを発行します。

Detail of AWS IoT 4.

device/+/dataで先ほどのメッセージを受信できています。このトピックはワイルドカード表記によって、発行されたメッセージを受け取ることができます。

次に、device/data/tempを確認します。

Detail of AWS IoT 5.

こちらにもメッセージが届いています。AWS IoTルールによって、このトピックにメッセージが再発行されました。

メッセージの内容を見ると、device_idとtemperatureの2つのデータを含んでいます。device_idはトピック名の一部、temperatureは再発行前のメッセージに含まれていたデータです。

まとめ

AWS IoTルールを使用して、メッセージを再発行する方法を確認しました。ルールのSQL式を適切に設定することで、再発行するメッセージの内容を抽出・加工できます。これにより、IoTデータの効率的な再配信が可能になります。

目次