AWS IoTルールでMQTTメッセージをSNSに通知する

目次

AWS IoTルールでMQTTメッセージをSNSに通知する

このページでは、AWS IoTルールを使用して、MQTTメッセージの内容をSNSに通知する方法を確認します。

SNS (sns) アクションは、Amazon Simple Notification Service (Amazon SNS) プッシュ通知として MQTT メッセージからデータを送信します。

SNS

今回は、AWS IoTルールとSNSトピック、IAMロールをCloudFormationで自動的に構築し、温度データが特定のしきい値を超えた場合にSMSで通知するシステムを作成します。これにより、重要な情報を迅速に受信し、対応することが可能になります。

今回は以下のページを参考しています。

あわせて読みたい
チュートリアル: Amazon SNS 通知の送信 - AWS IoT Core このチュートリアルでは、MQTT メッセージデータを Amazon SNS トピックに送信し、SMS テキストメッセージとして送信できるようにする AWS IoT ルールを作成する方法を示し...

構成

Diagram of notifying SNS using AWS IoT rules
  • AWS IoTルール:特定のトピックに発行されたメッセージをSNSに通知します。
  • IAMロール:IoTルールがSNSにアクセスするための権限を付与します。
  • SNSトピック:SMSを使用し、通知先として携帯電話の電話番号を指定します。

リソース

AWS IoTルール

Detail of AWS IoT 01.

SQLでルールを定義します。3つのデータで構成されるメッセージを作成します。加えてFROM句とWHERE句を用いて、データを取得するトピックや条件を設定します。

device_id

1つ目のデータはdevice_idという名前で、topic関数を使用してトピック名をスラッシュで分割し、2番目の文字列を取得します。

ルールをトリガーしたメッセージが送信されたトピックを返します。パラメータが指定されていない場合、トピック全体が返されます。

topic(10 進数)

reported_temperature

2つ目はreported_temperatureという名前で、元のトピックに配信されたメッセージに含まれるtemperatureのデータを使用します。

max_temperature

3つ目はmax_temperatureという名前で、この値は固定値「30」です。

FROM句

FROM句でデータを取得するトピック名を指定します。今回の構成では、トピックdevice/+/dataを対象とします。

WHERE句

WHERE句を用いて、temperatureの値が30より大きい場合のみ、SNSに通知する対象とします。

Detail of AWS IoT 02.

SNS向けのアクションとして、通知先のSNSトピック、フォーマット、IAMロールを指定します。フォーマットにはRAWを設定します。

AWS IoTルールの基本的な事項については、以下のページをご確認ください。

あわせて読みたい
AWS IoTルールでMQTTメッセージを再発行する 【AWS IoTルールでMQTTメッセージを再発行する】 AWS IoTには、AWS IoTルールという機能があります。 AWS IoT ルールは、デバイスから他の AWS のサービスにデータを送...

IAMロール

Detail of IAM role 02.
Detail of IAM role 01.

信頼ポリシーでiot.amazonaws.comサービスがこのIAMロールを引き受けることを許可します。IAMロールにアタッチしたIAMポリシーでは、sns:Publishアクションを許可します。対象としてSNSトピックのARNを指定し、このトピックに対してメッセージを送信することを許可します。

必要な権限は以下のページを参考にしました。

あわせて読みたい
SNS - AWS IoT Core SNS ルールアクションを使用して、Amazon Simple Notification Service プッシュ通知 AWS IoT として から MQTT メッセージを送信します。

SNSトピック

Detail of AWS SNS 01.

携帯電話の電話番号とSMSプロトコルを指定して、このトピックをサブスクライブします。

SMS宛にメッセージを通知する方法については、以下のページをご確認ください。特に、デフォルトではAWSアカウントがSMSサンドボックスに配置されているため、未登録の電話番号にはメッセージを通知できない点にご注意ください。

あわせて読みたい
AWS SNSでSMS(ショートメッセージ)に通知する 【AWS SNSでSMS(ショートメッセージ)に通知する】 AWS SNS(Simple Notification Service)では、多彩な通知先を選択できます。公式ドキュメントによると、SNSイベント...

CloudFormationテンプレート

AWS IoTルール

Resources:
  TopicRule:
    Type: AWS::IoT::TopicRule
    Properties:
      RuleName: temp_limit_notify
      TopicRulePayload: 
        Actions: 
          - Sns: 
              MessageFormat: RAW
              RoleArn: !GetAtt TopicRuleRole.Arn
              TargetArn: !Ref SnsTopicArn
        AwsIotSqlVersion: 2016-03-23
        RuleDisabled: false
        Sql: !Sub |
          SELECT topic(2) as device_id, 
              temperature as reported_temperature, 
              30 as max_temperature 
            FROM '${TopicName}' 
            WHERE temperature > 30
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:
                  - sns:Publish
                Resource:
                  - !Ref SnsTopicArn
Code language: YAML (yaml)

SNSトピック

Resources:
  Topic:
    Type: AWS::SNS::Topic
    Properties:
      FifoTopic: false
      Subscription: 
        - Endpoint: !Ref PhoneNumber
          Protocol: sms
      TopicName: !Sub "${Prefix}-sns-topic"
Code language: YAML (yaml)

テンプレート全体

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

動作確認

temperatureが30以上の場合

まずトピックdevice/+/dataをサブスクライブします。

Detail of AWS IoT 03.

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

Detail of AWS IoT 04.

サブスクライブしたトピックでメッセージを受信できました。このトピックはワイルドカード表記により、該当するメッセージを受け取ることができます。

temperatureの値は「38」で、30より大きいです。このため、AWS IoTルールの条件を満たし、SNSトピックにメッセージが送信されます。

Detail of AWS IoT 05.

携帯電話のSMSアプリを確認すると、メッセージが届いています。内容にはdevice_id、reported_temperature、max_temperatureの3つのデータが含まれており、SQL式で指定した通りです。

temperatureが30未満の場合

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

Detail of AWS IoT 06.

メッセージの発行は成功しましたが、携帯電話にはショートメッセージは届きませんでした。これは、temperatureの値が「28」で、30より小さかったためです。つまり、このメッセージはAWS IoTルールの条件を満たしていないため、SNSトピックにメッセージが送信されなかったということです。

まとめ

AWS IoTルールを活用して、MQTTメッセージをAmazon SNSに通知する方法を確認しました。CloudFormationを使用して、SNSトピック、IAMロール、IoTルールの設定を自動化しました。この仕組みにより、重要な情報をリアルタイムで受信し、迅速な対応が可能になります。

目次