チュートリアル: デバイスデータの DynamoDB テーブルへの保存 - AWS IoT Core

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

チュートリアル: デバイスデータの DynamoDB テーブルへの保存

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

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

このチュートリアルで学習する内容
  • DynamoDB テーブルの作成方法

  • AWS IoT ルールから DynamoDB テーブルにメッセージデータを送信する方法

  • AWS IoT ルールで代替テンプレートを使用する方法

  • ルールSQLクエリステートメントで単純なクエリと関数を使用する方法

  • MQTT クライアントを使用して AWS IoT ルールをテストする方法

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

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

ステップ 1: このチュートリアルの DynamoDB テーブルを作成する

このチュートリアルでは、これらの属性を持つ DynamoDB テーブルを作成し、架空の気象センサーデバイスのデータを記録します。

  • sample_time はプライマリキーで、サンプルが記録された時間を記述します。

  • device_id はソートキーで、サンプルを提供したデバイスを記述します

  • device_data は、デバイスから受信され、ルールクエリステートメントによってフォーマットされたデータです

このチュートリアルの DynamoDB テーブルを作成するには
  1. DynamoDB コンソールを開き、[Create table] (テーブルの作成) を選択します。

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

    1. [Table name] (テーブル名) で、テーブル名 wx_data を入力します。

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

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

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

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

ステップ 2: DynamoDB テーブルにデータを送信する AWS IoT ルールを作成する

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

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

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

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

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

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

DynamoDB テーブルにデータを送信する AWS IoT ルールを作成するには
  1. AWS IoT コンソールの [Rules] (ルール) ハブを開きます。または、 AWS Management Console 内で AWS IoT ホームページを開き、メッセージルーティング>ルール に移動できます。

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

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

    1. [Rule name] (ルール名) で wx_data_ddb と入力します。

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

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

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

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

  5. SQL ステートメント で:

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

    2. SQL ステートメント編集ボックスに、 ステートメントを入力します。

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

      このステートメント:

      • トピックフィルターに一致するdevice/+/dataトピックを含むMQTTメッセージをリッスンします。

      • wind 属性の要素を個々の属性としてフォーマットします。

      • temperaturehumidity、および barometer 属性を変更せずに渡します。

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

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

    1. このルールのルールアクションのリストを開くには、[Action 1] (アクション 1) で DynamoDB を選択します。

      注記

      ルールアクションとして D ynamoDBv2 ではなく DynamoDB を選択してください。

    2. [Table name] (テーブル名) で、前の手順で作成した DynamoDB テーブルの名前 wx_data を選択します。

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

    3. [パーティションキー] に「sample_time」と入力します。

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

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

    5. [Sort key] (ソートキー) に「device_id」と入力します。

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

      これは、このルールで使用する 置換テンプレート の 2 番目のものです。2 番目の要素の値を、キーの数値形式に一致するDECIMAL値にキャストした後、デバイスの ID であるトピック名に挿入します。トピックの詳細については、AWS IoT Core デベロッパーガイドの「トピック」を参照してください。または、キャスティングの詳細については、AWS IoT Core デベロッパーガイドの「キャスト」を参照してください。

    7. [この列にメッセージデータを書き込む] に device_data と入力します。

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

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

    9. IAM ロール で、新しいロールの作成 を選択します。

    10. [Create role] (ロールの作成) ダイアログボックスの [Role name] (ロール名) に [wx_ddb_role] と入力します。この新しいロールには、プレフィックスがaws-iot-rule「」のポリシーが自動的に含まれ、wx_data_ddbルールが作成した DynamoDB wx_data テーブルにデータを送信できるようになります。

    11. IAM ロール で、 を選択しますwx_ddb_role

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

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

ステップ 3: AWS IoT ルールと DynamoDB テーブルをテストする

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

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

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

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

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

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

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

    1. MQTT クライアントで、トピック に発行 を選択します。

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

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

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. MQTT メッセージを発行するには、「発行」を選択します。

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

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

    1. AWS IoT コンソール の DynamoDB Tables ハブでwx_data を選択し、Items タブを選択します。

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

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

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

    3. device_data エントリを展開して、ルールクエリステートメントの結果のデータを表示します。

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

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

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

DynamoDB ルールのトラブルシューティング

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

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

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

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

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

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

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

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

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

      MQTT クライアントで、サブスクリプション で、デバイス/+/データ を選択し、発行メッセージのトピックを確認してから、トピック に発行 を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。

  • DynamoDB テーブルにデータが表示されない

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

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

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

    • ルールクエリステートメントの入力メッセージのトピックを確認する

      ルールが機能するには、ルールクエリステートメントの FROM句のトピックフィルターに一致するトピック名を含むメッセージを受信する必要があります。

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

    • 入力メッセージペイロードの内容を確認する

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

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

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

    • ルールアクションで使用されるキー名とフィールド名を確認する

      トピックルールで使用されるフィールド名は、公開されたメッセージのJSONメッセージペイロードにあるものと一致する必要があります。

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

    • ルールによって使用されているロールを確認する

      ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。

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

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

ステップ 4: 結果と次のステップを確認する

このルールを使用して DynamoDB テーブルにいくつかのメッセージを送信した後、チュートリアルからいくつかの側面を変更すると、テーブルに書き込まれるデータにどのように影響するかを試してみてください。手始めにいくつかアイデアをご紹介します。

  • の変更 device_id 入力メッセージのトピックで、データへの影響を観察します。これを使用して、複数の気象センサーからのデータ受信をシミュレートできます。

  • ルールクエリステートメントで選択したフィールドを変更し、データへの影響を確認します。これを使用すると、テーブルに保存されたデータをフィルタリングできます。

  • 再発行ルールアクションを追加して、テーブルに追加された各行のMQTTメッセージを送信します。これをデバッグに使用することができます。

このチュートリアルを完了したら、チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする を確認してください。