

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

# チュートリアル: Amazon SNS 通知の送信
<a name="iot-sns-rule"></a>

このチュートリアルでは、MQTT メッセージデータを Amazon SNS トピックに送信して SMS テキストメッセージとして送信できるようにする AWS IoT ルールを作成する方法を示します。

このチュートリアルでは、温度がルールで設定された値を超えるたびに、気象センサーから Amazon SNS トピックのすべてのサブスクライバーにメッセージデータを送信するルールを作成します。ルールは、報告された温度がルールで設定された値を超えたことを検出し、そのとき、デバイス ID、報告された温度、および超過した温度制限のみを含む新しいメッセージペイロードを作成します。ルールは、新しいメッセージペイロードを JSON ドキュメントとして SNS トピックに送信し、このトピックが SNS トピックのすべてのサブスクライバーに通知します。

**このチュートリアルでは、次の内容を学習します。**
+ Amazon SNS 通知を作成してテストする方法
+  AWS IoT ルールから Amazon SNS 通知を呼び出す方法
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
+ MQTT クライアントを使用して AWS IoT ルールをテストする方法

このチュートリアルの完了には 30 分ほどかかります。

**Topics**
+ [ステップ 1: SMS テキストメッセージを送信する Amazon SNS トピックを作成する](#iot-sns-rule-create-sns-topic)
+ [ステップ 2: テキストメッセージを送信する AWS IoT ルールを作成する](#iot-sns-rule-create-rule)
+ [ステップ 3: AWS IoT ルールと Amazon SNS 通知をテストする](#iot-sns-rule-test-rule)
+ [ステップ 4: 結果と次のステップを確認する](#iot-sns-rule-review-results)

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

**[セットアップ AWS アカウント](setting-up.md)**  
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。
+ 

**[MQTT クライアントで AWS IoT MQTT メッセージを表示する](view-mqtt-messages.md) を確認したこと**  
トピックにサブスクライブおよび発行するために MQTT クライアントを使用できることを確認してください。この手順では、MQTT クライアントを使用して新しいルールをテストします。
+ 

**[Amazon Simple Notification Service](https://docs.aws.amazon.com//sns/latest/dg/welcome.html) を確認しました**  
これまでに Amazon SNS を使用したことがない場合は、[Amazon SNS へのアクセスの設定](https://docs.aws.amazon.com//sns/latest/dg/sns-setting-up.html)を確認してください。他の AWS IoT チュートリアルをすでに完了している場合は、 AWS アカウント が正しく設定されている必要があります。

## ステップ 1: SMS テキストメッセージを送信する Amazon SNS トピックを作成する
<a name="iot-sns-rule-create-sns-topic"></a>

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

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

1. **Amazon SNS トピックを作成します。**

   1. [Amazon SNS コンソール](https://console.aws.amazon.com//sns/home)にサインインします。

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

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

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

   1. **[Name]** (名前) で、SNS トピック名を入力します。このチュートリアルでは、**high\$1temp\$1notice** と入力します。

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

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

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

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

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

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

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

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

   1. [Amazon SNS コンソール](https://console.aws.amazon.com//sns/home)の左のナビゲーションペインで、**[Topics]** (トピック) を選択します。

   1. トピックの詳細ページを開くには、**[Topics]** (トピック) のトピックのリストで、**[high\$1temp\$1notice]** を選択します。

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

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

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

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

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

   チュートリアルを続行する前に、[Amazon SNS コンソール](https://console.aws.amazon.com//sns/home)からテストメッセージを発行できることを確認してください。

## ステップ 2: テキストメッセージを送信する AWS IoT ルールを作成する
<a name="iot-sns-rule-create-rule"></a>

このチュートリアルで作成する 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
}
```

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

1. [AWS IoT コンソールの**ルール**ハブを開きます](https://console.aws.amazon.com//iot/home#/rulehub)。

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

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

   1. [**名前**] に「**temp\$1limit\$1notify**」と入力します。

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

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

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

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

   1.  **[Using SQL version]** (SQL バージョンの使用) で、**2016-03-23** を選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

## ステップ 3: AWS IoT ルールと Amazon SNS 通知をテストする
<a name="iot-sns-rule-test-rule"></a>

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

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

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

1. [AWS IoT コンソールの MQTT クライアント](https://console.aws.amazon.com//iot/home#/test)で、入力トピック (この場合は `device/+/data`) をサブスクライブします。

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

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

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

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

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

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

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

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

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

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

   1. **[Publish to topic]** (トピックに発行) を選択して、MQTT メッセージを発行します。

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

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

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

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

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

   1. SNS トピックのサブスクライブに使用した電話を確認し、メッセージペイロードの内容が次のようになっていることを確認します。

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

      `device_id` 値は引用符で囲まれた文字列で、`temperature` 値は数値であることに注意してください。これは、[https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-function-topic) 関数が入力メッセージのトピック名から文字列を抽出している一方で、`temperature` 値は入力メッセージのペイロードの数値を使用することによるものです。

      `device_id` 値を数値にしたい場合は、ルールクエリステートメントで `topic(2)` を次のように置き換えます。

      ```
      cast(topic(2) AS DECIMAL)
      ```

      `topic(2)` 値を数値にキャストすると、トピックのその部分に数字のみが含まれている場合にのみ `DECIMAL` 値が機能することに注意してください。

1. 温度が制限を超えていない MQTT メッセージの送信を試みます。

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

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

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

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

   1. MQTT メッセージを送信するには、[**Publish to topic**] (トピックに発行) を選択します。

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

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

### SNS メッセージルールのトラブルシューティング
<a name="iot-sns-rule-trouble"></a>

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

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

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

**確認すべき事項**
  + 

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

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

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

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

**確認すべき事項**
  + 

**AWS リージョン MQTT クライアントの と作成したルールを確認する**  
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
  + 

**メッセージペイロードの温度値がテストしきい値を超えていることを確認します。**  
ルールクエリステートメントで定義されている温度値が 30 以下の場合、ルールはそのアクションを実行しません。
  + 

**ルールクエリステートメントの入力メッセージのトピックを確認する**  
ルールが機能するためには、ルールクエリステートメントの FROM 句のトピックフィルターに一致するトピック名を持つメッセージを受信する必要があります。

    ルールクエリステートメントのトピックフィルターの綴りを、MQTT クライアントのトピックフィルターの綴りと照らし合わせて確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
  + 

**入力メッセージペイロードの内容を確認する**  
ルールが機能するためには、SELECT ステートメントで宣言されているメッセージペイロード内のデータフィールドを見つける必要があります。

    ルールクエリステートメントの `temperature` フィールドの綴りを、MQTT クライアントのメッセージペイロードの綴りと照らし合わせて確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントの `temperature` フィールドはメッセージペイロードの `temperature` フィールドと同じである必要があります。

    メッセージペイロード内の JSON ドキュメントが正しくフォーマットされていることを確認します。JSON にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。
  + 

**ルールアクションで再発行されたメッセージトピックを確認する**  
再発行ルールアクションが新しいメッセージを発行するトピックは、MQTT クライアントでサブスクライブしたトピックと一致する必要があります。

    コンソールで作成したルールを開き、ルールアクションがメッセージを再発行するトピックを確認します。
  + 

**ルールによって使用されているロールを確認する**  
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。

    ルールがメッセージデータを受信して再発行することを許可するポリシーは、使用されるトピックに固有です。メッセージデータの再発行に使用するトピックを変更する場合は、ルールアクションのロールを更新して、現在のトピックに一致するようにポリシーを更新する必要があります。

    これが問題であると思われる場合は、再発行ルールアクションを編集して、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。

## ステップ 4: 結果と次のステップを確認する
<a name="iot-sns-rule-review-results"></a>

**このチュートリアルでは、次の作業を行いました。**
+ Amazon SNS 通知トピックとサブスクリプションを作成し、テストしました。
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用して、通知用の新しいメッセージを作成しました。
+ カスタマイズされたメッセージペイロードを使用した Amazon SNS 通知を送信する AWS IoT ルールを作成しました。
+ MQTT クライアントを使用して AWS IoT ルールをテストしました。

**次の手順**  
このルールを使用していくつかのテキストメッセージを送信した後、チュートリアルの一部を変更すると、メッセージと送信される場合にどのような影響があるかを試してみてください。手始めにいくつかアイデアをご紹介します。
+ 入力メッセージのトピックの *device\$1id* を変更し、テキストメッセージの内容に生じる影響を確認します。
+ ルールクエリステートメントで選択したフィールドを変更し、テキストメッセージの内容に生じる影響を確認します。
+ ルールクエリステートメントのテストを変更して、最高温度ではなく最低温度をテストします。`max_temperature` の名前を変更することを忘れないでください\$1
+ SNS 通知の送信時に MQTT メッセージを送信する再発行ルールアクションを追加します。
+ このシリーズの次のチュートリアルを試して、[チュートリアル: デバイスデータの DynamoDB テーブルへの保存](iot-ddb-rule.md) の方法を学びましょう。