チュートリアル: デバイスデータの 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 IoT AWS Management Console ホームページを開き、メッセージルーティング>ルールに移動することもできます。

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

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

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

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

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

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

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

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

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

    2. [SQL statement] (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 を選択します。

      注記

      ルールアクションとして DynamoDBv2 ではなく 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 番目のものです。キーの数値形式と一致するように DECIMAL 値にキャストした後、デバイスの ID である [topic] (トピック) 名の 2 番目の要素の値を挿入します。トピックの詳細については、AWS IoT Core デベロッパーガイドの「トピック」を参照してください。または、キャスティングの詳細については、AWS IoT Core デベロッパーガイドの「キャスト」を参照してください。

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

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

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

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

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

    11. IAM role (IAM ロール) で wx_ddb_role を選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. AWS IoT コンソールの DynamoDB テーブルハブでwx_data を選択し、次にアイテムタブを選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 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 関数を使用して通知をフォーマットする を確認してください。