翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
チュートリアル: Amazon SNS通知の送信
このチュートリアルでは、MQTTメッセージデータを Amazon SNSトピックに送信してSMSテキストメッセージとして送信できるようにする AWS IoT ルールを作成する方法を示します。
このチュートリアルでは、温度がルールで設定された値を超えるたびに、気象センサーから Amazon SNSトピックのすべてのサブスクライバーにメッセージデータを送信するルールを作成します。ルールは、報告された温度がルールで設定された値を超えたことを検出し、そのとき、デバイス ID、報告された温度、および超過した温度制限のみを含む新しいメッセージペイロードを作成します。ルールは、新しいメッセージペイロードをJSONドキュメントとしてSNSトピックに送信し、SNSトピックのすべてのサブスクライバーに通知します。
このチュートリアルでは、次の内容を学習します。
-
Amazon SNS通知を作成してテストする方法
-
AWS IoT ルールから Amazon SNS通知を呼び出す方法
-
ルールSQLクエリステートメントで単純なクエリと関数を使用する方法
-
MQTT クライアントを使用して AWS IoT ルールをテストする方法
このチュートリアルの完了には 30 分ほどかかります。
このチュートリアルでは、次の作業を行います。
このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
-
セットアップ AWS アカウント
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。
-
クライアントでMQTT AWS IoT MQTTメッセージを表示する を確認したこと
MQTT クライアントを使用してトピックをサブスクライブして公開できることを確認してください。クライアントを使用してMQTT、この手順で新しいルールをテストします。
-
Amazon Simple Notification Service を確認しました
Amazon を使用したことがない場合はSNS、「Amazon へのアクセスの設定SNS」を参照してください。他の AWS IoT チュートリアルを既に完了している場合は、 AWS アカウント が正しく設定されている必要があります。
ステップ 1: SMSテキストメッセージを送信する Amazon SNSトピックを作成する
この手順では、気象センサーがメッセージデータを送信できる Amazon SNSトピックを作成する方法について説明します。その後、Amazon SNSトピックは、すべてのサブスクライバーに、温度制限を超えたことをSMSテキストメッセージで通知します。
SMS テキストメッセージを送信する Amazon SNSトピックを作成するには
-
Amazon SNSトピックを作成します。
-
Amazon SNSコンソール
にサインインします。 -
左のナビゲーションペインで、[トピック] を選択します。
-
[トピック] ページで、[トピックの作成] を選択します。
-
[Details] (詳細) で、[Standard] (標準) タイプを選択します。デフォルトでは、コンソールはFIFOトピックを作成します。
-
名前 にトピックSNS名を入力します。このチュートリアルでは、
high_temp_notice
と入力します。 -
ページの最下部にスクロールし、[Create topic] (トピックの作成) を選択します。
コンソールに新しいトピックの [詳細] ページが表示されます。
-
-
Amazon SNSサブスクリプションを作成します。
注記
このサブスクリプションで使用する電話番号では、このチュートリアルで送信するメッセージのテキストメッセージ料金が発生する可能性があります。
-
high_temp_notice トピックの詳細ページで、[Create subscription] (サブスクリプションの作成) を選択します。
-
「サブスクリプションの作成」、「詳細」セクションの「プロトコルリスト」で、「」を選択しますSMS。
-
[Endpoint] (エンドポイント) で、テキストメッセージを受信できる電話の番号を入力します。
+
で始まり、国コードと市外局番が含まれ、他の句読文字が含まれないように入力してください。 -
[Create subscription] を選択します。
-
-
Amazon SNS通知をテストします。
-
Amazon SNSコンソール
の左側のナビゲーションペインで、トピック を選択します。 -
トピックの詳細ページを開くには、[Topics] (トピック) のトピックのリストで、[high_temp_notice] を選択します。
-
[Publish message to topic] (トピックへのメッセージの発行) ページを開くには、[high_temp_notice] の詳細ページで [Publish message] (メッセージの発行) を選択します。
-
[Publish message to topic] (トピックへのメッセージの発行) の [Message body] (メッセージ本文) セクションの [Message body to send to the endpoint] (エンドポイントに送信するメッセージ本文) で、短いメッセージを入力します。
-
ページの下部まで下方向にスクロールし、[Publish message] (メッセージの発行) を選択します。
-
サブスクリプションを作成するときに以前に使用した番号の電話で、メッセージが受信されたことを確認します。
テストメッセージが受信されない場合は、電話番号と電話の設定を再度確認してください。
チュートリアルを続行する前に、Amazon SNSコンソール
からテストメッセージを公開できることを確認してください。 -
ステップ 2: テキストメッセージを送信する AWS IoT ルールを作成する
このチュートリアルで作成する AWS IoT ルールは、
がメッセージを送信したデバイスの ID であるdevice_id
device/
MQTTトピックをサブスクライブします。これらのトピックは、device_id
/datadevice/+/data
としてトピックフィルターで記述されます。ここで、+
は、2 つのスラッシュ文字の間の任意の文字列に一致するワイルドカードです。このルールは、メッセージペイロードの temperature
フィールドの値もテストします。
ルールは、一致するトピックからメッセージを受信すると、トピック名、メッセージペイロードtemperature
の値
から を取得し、テストする制限に一定の値を追加し、これらの値をJSONドキュメントとして Amazon SNS通知トピックに送信します。device_id
例えば、気象センサーデバイス番号 32 からのMQTTメッセージは device/32/data
トピックを使用し、次のようなメッセージペイロードがあります。
{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
ルールのルールクエリステートメントは、メッセージペイロードから temperature
の値を受け取り、トピック名
から の値を受け取り、次のようなメッセージペイロードを Amazon SNSトピックに送信するための定数device_id
max_temperature
値を追加します。
{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30 }
制限を超えた温度値を検出し、Amazon SNSトピックに送信するデータを作成する AWS IoT ルールを作成するには
-
AWS IoT コンソール のルールハブ
を開きます。 -
これが最初のルールである場合は、[Create] (作成) または [Create a rule] (ルールの作成) を選択します。
-
[Create a rule] (ルールの作成) で以下のとおり操作します。
-
[名前] に「
temp_limit_notify
」と入力します。ルール名は AWS アカウント および リージョン内で一意でなければならず、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の単語を区切りました。
-
[Description] (説明) で、ルールの説明を入力します。
わかりやすい説明を使用すると、このルールの動作と作成した理由を簡単に思い出すことができます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。
-
-
[Create a rule] (ルールを作成) の [Rule query statement] (ルールクエリステートメント) で、以下を実行します。
-
SQL バージョン の使用で、2016-03-23 を選択します。
-
[Rule query statement] (ルールクエリステートメント) 編集ボックスで、ステートメントを入力します。
SELECT topic(2) as device_id, temperature as reported_temperature, 30 as max_temperature FROM 'device/+/data' WHERE temperature > 30
このステートメント:
-
トピックフィルターに一致し、
temperature
値が 30 を超えるdevice/+/data
トピックを含むMQTTメッセージをリッスンします。 -
トピック文字列から 2 番目の要素を選択し、
device_id
フィールドに割り当てます。 -
メッセージペイロードから値
temperature
フィールドを選択し、reported_temperature
フィールドに割り当てます。 -
制限値を表す定数値
30
を作成し、それをmax_temperature
フィールドに割り当てます。
-
-
-
このルールのルールアクションのリストを開くには、[Set one or more actions] (1 つ以上のアクションを設定する) で [Add action] (アクションの追加) を選択します。
-
アクションを選択 で、SNSプッシュ通知としてメッセージを送信 を選択します。
-
選択したアクションの設定ページを開くには、アクションリストの下部にある [Configure action] (アクションの設定) を選択します。
-
[Configure action] (アクションの設定) で、次のとおり実行します。
-
SNS ターゲット で、「 を選択」を選択し、high_temp_notice という名前のSNSトピックを検索し、「 を選択」を選択します。
-
メッセージ形式 で、 を選択しますRAW。
-
このアクションを実行するための AWS IoT アクセスを付与するロールを選択または作成する で、ロールの作成 を選択します。
-
[Create a new role] (新しいロールの作成) の [Name] (名前) で、新しいロールの一意の名前を入力します。このチュートリアルでは、
sns_rule_role
を使用します。 -
[ロールの作成] を選択します。
このチュートリアルを繰り返す場合、または既存のロールを再利用する場合は、続行する前に [Update role] (ロールの更新) を選択してください。これにより、ロールのポリシードキュメントが更新され、SNSターゲットと連携します。
-
-
[Add action] (アクションの追加) を選択して、[Create a rule] (ルールの作成) ページに戻ります。
新しいアクションのタイルの下のSNSプッシュ通知としてメッセージを送信すると、ルールが呼び出すSNSトピックが表示されます。
このルールに追加するルールアクションはこれだけです。
-
ルールを作成してこの手順を完了するには、[Create a rule] (ルールの作成) で一番下までスクロールし、[Create rule] (ルールの作成) を選択します。
ステップ 3: AWS IoT ルールと Amazon SNS通知をテストする
新しいルールをテストするには、MQTTクライアントを使用して、このルールで使用されるMQTTメッセージを公開およびサブスクライブします。
MQTT コンソールで AWS IoT クライアント
MQTT クライアントを使用してルールをテストするには
-
MQTT コンソール の AWS IoT クライアントで
、入力トピックをサブスクライブします。この場合は、 です device/+/data
。-
MQTT クライアントで、サブスクリプション で、トピック にサブスクライブを選択します。
-
[Subscription topic] (サブスクリプショントピック) で、入力トピックフィルター
device/+/data
のトピックを入力します。 -
残りのフィールドはデフォルト設定のままにします。
-
[Subscribe to topic] を選択します。
[Subscriptions] (サブスクリプション) 列の [Publish to a topic] (トピックへの発行) の下に
device/+/data
が表示されます。
-
-
特定のデバイス ID
device/32/data
を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含むMQTTトピックに公開することはできません。-
MQTT クライアントで、サブスクリプション で、トピック に発行 を選択します。
-
[Publish] (発行) フィールドに、入力トピック名
device/32/data
を入力します。 -
ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。
{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
トピックに発行を選択してMQTT、メッセージを公開します。
-
-
テキストメッセージが送信されたことを確認します。
-
MQTT クライアントでは、サブスクリプション の下に、以前にサブスクライブしたトピックの横に緑色のドットがあります。
緑色のドットは、最後にメッセージを表示してから 1 つ以上の新しいメッセージが受信されたことを示します。
-
[Subscriptions] (サブスクリプション) で [device/+/data] を選択して、メッセージペイロードが今発行したものと一致し、次のようになっていることを確認します。
{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
SNS トピックのサブスクライブに使用した電話を確認し、メッセージペイロードの内容が次のように表示されることを確認します。
{"device_id":"32","reported_temperature":38,"max_temperature":30}
device_id
値は引用符で囲まれた文字列で、temperature
値は数値であることに注意してください。これは、topic()
関数が入力メッセージのトピック名から文字列を抽出している一方で、temperature
値は入力メッセージのペイロードの数値を使用することによるものです。device_id
値を数値にしたい場合は、ルールクエリステートメントでtopic(2)
を次のように置き換えます。cast(topic(2) AS DECIMAL)
topic(2)
値を数値にキャストすると、トピックのその部分に数字のみが含まれている場合にのみDECIMAL
値が機能することに注意してください。
-
-
温度が制限を超えないMQTTメッセージを送信してみてください。
-
MQTT クライアントで、サブスクリプション で、トピック に発行 を選択します。
-
[Publish] (発行) フィールドに、入力トピック名
device/33/data
を入力します。 -
ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
MQTT メッセージを送信するには、「トピック に発行」を選択します。
device/+/data
サブスクリプションで送信したメッセージが表示されます。ただし、温度値がルールクエリステートメントの最大温度を下回っているため、テキストメッセージは受信されません。正しい動作が確認できない場合は、トラブルシューティングのヒントを確認してください。
-
SNS メッセージルールのトラブルシューティング
想定する結果が得られない場合に備えて、確認すべき事項をいくつか示します。
-
エラーバナーが表示された
入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。
-
MQTT クライアントに入力メッセージが表示されない
入力メッセージを
device/22/data
トピックに発行するたびに、手順で説明されているようにdevice/+/data
トピックフィルターにサブスクライブした場合、そのメッセージがMQTTクライアントに表示されるはずです。確認すべき事項
-
サブスクライブしたトピックフィルターを確認する
手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。
メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。
-
メッセージ発行機能を確認する
MQTT クライアントで、サブスクリプション で device/+/data を選択し、発行メッセージのトピックを確認してから、トピック に発行を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。
-
-
SMS メッセージを受信しない
ルールが機能するには、メッセージを受信してSNS通知を送信することを許可する正しいポリシーがあり、メッセージを受信する必要があります。
確認すべき事項
-
AWS リージョン MQTT クライアントの と作成したルールを確認する
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
-
メッセージペイロードの温度値がテストしきい値を超えていることを確認します。
ルールクエリステートメントで定義されている温度値が 30 以下の場合、ルールはそのアクションを実行しません。
-
ルールクエリステートメントの入力メッセージのトピックを確認する
ルールが機能するには、ルールクエリステートメントの FROM句のトピックフィルターに一致するトピック名を含むメッセージを受信する必要があります。
ルールクエリステートメントのトピックフィルターのスペルを、MQTTクライアント内のトピックのスペルで確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
-
入力メッセージペイロードの内容を確認する
ルールが機能するには、SELECTステートメントで宣言されたメッセージペイロードのデータフィールドを見つける必要があります。
ルールクエリステートメントの
temperature
フィールドのスペルを、MQTTクライアント内のメッセージペイロードのスペルと照合します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントのtemperature
フィールドはメッセージペイロードのtemperature
フィールドと同じである必要があります。メッセージペイロード内のJSONドキュメントが正しくフォーマットされていることを確認します。にカンマの欠落などのエラーJSONがある場合、ルールはそれを読み取ることができません。
-
ルールアクションで再発行されたメッセージトピックを確認する
ルールの再発行アクションが新しいメッセージを公開するトピックは、MQTTクライアントでサブスクライブしたトピックと一致する必要があります。
コンソールで作成したルールを開き、ルールアクションがメッセージを再発行するトピックを確認します。
-
ルールによって使用されているロールを確認する
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。
ルールがメッセージデータを受信して再発行することを許可するポリシーは、使用されるトピックに固有です。メッセージデータの再発行に使用するトピックを変更する場合は、ルールアクションのロールを更新して、現在のトピックに一致するようにポリシーを更新する必要があります。
これが問題であると思われる場合は、再発行ルールアクションを編集して、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。
-
ステップ 4: 結果と次のステップを確認する
このチュートリアルでは、次の作業を行いました。
-
Amazon SNS通知トピックとサブスクリプションを作成してテストしました。
-
ルールSQLクエリステートメントで単純なクエリと関数を使用して、通知の新しいメッセージを作成しました。
-
カスタマイズされたメッセージペイロードを使用する Amazon SNS通知を送信する AWS IoT ルールを作成しました。
-
MQTT クライアントを使用して AWS IoT ルールをテストしました。
次のステップ
このルールを使用していくつかのテキストメッセージを送信した後、チュートリアルの一部を変更すると、メッセージと送信される場合にどのような影響があるかを試してみてください。手始めにいくつかアイデアをご紹介します。
-
の変更
device_id
入力メッセージのトピックで、テキストメッセージの内容で効果を観察します。 -
ルールクエリステートメントで選択したフィールドを変更し、テキストメッセージの内容に生じる影響を確認します。
-
ルールクエリステートメントのテストを変更して、最高温度ではなく最低温度をテストします。
max_temperature
の名前を変更することを忘れないでください! -
SNS 通知の送信時にMQTTメッセージを送信する再発行ルールアクションを追加します。
-
このシリーズの次のチュートリアルを試して、チュートリアル: デバイスデータの DynamoDB テーブルへの保存 の方法を学びましょう。