

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

# デバイスデータを他の サービスにルーティングする AWS IoT ルールの作成
<a name="iot-rules-tutorial"></a>

これらのチュートリアルでは、より一般的な AWS IoT ルールアクションを使用してルールを作成およびテストする方法を示します。

AWS IoT ルールは、デバイスから他の AWS サービスにデータを送信します。特定の MQTT メッセージをリッスンし、メッセージペイロード内のデータをフォーマットし、結果を他の AWS のサービスに送信します。

Lambda 関数やそれ以上に複雑なものを使用するルールを作成することが目標であっても、ここに示されている順序でこれらを試すことをお勧めします。チュートリアルは、基本的なものから複雑なものへと順に表示されます。新しい概念を段階的に提示することで、特定のチュートリアルを持たないルールアクションの作成に使用できる概念を学習するのに役立ちます。

**注記**  
AWS IoT ルールは、IoT デバイスから他の AWS サービスにデータを送信するのに役立ちます。ただし、これを正常に実行するには、データを送信する他のサービスに関する実用的な知識が必要です。これらのチュートリアルでは、タスクを完了するために必要な情報が提供されていますが、ソリューションで使用する前に、データの送信先のサービスについて詳しく知っておくと便利です。他のサービスの詳細な説明 AWS は、これらのチュートリアルの範囲外です。

**チュートリアルのシナリオの概要**  
これらのチュートリアルのシナリオは、定期的にデータを発行する気象センサーデバイスのシナリオです。この架空のシステムには、このようなセンサー装置がたくさんあります。ただし、このセクションのチュートリアルでは、1 つのデバイスに焦点を当てつつ、複数のセンサーに対応する方法を示します。

このセクションのチュートリアルでは、 AWS IoT ルールを使用して、気象センサーデバイスのこの架空のシステムで次のタスクを実行する方法を示します。
+ 

**[チュートリアル: MQTT メッセージの再発行](iot-repub-rule.md)**  
このチュートリアルでは、気象センサーから受信した MQTT メッセージを、センサー ID と温度値のみを含むメッセージとして再発行する方法を示します。 AWS IoT Core サービスのみを使用し、シンプルな SQL クエリと MQTT クライアントを使用してルールをテストする方法をデモンストレーションします。
+ 

**[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)**  
このチュートリアルでは、気象センサーデバイスの値が特定の値を超えた場合に SNS メッセージを送信する方法を示します。前のチュートリアルで説明した概念に基づいており、別の AWS サービスである [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-getting-started.html)の演習を行います。
+ 

**[チュートリアル: デバイスデータの DynamoDB テーブルへの保存](iot-ddb-rule.md)**  
このチュートリアルでは、気象センサーデバイスのデータをデータベーステーブルに保存する方法を示します。ルールクエリステートメントと置換テンプレートを使用して、送信先のサービスである [Amazon DynamoDB](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/Introduction.html) のメッセージデータをフォーマットします。

  DynamoDB を初めて使用する場合は、このチュートリアルを開始する前に、[開始方法](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)の演習を行います。
+ 

**[チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする](iot-lambda-rule.md)**  
このチュートリアルでは、Lambda 関数を呼び出してデバイスデータを再フォーマットし、それをテキストメッセージとして送信する方法を示します。[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html) 関数に Python スクリプトと AWS SDK 関数を追加して、気象センサーデバイスからのメッセージペイロードデータでフォーマットし、テキストメッセージを送信します。

  Lambda を初めて使用する場合は、このチュートリアルを開始する前に、[開始方法](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)の演習を行います。

**AWS IoT ルールの概要**  
これらのチュートリアルはすべて AWS IoT ルールを作成します。

デバイスから別の AWS サービスにデータを送信する AWS IoT ルールには、以下を使用します。


+ ルールクエリステートメントは、次のもので構成されます。
  + メッセージペイロードからデータを選択してフォーマットする SQL SELECT 句
  + 使用するメッセージを識別するトピックフィルター (ルールクエリステートメントの FROM オブジェクト)
  + アクションを実行する特定の条件を指定するオプションの条件ステートメント (SQL WHERE 句)
+ 少なくとも 1 つのルールアクション

デバイスは、MQTT トピックにメッセージを発行します。SQL SELECT ステートメントのトピックフィルターは、ルールを適用する MQTT トピックを識別します。SQL SELECT ステートメントで指定されたフィールドは、ルールのアクションで使用するために、着信 MQTT メッセージペイロードからのデータをフォーマットします。ルールのすべてのアクションのリストについては、「[AWS IoT ルールのアクション](iot-rule-actions.md)」を参照してください。

**Topics**
+ [

# チュートリアル: MQTT メッセージの再発行
](iot-repub-rule.md)
+ [

# チュートリアル: Amazon SNS 通知の送信
](iot-sns-rule.md)
+ [

# チュートリアル: デバイスデータの DynamoDB テーブルへの保存
](iot-ddb-rule.md)
+ [

# チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする
](iot-lambda-rule.md)

# チュートリアル: MQTT メッセージの再発行
<a name="iot-repub-rule"></a>

このチュートリアルでは、指定された MQTT メッセージが受信されたときに MQTT メッセージを発行する AWS IoT ルールを作成する方法を示します。受信メッセージペイロードは、発行前にルールによって変更できます。これにより、デバイスやそのファームウェアを変更することなく、特定のアプリケーションに合わせたメッセージを作成できます。また、ルールのフィルタリング機能を使用して、特定の条件が満たされた場合にのみメッセージを発行することもできます。

ルールによって再発行されるメッセージは、他の AWS IoT デバイスまたはクライアントによって送信されるメッセージのように動作します。デバイスは、他の MQTT メッセージトピックにサブスクライブできるのと同様に、再発行されたメッセージにサブスクライブできます。

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

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

**Topics**
+ [

## MQTT トピックと AWS IoT ルールを確認する
](#iot-repub-rule-mqtt)
+ [

## ステップ 1: MQTT メッセージを再発行する AWS IoT ルールを作成する
](#iot-repub-rule-define)
+ [

## ステップ 2: 新しいルールをテストする
](#iot-repub-rule-test)
+ [

## ステップ 3: 結果と次のステップを確認する
](#iot-repub-rule-review)

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

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

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

## MQTT トピックと AWS IoT ルールを確認する
<a name="iot-repub-rule-mqtt"></a>

 AWS IoT ルールについて話す前に、MQTT プロトコルを理解するのに役立ちます。IoT ソリューションでは、MQTT プロトコルは HTTP などの他のネットワーク通信プロトコルよりも優れた機能を提供しているため、IoT デバイスでの使用のための選択肢として好まれています。このセクションでは、このチュートリアルに適用される MQTT の主な側面を見ていきます。MQTT と HTTP を比較する方法の詳細については、「[デバイス通信用のアプリケーションプロトコルの選択](protocols.md#protocol-selection)」を参照してください。

**MQTT プロトコル**  
MQTT プロトコルは、ホストとの発行/サブスクライブ通信モデルを使用します。データを送信するために、デバイスはトピックによって識別される AWS IoT メッセージをメッセージブローカーに発行します。メッセージブローカーからメッセージを受信するために、デバイスは、サブスクリプションリクエストでトピックフィルターをメッセージブローカーに送信することにより、受信するトピックにサブスクライブします。 AWS IoT ルールエンジンは、メッセージブローカーから MQTT メッセージを受信します。

**AWS IoT ルール**  
AWS IoT ルールは、ルールクエリステートメントと 1 つ以上のルールアクションで構成されます。 AWS IoT ルールエンジンが MQTT メッセージを受信すると、これらの要素は次のようにメッセージに対するアクションを実行します。
+ 

**ルールクエリステートメント**  
ルールのクエリステートメントは、使用する MQTT トピックを記述し、メッセージペイロードからのデータを解釈し、一般的な SQL データベースで使用されるステートメントに似た SQL ステートメントによって記述されるようにデータをフォーマットします。クエリステートメントの結果は、ルールのアクションに送信されるデータです。
+ 

**ルールアクション**  
ルールの各ルールアクションは、ルールのクエリステートメントから生じるデータに作用します。 は[多くのルールアクション](iot-rule-actions.md) AWS IoT をサポートします。ただし、このチュートリアルでは、[再発行](republish-rule-action.md) ルールアクションに焦点を当てます。このアクションは、クエリステートメントの結果を特定のトピックを持つ MQTT メッセージとして発行します。

## ステップ 1: MQTT メッセージを再発行する AWS IoT ルールを作成する
<a name="iot-repub-rule-define"></a>

このチュートリアルで作成する AWS IoT ルールは、*device\$1id* がメッセージを送信したデバイスの ID である `device/device_id/data` MQTT トピックにサブスクライブします。これらのトピックは、`device/+/data` として [トピックフィルター](topics.md#topicfilters)によって記述されます。ここで、`+` は、2 つのスラッシュ文字の間の任意の文字列に一致するワイルドカードです。

一致するトピックからルールがメッセージを受信すると、`device_id` および `temperature` の値を `device/data/temp` トピックを含む新しい MQTT メッセージとして再発行します。

例えば、`device/22/data`トピックを含む MQTT メッセージのペイロードは、以下のようになります。

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

このルールは、メッセージペイロードから `temperature` 値を、トピックから `device_id` を取得し、`device/data/temp` トピックを含む MQTT メッセージおよびメッセージペイロードとして次のように再発行します。

```
{
  "device_id": "22",
  "temperature": 28
}
```

このルールでは、デバイスの ID と温度データのみを必要とするデバイスは、`device/data/temp` トピックにサブスクライブして、その情報のみを受信します。

**MQTT メッセージを再発行するルールを作成するには**

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

1. [**Rules**] (ルール) で、[**Create**] (作成) を選択して、新しいルールの作成を開始します。

1. [**Create a rule**] (ルールを作成) の上部で、次のように操作します。

   1. **[Name]** (名前) で、ルールの名前を入力します。このチュートリアルでは、**republish\$1temp** という名前を付けます。

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

   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 FROM 'device/+/data'
      ```

      このステートメント:
      + `device/+/data` トピックフィルターに一致するトピックを持つ MQTT メッセージをリッスンします。
      + トピック文字列から 2 番目の要素を選択し、`device_id` フィールドに割り当てます。
      + メッセージペイロードから値 `temperature` フィールドを選択し、`temperature` フィールドに割り当てます。

1. [**Set one or more actions**] (1 つ以上のアクションを設定) で、以下を実行します。

   1. このルールのルールアクションのリストを開くには、[**Add action**] (アクションの追加) を選択します。

   1. **「アクションの選択**」で、**「 AWS IoT トピックへのメッセージの再発行**」を選択します。

   1. アクションリストの一番下で、[**Configure action**] (アクションを設定) を選択すると、選択したアクションの設定ページが開きます。

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

   1.  [**Topic**] (トピック) で、**device/data/temp** と入力します。これは、このルールが発行するメッセージの MQTT トピックです。

   1.  [**Quality of Service**] (サービスの品質) で、[**0 - The message is delivered zero or more times**] (0 - メッセージは 0 回以上配信されます。) を選択します。

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

      1.  [**ロールの作成**] を選択します。**[Create a new role]** (新しいロールを作成) ダイアログボックスが開きます。

      1. 新しいロールを説明する名前を入力します。このチュートリアルでは、**republish\$1role** を使用します。

         新しいロールを作成すると、ルールアクションを実行するための正しいポリシーが作成され、新しいロールにアタッチされます。このルールアクションのトピックを変更するか、別のルールアクションでこのロールを使用する場合は、そのロールのポリシーを更新して、新しいトピックまたはアクションを承認する必要があります。既存のロールを更新するには、このセクションで **[Update role]** (ロールの更新) を選択します。

      1. **[Create Role]** (ロールの作成) を選択してロールを作成し、ダイアログボックスを閉じます。

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

1. ** AWS IoT トピックアクションへのメッセージの再発行**が**「1 つ以上のアクションを設定する**」にリストされるようになりました。

   新しいアクションのタイルの **[Republish a message to an AWS IoT topic]** (IoT トピックにメッセージを再発行する) をクリックすると、再発行アクションが発行されるトピックが表示されます。

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

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

## ステップ 2: 新しいルールをテストする
<a name="iot-repub-rule-test"></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. ルールが発行するトピックをサブスクライブします: `device/data/temp`。

   1. [**Subscriptions**] (サブスクリプション) で、[**Subscribe to a topic**] (トピックへサブスクライブする) を再度選択し、[**Subscription topic**] (サブスクリプショントピック) で、再発行されたメッセージのトピック **device/data/temp** を入力します。

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

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

      [**Subscriptions**] (サブスクリプション) 列の [**device/\$1/data**] の下に **device/data/temp** が表示されます。

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

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

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

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

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

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

1. 送信されたメッセージを確認します。

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

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

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

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

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

      ```
      {
        "device_id": "22",  
        "temperature": 28
      }
      ```

      `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)` 値を数値にキャストすることは、トピックのその部分に数字のみが含まれている場合にのみ機能することに注意してください。

1. 正しいメッセージが **device/data/temp** トピックに発行されたことが確認できれば、ルールは機能しています。再発行ルールアクションの詳細については、次のセクションを参照してください。

   **device/\$1/data** または **device/data/temp** トピックのいずれかに正しいメッセージが発行されたことが確認できない場合は、トラブルシューティングのヒントを確認してください。

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

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

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

**MQTT クライアントで入力メッセージが表示されない**  
入力メッセージを `device/22/data` トピックにサブスクライブすると、そのメッセージは MQTT クライアントに表示されます。`device/+/data`トピックフィルターを選択します。

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

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

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

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

**MQTT クライアントに再発行されたメッセージが表示されない**  
ルールが機能するには、メッセージを受信および再発行することを許可する正しいポリシーを有しており、メッセージを受信する必要があります。

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

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

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

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

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

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

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

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

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

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

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

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

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

**このチュートリアルでは、次の作業を行いました。**
+ 新しい MQTT メッセージを生成するために、ルールクエリステートメントでシンプルな SQL クエリといくつかの関数を使用しました。
+ 新しいメッセージを再発行するルールを作成しました。
+ MQTT クライアントを使用して AWS IoT ルールをテストしました。

**次の手順**  
このルールでいくつかのメッセージを再発行した後、チュートリアルのいくつかの側面を変更すると、再発行メッセージにどのように影響するかを試してみてください。手始めにいくつかアイデアをご紹介します。
+ 入力メッセージのトピックで *device\$1id* を変更し、再発行されたメッセージ ペイロードの影響を観察します。
+ ルールクエリステートメントで選択したフィールドを変更し、再発行されたメッセージペイロードに生じる影響を確認します。
+ このシリーズの次のチュートリアルを試して、[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法を学びましょう。

このチュートリアルで使用する [Republish] (再発行) ルールアクションも、ルールクエリステートメントのデバッグに役立ちます。例えば、このアクションをルールに追加して、ルールクエリステートメントがルールアクションで使用されるデータをどのようにフォーマットしているかを確認できます。

# チュートリアル: 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) の方法を学びましょう。

# チュートリアル: デバイスデータの DynamoDB テーブルへの保存
<a name="iot-ddb-rule"></a>

このチュートリアルでは、DynamoDB テーブルにメッセージデータを送信する AWS IoT ルールを作成する方法を示します。

このチュートリアルでは、架空の気象センサーデバイスから DynamoDB テーブルにメッセージデータを送信するルールを作成します。このルールは、多くの気象センサーからのデータをフォーマットして、単一のデータベーステーブルに追加できるようにします。

**このチュートリアルで学習する内容**
+ DynamoDB テーブルの作成方法
+  AWS IoT ルールから DynamoDB テーブルにメッセージデータを送信する方法
+  AWS IoT ルールで置換テンプレートを使用する方法
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
+ MQTT クライアントを使用して AWS IoT ルールをテストする方法

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

**Topics**
+ [

## ステップ 1: このチュートリアルの DynamoDB テーブルを作成する
](#iot-ddb-rule-ddb-table)
+ [

## ステップ 2: DynamoDB テーブルにデータを送信する AWS IoT ルールを作成する
](#iot-ddb-rule-topic-rule)
+ [

## ステップ 3: AWS IoT ルールと DynamoDB テーブルをテストする
](#iot-ddb-rule-test)
+ [

## ステップ 4: 結果と次のステップを確認する
](#iot-ddb-rule-review)

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

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

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

**[Amazon DynamoDB](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/Introduction.html) の概要を確認しました**  
これまで DynamoDB を使用したことがない場合は、[DynamoDB の開始方法](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)を確認して、DynamoDB の基本的な概念と操作に慣れてください。

## ステップ 1: このチュートリアルの DynamoDB テーブルを作成する
<a name="iot-ddb-rule-ddb-table"></a>

このチュートリアルでは、これらの属性を持つ DynamoDB テーブルを作成し、架空の気象センサーデバイスのデータを記録します。
+ `sample_time` はプライマリキーで、サンプルが記録された時間を記述します。
+ `device_id` はソートキーで、サンプルを提供したデバイスを記述します 
+ `device_data` は、デバイスから受信され、ルールクエリステートメントによってフォーマットされたデータです

**このチュートリアルの DynamoDB テーブルを作成するには**

1. [DynamoDB コンソール](https://console.aws.amazon.com//dynamodb/home)を開き、**[Create table]** (テーブルの作成) を選択します。

1. **Create table** (テーブルの作成) の

   1.  **[Table name]** (テーブル名) で、テーブル名 **wx\$1data** を入力します。

   1. **[Partition key]** (パーティションキー) で **sample\$1time** と入力し、フィールドの横にあるオプションリストで **Number** を選択します。

   1. **[Sort key]** (ソートキー) で **device\$1id** と入力します。フィールドの横にあるオプションリストで **Number** を選択します。

   1. ページの下部で、**[Create]** (作成) を選択します。

後で DynamoDB ルールアクションを設定するときに `device_data` を定義します。

## ステップ 2: DynamoDB テーブルにデータを送信する AWS IoT ルールを作成する
<a name="iot-ddb-rule-topic-rule"></a>

このステップでは、ルールクエリステートメントを使用して、架空の気象センサーデバイスからのデータをフォーマットし、データベーステーブルに書き込みます。

気象センサーデバイスから受信したサンプルメッセージペイロードは、次のようになります。

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

データベースエントリでは、ルールクエリステートメントを使用して、メッセージペイロードの構造を次のようにフラット化します。

```
{
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
  "wind_velocity": 22,
  "wind_bearing": 255
}
```

このルールでは、いくつかの [置換テンプレート](iot-substitution-templates.md) も使用します。置換テンプレートは、関数およびメッセージデータから動的値を挿入することを可能にする式です。

**DynamoDB テーブルにデータを送信する AWS IoT ルールを作成するには**

1.  AWS IoT コンソールの [[Rules]](https://console.aws.amazon.com//iot/home#/rulehub) (ルール) ハブを開きます。または、 AWS マネジメントコンソール 内で AWS IoT ホームページを開き、**メッセージルーティング＞ルール**に移動できます。

1. **[Rules]** (ルール) で新しいルールの作成を開始するには、**[Create rule]** (ルールの作成) を選択します。

1. **[Rule properties]** (ルールのプロパティ) の

   1. **[Rule name]** (ルール名) で **wx\$1data\$1ddb** と入力します。

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

   1. **[Rule description]** (ルールの説明) で、ルールを説明します。

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

1. **[次へ]** を選択して続行します。

1. **[SQL statement]** (SQL ステートメント) の

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

   1. [**SQL statement**] (SQL ステートメント) 編集ボックスで、ステートメントを入力します。

      ```
      SELECT temperature, humidity, barometer,
        wind.velocity as wind_velocity,
        wind.bearing as wind_bearing,
      FROM 'device/+/data'
      ```

      このステートメント:
      + `device/+/data` トピックフィルターに一致するトピックを持つ MQTT メッセージをリッスンします。
      + `wind` 属性の要素を個々の属性としてフォーマットします。
      + `temperature`、`humidity`、および `barometer` 属性を変更せずに渡します。

1. **[次へ]** を選択して続行します。

1. **[Rule actions]** (ルールのアクション) で

   1. このルールのルールアクションのリストを開くには、**[Action 1]** (アクション 1) で **DynamoDB** を選択します。
**注記**  
ルールアクションとして DynamoDBv2 ではなく DynamoDB を選択してください。

   1. **[Table name]** (テーブル名) で、前の手順で作成した DynamoDB テーブルの名前 **wx\$1data** を選択します。

      **[Partition key type]** (パーティションキータイプ) および **[Sort key type]** (ソートキータイプ) のフィールドには、DynamoDB テーブルの値が入力されます。

   1. [**パーティションキー**] に「**sample\$1time**」と入力します。

   1. [**パーティションキーの値**] に「**\$1\$1timestamp()\$1**」と入力します。

      これは、このルールで使用する [置換テンプレート](iot-substitution-templates.md) の最初のものです。メッセージペイロードの値を使用する代わりに、timestamp 関数から返された値を使用します。詳細については、*AWS IoT Core デベロッパーガイド*の 「[タイムスタンプ](iot-sql-functions.md#iot-function-timestamp)」を参照してください。

   1. **[Sort key]** (ソートキー) に「**device\$1id**」と入力します。

   1. [**ソートキー値**] に「**\$1\$1cast(topic(2) AS DECIMAL)\$1**」と入力します。

      これは、このルールで使用する [置換テンプレート](iot-substitution-templates.md) の 2 番目のものです。キーの数値形式と一致するように DECIMAL 値にキャストした後、デバイスの ID である [topic] (トピック) 名の 2 番目の要素の値を挿入します。トピックの詳細については、*AWS IoT Core デベロッパーガイド*の「[トピック](iot-sql-functions.md#iot-function-topic)」を参照してください。または、キャスティングの詳細については、*AWS IoT Core デベロッパーガイド*の「[キャスト](iot-sql-functions.md#iot-sql-function-cast)」を参照してください。

   1. [**この列にメッセージデータを書き込む**] に **device\$1data** と入力します。

      これにより、DynamoDB テーブルに `device_data` 列が作成されます。

   1. [**オペレーション**] は空白のままにします。

   1. **[IAM role]** (IAM ロール) で、**[Create new role]** (新しいロールの作成) を選択します。

   1. **[Create role]** (ロールの作成) ダイアログボックスの **[Role name]** (ロール名) に **[wx\$1ddb\$1role]** と入力します。この新しいロールには、作成した **wx\$1data** DynamoDB テーブルにデータを送信する **wx\$1data\$1ddb** ルールを許可する「aws-iot-rule」というプレフィックスが付いたポリシーが自動的に含まれます。

   1. **IAM role** (IAM ロール) で **wx\$1ddb\$1role** を選択します。

   1. ページの最下部にある **[Next]** (次へ) を選択します。

1. **[Review and create]** (確認と作成) ページの最下部で、**[Create]** (作成) を選択して、ルールを作成します。

## ステップ 3: AWS IoT ルールと DynamoDB テーブルをテストする
<a name="iot-ddb-rule-test"></a>

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

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

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

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

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

   1. [**Topic filter**] (トピックフィルター) に、入力トピックフィルター **device/\$1/data** のトピックを入力します。

   1. [**Subscribe**] (サブスクライブ) を選択します。

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

   1. MQTT クライアントで、[**Publish to a topic**] (トピックへの発行) を選択します。

   1. [**Topic name**] (トピック名) に、入力トピックの名前 **device/22/data** を入力します。

   1. [**Message payload**] (メッセージペイロード) に、次のサンプルデータを入力します。

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

   1. MQTT メッセージを発行するには、[**Publish**] (発行) を選択します。

   1. MQTT クライアントで、[**Subscribe to a topic**] (トピックへのサブスクライブ) を選択します。[**Subscribe**] (サブスクライブ) 列で、**device/\$1/data** サブスクリプションを選択します。前のステップのサンプルデータがそこに表示されていることを確認します。

1. ルールが作成した DynamoDB テーブルの行を確認します。

   1. [AWS IoT コンソールの DynamoDB Tables ハブで](https://console.aws.amazon.com//dynamodb/home#tables:)、**wx\$1data** を選択し、**Items** タブを選択します。

      [**Items**] (アイテム) タブを既に開いている場合は、テーブルのヘッダーの右上にある更新アイコンを選択して、表示を更新する必要がある場合があります。

   1. テーブルの **sample\$1time** 値はリンクであり、オープンであることに注意してください。最初のメッセージを送ったばかりの場合は、そのメッセージだけがリストに表示されます。

      このリンクには、テーブルのその行のすべてのデータが表示されます。

   1. **device\$1data** エントリを展開して、ルールクエリステートメントの結果のデータを表示します。

   1. この表示で使用できるデータのさまざまな表現を詳しく確認します。このディスプレイでデータを編集することもできます。

   1. このデータ行の確認が終了したら、加えた変更を保存するには [**Save**] (保存) を選択し、変更を保存せずに終了するには [**Cancel**] (キャンセル) を選択します。

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

### DynamoDB ルールのトラブルシューティング
<a name="iot-ddb-rule-trouble"></a>

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

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

**MQTT クライアントで入力メッセージが表示されない**  
入力メッセージを `device/22/data` トピックにサブスクライブすると、そのメッセージは MQTT クライアントに表示されます。`device/+/data`トピックフィルターを選択します。

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

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

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

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

**DynamoDB テーブルにデータが表示されない**  
まず、テーブルのヘッダーの右上にある更新アイコンを選択して、表示を更新します。探しているデータが表示されない場合は、以下を確認してください。

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

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

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

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

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

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

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

**ルールアクションで使用されるキー名とフィールド名を確認する**  
トピックルールで使用されるフィールド名は、発行メッセージの JSON メッセージペイロードにあるフィールド名と一致する必要があります。

    コンソールで作成したルールを開き、そのルールを持つ MQTT クライアントで使用されているルールアクション設定のフィールド名を確認します。
  + 

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

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

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

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

このルールを使用して DynamoDB テーブルにいくつかのメッセージを送信した後、チュートリアルからいくつかの側面を変更すると、テーブルに書き込まれるデータにどのように影響するかを試してみてください。手始めにいくつかアイデアをご紹介します。
+ 入力メッセージのトピックの *device\$1id* を変更し、データへの影響を観察します。これを使用して、複数の気象センサーからのデータ受信をシミュレートできます。
+ ルールクエリステートメントで選択したフィールドを変更し、データへの影響を確認します。これを使用すると、テーブルに保存されたデータをフィルタリングできます。
+ 再発行ルールアクションを追加して、テーブルに追加された各行について MQTT メッセージを送信します。これをデバッグに使用することができます。

このチュートリアルを完了したら、[チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする](iot-lambda-rule.md) を確認してください。

# チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする
<a name="iot-lambda-rule"></a>

このチュートリアルでは、MQTT メッセージデータを AWS Lambda アクションに送信してフォーマットし、別の AWS サービスに送信する方法を示します。このチュートリアルでは、 AWS Lambda アクションは AWS SDK を使用して、 の使用方法に関するチュートリアルで作成した Amazon SNS トピックにフォーマットされたメッセージを送信します[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)。

[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法に関するチュートリアルでは、ルールのクエリステートメントから生成された JSON ドキュメントがテキストメッセージの本文として送信されました。その結果、次の例のようなテキストメッセージが表示されました。

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

このチュートリアルでは、 AWS Lambda ルールアクションを使用して、ルールクエリステートメントのデータを次の例のようにわかりやすい形式にフォーマットする AWS Lambda 関数を呼び出します。

```
Device 32 reports a temperature of 38, which exceeds the limit of 30.
```

このチュートリアルで作成する AWS Lambda 関数は、ルールクエリステートメントのデータを使用してメッセージ文字列をフォーマットし、 AWS SDK の [SNS 発行](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sns.html#SNS.Client.publish)関数を呼び出して通知を作成します。

**このチュートリアルで学習する内容**
+  AWS Lambda 関数を作成してテストする方法
+  AWS Lambda 関数で AWS SDK を使用して Amazon SNS 通知を発行する方法
+ ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
+ MQTT クライアントを使用して AWS IoT ルールをテストする方法

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

**Topics**
+ [

## ステップ 1: テキストメッセージを送信する AWS Lambda 関数を作成する
](#iot-lambda-rule-create-lambda)
+ [

## ステップ 2: AWS IoT ルールアクションを使用して AWS Lambda ルールを作成する
](#iot-lambda-rule-create-rule)
+ [

## ステップ 3: AWS IoT ルールと AWS Lambda ルールアクションをテストする
](#iot-lambda-rule-test-rule)
+ [

## ステップ 4: 結果と次のステップを確認する
](#iot-lambda-rule-next-steps)

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

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

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

**このセクションのその他のルールチュートリアルを完了しました**  
このチュートリアルでは、[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法に関するチュートリアルで作成した SNS 通知トピックが必要です。また、このセクションの他のルール関連のチュートリアルを完了していることも前提としています。
+ 

**[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html) の概要を確認する**  
 AWS Lambda を使用したことがない場合は、[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)「」と[「Lambda の開始方法](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)」を確認して、その用語と概念を確認してください。

## ステップ 1: テキストメッセージを送信する AWS Lambda 関数を作成する
<a name="iot-lambda-rule-create-lambda"></a>

このチュートリアルの AWS Lambda 関数は、ルールクエリステートメントの結果を受け取り、要素をテキスト文字列に挿入し、その結果の文字列を通知のメッセージとして Amazon SNS に送信します。

通知の送信にルールアクション[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md)を使用した AWS IoT のチュートリアルとは異なり、このチュートリアルは AWS SDK の 関数を使用して Lambda 関数から通知を送信します。ただし、このチュートリアルで使用されている実際の Amazon SNS 通知トピックは、[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法に関するチュートリアルで使用したものと同じです。

**テキストメッセージを送信する AWS Lambda 関数を作成するには**

1. 新しい AWS Lambda 関数を作成します。

   1. [AWS Lambda コンソール](https://console.aws.amazon.com//lambda/home)で、[**関数の作成**] を選択します。

   1. [**Create function**] (関数の作成) で、[**Use a blueprint**] (ブループリントを使用) を選択します。

      **hello-world-python** ブループリントを検索して選択し、[**Configure**] (設定) を選択します。

   1. [**Basic information**] (基本的な情報) で、次の操作を実行します。

      1. [**Function name**] (関数名) で、関数の名前 **format-high-temp-notification** を入力します。

      1. **実行ロール**で、** AWS ポリシーテンプレートから新しいロールを作成する**を選択します。

      1. [Role name] (ロール名) で、新しいロールの名前 **format-high-temp-notification-role** を入力します。

      1. [**Policy templates - *optional***] (ポリシーテンプレート - オプション) で、[**Amazon SNS publish policy**] (Amazon SNS 発行ポリシー) を検索して選択します。

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

1. ブループリントコードを変更して、Amazon SNS 通知をフォーマットして送信します。

   1. 関数を作成すると、**format-high-temp-notification** の詳細ページが表示されます。表示されない場合は、[[Lambda **Functions**](https://console.aws.amazon.com//lambda/home#/functions)] (Lambda 関数) ページから開きます。

   1. **format-high-temp-notification** の詳細ページで、[**Configuration**] (設定) タブを選択し、[**Function code**] (関数コード) パネルまでスクロールします。

   1. [**Function code**] (関数コード) ウィンドウの [**Environment**] (環境) ペインで、Python ファイル `lambda_function.py` を選択します。

   1. [**Function code**] (関数コード) ウィンドウで、ブループリントから元のプログラムコードをすべて削除し、このコードに置き換えます。

      ```
      import boto3
      #
      #   expects event parameter to contain:
      #   {
      #       "device_id": "32",
      #       "reported_temperature": 38,
      #       "max_temperature": 30,
      #       "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
      #   }
      # 
      #   sends a plain text string to be used in a text message
      #
      #      "Device {0} reports a temperature of {1}, which exceeds the limit of {2}."
      #   
      #   where:
      #       {0} is the device_id value
      #       {1} is the reported_temperature value
      #       {2} is the max_temperature value
      #
      def lambda_handler(event, context):
      
          # Create an SNS client to send notification
          sns = boto3.client('sns')
      
          # Format text message from data
          message_text = "Device {0} reports a temperature of {1}, which exceeds the limit of {2}.".format(
                  str(event['device_id']),
                  str(event['reported_temperature']),
                  str(event['max_temperature'])
              )
      
          # Publish the formatted message
          response = sns.publish(
                  TopicArn = event['notify_topic_arn'],
                  Message = message_text
              )
      
          return response
      ```

   1. [**デプロイ**] を選択します。

1. 新しいウィンドウで、[チュートリアル: Amazon SNS 通知の送信](iot-sns-rule.md) の方法に関するチュートリアルから、Amazon SNS トピックの Amazon リソースネーム (ARN) を検索します。

   1. 新しいウィンドウで、[Amazon SNS コンソールの [Topics] (トピック) ページ](https://console.aws.amazon.com//sns/v3/home#/topics)を開きます。

   1. [**Topics**] (トピック) ページで、Amazon SNS トピックのリストから **high\$1temp\$1notice** 通知トピックを見つけます。

   1. 次のステップで使用する **high\$1temp\$1notice** 通知トピックの **ARN** を見つけます。

1. Lambda 関数のテストケースを作成します。

   1. コンソールの [[Lambda **Functions**](https://console.aws.amazon.com//lambda/home#/functions)] (Lambda 関数) ページの **format-high-temp-notification** ページで、ページの右上にある (無効に見える) [**Select a test event**] (テストイベントの選択) を選択し、[**Configure test events**] (テストイベントの設定) を選択します。

   1. [**Configure test event**] (テストイベントの設定) で、[**Create new test event**] (新しいテストイベントの作成) を選択します。

   1. [**Event name**] (イベント名) で、**SampleRuleOutput** と入力します。

   1. [**Event name**] (イベント名) の下の JSON エディタで、このサンプル JSON ドキュメントを貼り付けます。これは、 AWS IoT ルールが Lambda 関数に送信する内容の例です。

      ```
      {
        "device_id": "32",
        "reported_temperature": 38,
        "max_temperature": 30,
        "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
      }
      ```

   1. **high\$1temp\$1notice** 通知トピックの **ARN** があるウィンドウを参照し、ARN 値をコピーします。

   1. JSON エディターの `notify_topic_arn` 値を通知トピックの ARN に置き換えます。

       AWS IoT ルールを作成するときにこの ARN 値を再度使用できるように、このウィンドウを開いたままにします。

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

1. サンプルデータを使用して関数をテストします。

   1. **format-high-temp-notification** の詳細ページの右上で、**SampleRuleOutput** が [**Test**] (テスト) ボタンの横に表示されていることを確認します。表示されない場合は、利用可能なテストイベントのリストから選択します。

   1. サンプルルール出力メッセージを関数に送信するには、[**Test**] (テスト) を選択します。

関数と通知の両方が機能した場合は、通知にサブスクライブした電話でテキストメッセージが受信されます。

電話でテキストメッセージが受信されない場合は、操作の結果を確認してください。[**Function code**] (関数コード) パネルの [**Execution result**] (実行結果) タブで、応答を確認して、発生したエラーを見つけます。関数が電話に通知を送信できるようになるまで、次のステップに進まないでください。

## ステップ 2: AWS IoT ルールアクションを使用して AWS Lambda ルールを作成する
<a name="iot-lambda-rule-create-rule"></a>

このステップでは、ルールクエリステートメントを使用して、架空の気象センサーデバイスからのデータをフォーマットして Lambda 関数に送信します。この関数は、テキストメッセージをフォーマットして送信します。

気象装置から受信したサンプルメッセージペイロードは、次のようになります。

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

このルールでは、ルールクエリステートメントを使用して、次のような Lambda 関数のメッセージペイロードを作成します。

```
{
  "device_id": "32",
  "reported_temperature": 38,
  "max_temperature": 30,
  "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice"
}
```

これには、Lambda 関数が正しいテキストメッセージをフォーマットして送信するために必要なすべての情報が含まれます。

**Lambda 関数を呼び出す AWS IoT ルールを作成するには**

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

1. [**Rules**] (ルール) で新しいルールの作成を開始するには、[**Create**] (作成) を選択します。

1. [**Create a rule**] (ルールを作成) の上部で、次のように操作します。

   1. [**Name**] (名前) で、ルールの名前 **wx\$1friendly\$1text** を入力します。

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

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

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

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

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

   1. [**Rule query statement**] (ルールクエリステートメント) 編集ボックスで、ステートメントを入力します。

      ```
      SELECT 
        cast(topic(2) AS DECIMAL) as device_id, 
        temperature as reported_temperature,
        30 as max_temperature,
        'arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice' as notify_topic_arn
      FROM 'device/+/data' WHERE temperature > 30
      ```

      このステートメント:
      + `device/+/data` トピックフィルターに一致し、`temperature` 値が 30 より大きいトピックを含む MQTT メッセージをリッスンします。
      + トピック文字列から 2 番目の要素を選択し、それを 10 進数に変換してから、`device_id` フィールドに割り当てます。
      + メッセージペイロードから `temperature` フィールドの値を選択し、それを `reported_temperature` フィールドに割り当てます。
      + 制限値を表す定数値 `30` を作成し、それを `max_temperature` フィールドに割り当てます。
      + `notify_topic_arn` フィールドの定数値を作成します。

   1. **high\$1temp\$1notice** 通知トピックの **ARN** があるウィンドウを参照し、ARN 値をコピーします。

   1. ルールクエリステートメントエディタの ARN 値 (*arn:aws:sns:us-east-1:57EXAMPLE833:high\$1temp\$1notice*) を通知トピックの ARN に置き換えます。

1. [**Set one or more actions**] (1 つ以上のアクションを設定) で、以下を実行します。

   1. このルールのルールアクションのリストを開くには、[**Add action**] (アクションの追加) を選択します。

   1. [**Select an action**] (アクションを選択してください) で、[**Send a message to a Lambda function**] (Lambda 関数にメッセージを送信する) を選択します。

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

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

   1. [**Function name**] (関数名) で、[**Select**] (選択) を選択します。

   1. **format-high-temp-notification** を選択します。

   1. [**Configure action**] (アクションの設定) の下部で、[**Add action**] (アクションの追加) を選択します。

   1. ルールを作成するには、[**Create a rule**] (ルールの作成) の下部にある [**Create rule**] (ルールの作成) を選択します。

## ステップ 3: AWS IoT ルールと AWS Lambda ルールアクションをテストする
<a name="iot-lambda-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. MQTT メッセージを発行するには、[**Publish to topic**] (トピックに発行) を選択します。

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

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

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

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

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

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

      ```
      Device 32 reports a temperature of 38, which exceeds the limit of 30.
      ```

      メッセージトピックのトピック ID 要素を変更する場合、`topic(2)` 値を数値にキャストすることは、メッセージトピックのその要素に数字のみが含まれている場合にのみ機能することに注意してください。

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** サブスクリプションで送信したメッセージが表示されますが、温度値がルールクエリステートメントの最大温度を下回っているため、テキストメッセージは受信されません。

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

### AWS Lambda ルールと通知のトラブルシューティング
<a name="iot-lambda-rule-troubleshoot"></a>

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

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

**MQTT クライアントで入力メッセージが表示されない**  
手順で説明されているように `device/+/data` トピックフィルターをサブスクライブした場合、入力メッセージを `device/32/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 にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。
  + 

**Amazon SNS 通知を確認する**  
[ステップ 1: SMS テキストメッセージを送信する Amazon SNS トピックを作成する](iot-sns-rule.md#iot-sns-rule-create-sns-topic) では、Amazon SNS 通知をテストする方法を説明するステップ 3 を参照し、通知をテストして通知が機能することを確認します。
  + 

**Lambda 関数を確認する**  
[ステップ 1: テキストメッセージを送信する AWS Lambda 関数を作成する](#iot-lambda-rule-create-lambda) では、テストデータを使用して Lambda 関数をテストする方法を説明するステップ 5 を参照し、Lambda 関数をテストします。
  + 

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

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

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

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

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

**次の手順**  
このルールを使用していくつかのテキストメッセージを送信した後、チュートリアルの一部を変更すると、メッセージと送信される場合にどのような影響があるかを試してみてください。手始めにいくつかアイデアをご紹介します。
+ 入力メッセージのトピックの *device\$1id* を変更し、テキストメッセージの内容に生じる影響を確認します。
+ ルールクエリステートメントで選択したフィールドを変更し、Lambda 関数を更新して新しいメッセージで使用し、テキストメッセージの内容に生じる影響を確認します。
+ ルールクエリステートメントのテストを変更して、最高温度ではなく最低温度をテストします。Lambda 関数を更新して新しいメッセージをフォーマットし、`max_temperature` の名前を変更することを忘れないでください。
+  AWS IoT ルールの開発中および使用中に発生する可能性のあるエラーを見つける方法の詳細については、「」を参照してください[モニタリング AWS IoT](monitoring_overview.md)。