チュートリアル: 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 トピックを作成する

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

  1. Amazon SNS トピックを作成する。

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

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

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

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

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

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

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

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

    注記

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

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

    2. [Create subscription] (サブスクリプションの作成) の [Details] (詳細) セクションの [Protocol] (プロトコル) リストで、[SMS]を選択します。

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

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

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

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

    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/data MQTT トピックをサブスクライブします。これらのトピックは、device/+/data としてトピックフィルターで記述されます。ここで、+ は、2 つのスラッシュ文字の間の任意の文字列に一致するワイルドカードです。このルールは、メッセージペイロードの temperature フィールドの値もテストします。

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

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

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

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

{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30 }

上限を超える温度値を検出し、Amazon SNS トピックに送信するデータを作成する AWS IoT ルールを作成するには

  1. AWS IoT コンソールの [Rules] (ルール) ハブを開きます。

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

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

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

      ルール名は、AWS アカウント とリージョン内で一意である必要があります。また、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の単語を区切りました。

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

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

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

    1. [Using SQL version] (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

      このステートメント:

      • device/+/data トピックフィルターに一致し、temperature 値が 30 より大きいトピックを含む MQTT メッセージをリッスンします。

      • トピック文字列から 2 番目の要素を選択し、device_id フィールドに割り当てます。

      • メッセージペイロードから値 temperature フィールドを選択し、reported_temperature フィールドに割り当てます。

      • 制限値を表す定数値 30 を作成し、それを max_temperature フィールドに割り当てます。

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

  6. [Select an action] (アクションを選択してください) で、[Send a message as an SNS push notification] (SNS プッシュ通知としてメッセージを送信する) を選択します。

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

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

    1. SNS ターゲットで、[Select] (選択) を選択し、high_temp_notice という名前の SNS トピックを見つけて、[Select] (選択) を選択します。

    2. [Message format] (メッセージ形式) で、[RAW] を選択します。

    3. [Choose or create a role to grant AWS IoT access to perform this action] (このアクションを実行するための AWS IoT アクセス権限を付与するロールを選択または作成します) で、[Create Role] (ロールの作成) を選択します。

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

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

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

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

    新しいアクションのタイルの [Send a message as an SNS push notification] (SNS プッシュ通知としてメッセージを送信する) の下に、ルールが呼び出す SNS トピックが表示されます。

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

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

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

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

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

MQTT クライアントを使用してルールをテストするには

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

    1. MQTT クライアントの [Subscription] (サブスクリプション)で、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。

    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 クライアントの [Subscription] (サブスクリプション)で、[Publish to topic] (トピックに発行) を選択します。

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

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

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

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

    1. MQTT クライアントの [Subscriptions] (サブスクリプション) の下に、以前にサブスクライブしたトピックの隣に緑色のドットが表示されます。

      緑色のドットは、最後にメッセージを表示してから 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 クライアントの [Subscription] (サブスクリプション)で、[Publish to topic] (トピックに発行) を選択します。

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

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

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. MQTT メッセージを送信するには、[Publish to topic] (トピックに発行) を選択します。

    device/+/data サブスクリプションで送信したメッセージが表示されます。ただし、温度値がルールクエリステートメントの最大温度を下回っているため、テキストメッセージは受信されません。

    正しい動作が確認できない場合は、トラブルシューティングのヒントを確認してください。

SNS メッセージルールのトラブルシューティング

想定する結果が得られない場合に備えて、確認すべき事項をいくつか示します。

  • エラーバナーが表示された

    入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。

  • MQTT クライアントで入力メッセージが表示されない

    手順で説明されているように device/+/data トピックフィルターをサブスクライブした場合、入力メッセージを device/22/data トピックに発行するたびに、そのメッセージが MQTT クライアントに表示されます。

    確認すべき事項

    • サブスクライブしたトピックフィルターを確認する

      手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。

      メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。

    • メッセージ発行機能を確認する

      MQTT クライアントの [Subscriptions] (サブスクリプション) で、[device/+/data] を選択し、パブリッシュ メッセージのトピックを確認してから、[Publish to topic] (トピックに発行) を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。

  • SMS メッセージが届かない

    ルールが機能するには、メッセージの受信と SNS 通知の送信を許可する正しいポリシーを有しており、メッセージを受信する必要があります。

    確認すべき事項

    • MQTT クライアントの AWS リージョン と作成したルールを確認する

      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 テーブルへの保存 の方法を学びましょう。