AWS IoTルールでMQTTメッセージをSNSに通知する
このページでは、AWS IoTルールを使用して、MQTTメッセージの内容をSNSに通知する方法を確認します。
SNS (sns) アクションは、Amazon Simple Notification Service (Amazon SNS) プッシュ通知として MQTT メッセージからデータを送信します。
SNS
今回は、AWS IoTルールとSNSトピック、IAMロールをCloudFormationで自動的に構築し、温度データが特定のしきい値を超えた場合にSMSで通知するシステムを作成します。これにより、重要な情報を迅速に受信し、対応することが可能になります。
今回は以下のページを参考しています。
構成
- AWS IoTルール:特定のトピックに発行されたメッセージをSNSに通知します。
- IAMロール:IoTルールがSNSにアクセスするための権限を付与します。
- SNSトピック:SMSを使用し、通知先として携帯電話の電話番号を指定します。
リソース
AWS IoTルール
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に通知する対象とします。
SNS向けのアクションとして、通知先のSNSトピック、フォーマット、IAMロールを指定します。フォーマットにはRAWを設定します。
AWS IoTルールの基本的な事項については、以下のページをご確認ください。
IAMロール
信頼ポリシーでiot.amazonaws.comサービスがこのIAMロールを引き受けることを許可します。IAMロールにアタッチしたIAMポリシーでは、sns:Publishアクションを許可します。対象としてSNSトピックのARNを指定し、このトピックに対してメッセージを送信することを許可します。
必要な権限は以下のページを参考にしました。
SNSトピック
携帯電話の電話番号とSMSプロトコルを指定して、このトピックをサブスクライブします。
SMS宛にメッセージを通知する方法については、以下のページをご確認ください。特に、デフォルトではAWSアカウントがSMSサンドボックスに配置されているため、未登録の電話番号にはメッセージを通知できない点にご注意ください。
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)
テンプレート全体
動作確認
temperatureが30以上の場合
まずトピックdevice/+/dataをサブスクライブします。
次にトピックdevice/32/data向けにメッセージを発行します。
サブスクライブしたトピックでメッセージを受信できました。このトピックはワイルドカード表記により、該当するメッセージを受け取ることができます。
temperatureの値は「38」で、30より大きいです。このため、AWS IoTルールの条件を満たし、SNSトピックにメッセージが送信されます。
携帯電話のSMSアプリを確認すると、メッセージが届いています。内容にはdevice_id、reported_temperature、max_temperatureの3つのデータが含まれており、SQL式で指定した通りです。
temperatureが30未満の場合
次に、トピックdevice/33/dataにメッセージを発行します。
メッセージの発行は成功しましたが、携帯電話にはショートメッセージは届きませんでした。これは、temperatureの値が「28」で、30より小さかったためです。つまり、このメッセージはAWS IoTルールの条件を満たしていないため、SNSトピックにメッセージが送信されなかったということです。
まとめ
AWS IoTルールを活用して、MQTTメッセージをAmazon SNSに通知する方法を確認しました。CloudFormationを使用して、SNSトピック、IAMロール、IoTルールの設定を自動化しました。この仕組みにより、重要な情報をリアルタイムで受信し、迅速な対応が可能になります。