チュートリアル: Amazon SNS通知の送信 - AWS IoT Core

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

チュートリアル: 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 分ほどかかります。

このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。

ステップ 1: SMSテキストメッセージを送信する Amazon SNSトピックを作成する

この手順では、気象センサーがメッセージデータを送信できる Amazon SNSトピックを作成する方法について説明します。その後、Amazon SNSトピックは、すべてのサブスクライバーに、温度制限を超えたことをSMSテキストメッセージで通知します。

SMS テキストメッセージを送信する Amazon SNSトピックを作成するには
  1. Amazon SNSトピックを作成します。

    1. Amazon SNSコンソール にサインインします。

    2. 左のナビゲーションペインで、[トピック] を選択します。

    3. [トピック] ページで、[トピックの作成] を選択します。

    4. [Details] (詳細) で、[Standard] (標準) タイプを選択します。デフォルトでは、コンソールはFIFOトピックを作成します。

    5. 名前 にトピックSNS名を入力します。このチュートリアルでは、high_temp_notice と入力します。

    6. ページの最下部にスクロールし、[Create topic] (トピックの作成) を選択します。

      コンソールに新しいトピックの [詳細] ページが表示されます。

  2. Amazon SNSサブスクリプションを作成します。

    注記

    このサブスクリプションで使用する電話番号では、このチュートリアルで送信するメッセージのテキストメッセージ料金が発生する可能性があります。

    1. high_temp_notice トピックの詳細ページで、[Create subscription] (サブスクリプションの作成) を選択します。

    2. 「サブスクリプションの作成」、「詳細」セクションの「プロトコルリスト」で、「」を選択しますSMS

    3. [Endpoint] (エンドポイント) で、テキストメッセージを受信できる電話の番号を入力します。+ で始まり、国コードと市外局番が含まれ、他の句読文字が含まれないように入力してください。

    4. [Create subscription] を選択します。

  3. Amazon SNS通知をテストします。

    1. Amazon SNSコンソール の左側のナビゲーションペインで、トピック を選択します。

    2. トピックの詳細ページを開くには、[Topics] (トピック) のトピックのリストで、[high_temp_notice] を選択します。

    3. [Publish message to topic] (トピックへのメッセージの発行) ページを開くには、[high_temp_notice] の詳細ページで [Publish message] (メッセージの発行) を選択します。

    4. [Publish message to topic] (トピックへのメッセージの発行) の [Message body] (メッセージ本文) セクションの [Message body to send to the endpoint] (エンドポイントに送信するメッセージ本文) で、短いメッセージを入力します。

    5. ページの下部まで下方向にスクロールし、[Publish message] (メッセージの発行) を選択します。

    6. サブスクリプションを作成するときに以前に使用した番号の電話で、メッセージが受信されたことを確認します。

    テストメッセージが受信されない場合は、電話番号と電話の設定を再度確認してください。

    チュートリアルを続行する前に、Amazon SNSコンソールからテストメッセージを公開できることを確認してください。

ステップ 2: テキストメッセージを送信する AWS IoT ルールを作成する

このチュートリアルで作成する AWS IoT ルールは、 device_idがメッセージを送信したデバイスの ID であるdevice/device_id/dataMQTTトピックをサブスクライブします。これらのトピックは、device/+/data としてトピックフィルターで記述されます。ここで、+ は、2 つのスラッシュ文字の間の任意の文字列に一致するワイルドカードです。このルールは、メッセージペイロードの temperature フィールドの値もテストします。

ルールは、一致するトピックからメッセージを受信すると、トピック名、メッセージペイロードtemperatureの値device_idから を取得し、テストする制限に一定の値を追加し、これらの値をJSONドキュメントとして Amazon SNS通知トピックに送信します。

例えば、気象センサーデバイス番号 32 からのMQTTメッセージは device/32/dataトピックを使用し、次のようなメッセージペイロードがあります。

{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }

ルールのルールクエリステートメントは、メッセージペイロードから temperature の値を受け取り、トピック名device_idから の値を受け取り、次のようなメッセージペイロードを Amazon SNSトピックに送信するための定数max_temperature値を追加します。

{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30 }
制限を超えた温度値を検出し、Amazon SNSトピックに送信するデータを作成する AWS IoT ルールを作成するには
  1. AWS IoT コンソール のルールハブを開きます。

  2. これが最初のルールである場合は、[Create] (作成) または [Create a rule] (ルールの作成) を選択します。

  3. [Create a rule] (ルールの作成) で以下のとおり操作します。

    1. [名前] に「temp_limit_notify」と入力します。

      ルール名は AWS アカウント および リージョン内で一意でなければならず、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の単語を区切りました。

    2. [Description] (説明) で、ルールの説明を入力します。

      わかりやすい説明を使用すると、このルールの動作と作成した理由を簡単に思い出すことができます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。

  4. [Create a rule] (ルールを作成) の [Rule query statement] (ルールクエリステートメント) で、以下を実行します。

    1. SQL バージョン の使用で、2016-03-23 を選択します。

    2. [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 フィールドに割り当てます。

  5. このルールのルールアクションのリストを開くには、[Set one or more actions] (1 つ以上のアクションを設定する) で [Add action] (アクションの追加) を選択します。

  6. アクションを選択 で、SNSプッシュ通知としてメッセージを送信 を選択します。

  7. 選択したアクションの設定ページを開くには、アクションリストの下部にある [Configure action] (アクションの設定) を選択します。

  8. [Configure action] (アクションの設定) で、次のとおり実行します。

    1. SNS ターゲット で、を選択」を選択し、high_temp_notice という名前のSNSトピックを検索し、「 を選択」を選択します。

    2. メッセージ形式 で、 を選択しますRAW

    3. このアクションを実行するための AWS IoT アクセスを付与するロールを選択または作成する で、ロールの作成 を選択します。

    4. [Create a new role] (新しいロールの作成) の [Name] (名前) で、新しいロールの一意の名前を入力します。このチュートリアルでは、sns_rule_role を使用します。

    5. [ロールの作成] を選択します。

    このチュートリアルを繰り返す場合、または既存のロールを再利用する場合は、続行する前に [Update role] (ロールの更新) を選択してください。これにより、ロールのポリシードキュメントが更新され、SNSターゲットと連携します。

  9. [Add action] (アクションの追加) を選択して、[Create a rule] (ルールの作成) ページに戻ります。

    新しいアクションのタイルの下のSNSプッシュ通知としてメッセージを送信すると、ルールが呼び出すSNSトピックが表示されます。

    このルールに追加するルールアクションはこれだけです。

  10. ルールを作成してこの手順を完了するには、[Create a rule] (ルールの作成) で一番下までスクロールし、[Create rule] (ルールの作成) を選択します。

ステップ 3: AWS IoT ルールと Amazon SNS通知をテストする

新しいルールをテストするには、MQTTクライアントを使用して、このルールで使用されるMQTTメッセージを公開およびサブスクライブします。

MQTT コンソールで AWS IoT クライアントを新しいウィンドウで開きます。これにより、MQTTクライアントの設定を失うことなくルールを編集できます。MQTT クライアントを離れてコンソールの別のページに移動しても、サブスクリプションやメッセージログは保持されません。

MQTT クライアントを使用してルールをテストするには
  1. MQTT コンソール の AWS IoT クライアントで、入力トピックをサブスクライブします。この場合は、 ですdevice/+/data

    1. MQTT クライアントで、サブスクリプション で、トピック にサブスクライブを選択します。

    2. [Subscription topic] (サブスクリプショントピック) で、入力トピックフィルター device/+/data のトピックを入力します。

    3. 残りのフィールドはデフォルト設定のままにします。

    4. [Subscribe to topic] を選択します。

      [Subscriptions] (サブスクリプション) 列の [Publish to a topic] (トピックへの発行) の下に device/+/data が表示されます。

  2. 特定のデバイス ID device/32/data を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含むMQTTトピックに公開することはできません。

    1. MQTT クライアントで、サブスクリプション で、トピック に発行 を選択します。

    2. [Publish] (発行) フィールドに、入力トピック名 device/32/data を入力します。

    3. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. トピックに発行を選択してMQTT、メッセージを公開します。

  3. テキストメッセージが送信されたことを確認します。

    1. MQTT クライアントでは、サブスクリプション の下に、以前にサブスクライブしたトピックの横に緑色のドットがあります。

      緑色のドットは、最後にメッセージを表示してから 1 つ以上の新しいメッセージが受信されたことを示します。

    2. [Subscriptions] (サブスクリプション) で [device/+/data] を選択して、メッセージペイロードが今発行したものと一致し、次のようになっていることを確認します。

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    3. 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 値が機能することに注意してください。

  4. 温度が制限を超えないMQTTメッセージを送信してみてください。

    1. MQTT クライアントで、サブスクリプション で、トピック に発行 を選択します。

    2. [Publish] (発行) フィールドに、入力トピック名 device/33/data を入力します。

    3. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. 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 テーブルへの保存 の方法を学びましょう。