

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

# チュートリアル: デバイスデータの 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) を確認してください。