チュートリアル: デバイスデータの DynamoDB テーブルへの保存
このチュートリアルでは、メッセージデータを DynamoDB テーブルに送信する AWS IoT ルールを作成する方法を示します。
このチュートリアルでは、架空の気象センサーデバイスから DynamoDB テーブルにメッセージデータを送信するルールを作成します。このルールは、多くの気象センサーからのデータをフォーマットして、単一のデータベーステーブルに追加できるようにします。
このチュートリアルで学習する内容
-
DynamoDB テーブルの作成方法
-
AWS IoT ルールから DynamoDB テーブルにメッセージデータを送信する方法
-
AWS IoT ルールで置換テンプレートを使用する方法
-
ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
-
MQTT クライアントを使用して AWS IoT ルールをテストする方法
このチュートリアルの完了には 30 分ほどかかります。
このチュートリアルでは、次の作業を行います。
このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
-
AWS アカウント を設定する
このチュートリアルを完了するには、AWS アカウント と AWS IoT コンソールが必要です。
-
AWS IoT MQTT クライアントでデバイスの MQTT メッセージを表示する を確認したこと
トピックにサブスクライブおよび発行するために MQTT クライアントを使用できることを確認してください。この手順では、MQTT クライアントを使用して新しいルールをテストします。
-
Amazon DynamoDB の概要を確認しました
これまで DynamoDB を使用したことがない場合は、DynamoDB の開始方法を確認して、DynamoDB の基本的な概念と操作に慣れてください。
ステップ 1: このチュートリアルの DynamoDB テーブルを作成する
このチュートリアルでは、これらの属性を持つ DynamoDB テーブルを作成し、架空の気象センサーデバイスのデータを記録します。
-
sample_time
はプライマリキーで、サンプルが記録された時間を記述します。 -
device_id
はソートキーで、サンプルを提供したデバイスを記述します -
device_data
は、デバイスから受信され、ルールクエリステートメントによってフォーマットされたデータです
このチュートリアルの DynamoDB テーブルを作成するには
-
DynamoDB コンソール
を開き、[Create table] (テーブルの作成) を選択します。 -
Create table (テーブルの作成) の
-
[Table name] (テーブル名) で、テーブル名
wx_data
を入力します。 -
[Partition key] (パーティションキー) で
sample_time
と入力し、フィールドの横にあるオプションリストでNumber
を選択します。 -
[Sort key] (ソートキー) で
device_id
と入力します。フィールドの横にあるオプションリストでNumber
を選択します。 -
ページの下部で、[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 ルールを作成するには
-
AWS IoT コンソールの [Rules]
(ルール) ハブを開きます。または、AWS Management Console 内で AWS IoT ホームページを開き、[メッセージルーティング] > [ルール] に移動することもできます。 -
[Rules] (ルール) で新しいルールの作成を開始するには、[Create rule] (ルールの作成) を選択します。
-
[Rule properties] (ルールのプロパティ) の
-
[Rule name] (ルール名) で
wx_data_ddb
と入力します。ルール名は、AWS アカウント とリージョン内で一意である必要があります。また、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の 2 つの単語を区切りました。
-
[Rule description] (ルールの説明) で、ルールを説明します。
わかりやすい説明を使用すると、このルールの動作と作成した理由を簡単に思い出すことができます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。
-
-
[次へ] を選択して続行します。
-
[SQL statement] (SQL ステートメント) の
-
[SQL version] (SQL バージョン) で、
2016-03-23
を選択します。 -
[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
属性を変更せずに渡します。
-
-
-
[次へ] を選択して続行します。
-
[Rule actions] (ルールのアクション) で
-
このルールのルールアクションのリストを開くには、[Action 1] (アクション 1) で
DynamoDB
を選択します。注記
ルールアクションとして DynamoDBv2 ではなく DynamoDB を選択してください。
-
[Table name] (テーブル名) で、前の手順で作成した DynamoDB テーブルの名前
wx_data
を選択します。[Partition key type] (パーティションキータイプ) および [Sort key type] (ソートキータイプ) のフィールドには、DynamoDB テーブルの値が入力されます。
-
[パーティションキー] に「
sample_time
」と入力します。 -
[パーティションキーの値] に「
${timestamp()}
」と入力します。これは、このルールで使用する 置換テンプレート の最初のものです。メッセージペイロードの値を使用する代わりに、timestamp 関数から返された値を使用します。詳細については、AWS IoT Core デベロッパーガイドの 「タイムスタンプ」を参照してください。
-
[Sort key] (ソートキー) に「
device_id
」と入力します。 -
[ソートキー値] に「
${cast(topic(2) AS DECIMAL)}
」と入力します。これは、このルールで使用する 置換テンプレート の 2 番目のものです。キーの数値形式と一致するように DECIMAL 値にキャストした後、デバイスの ID である [topic] (トピック) 名の 2 番目の要素の値を挿入します。トピックの詳細については、AWS IoT Core デベロッパーガイドの「トピック」を参照してください。または、キャスティングの詳細については、AWS IoT Core デベロッパーガイドの「キャスト」を参照してください。
-
[この列にメッセージデータを書き込む] に
device_data
と入力します。これにより、DynamoDB テーブルに
device_data
列が作成されます。 -
[オペレーション] は空白のままにします。
-
[IAM role] (IAM ロール) で、[Create new role] (新しいロールの作成) を選択します。
-
[Create role] (ロールの作成) ダイアログボックスの [Role name] (ロール名) に [wx_ddb_role] と入力します。この新しいロールには、作成した
wx_data
DynamoDB テーブルにデータを送信するwx_data_ddb
ルールを許可する「aws-iot-rule」というプレフィックスが付いたポリシーが自動的に含まれます。 -
IAM role (IAM ロール) で
wx_ddb_role
を選択します。 -
ページの最下部にある [Next] (次へ) を選択します。
-
-
[Review and create] (確認と作成) ページの最下部で、[Create] (作成) を選択して、ルールを作成します。
ステップ 3: AWS IoT ルールと DynamoDB テーブルをテストする
新しいルールをテストするには、MQTT クライアントを使用して、このテストで使用した MQTT メッセージを発行し、これにサブスクライブします。
新しいウィンドウの AWS IoT コンソールで MQTT クライアント
MQTT クライアントを使用してルールをテストするには
-
AWS IoT コンソールの MQTT クライアント
で、入力トピック device/+/data
をサブスクライブします。-
MQTT クライアントで、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。
-
[Topic filter] (トピックフィルター) に、入力トピックフィルター
device/+/data
のトピックを入力します。 -
[Subscribe] (サブスクライブ) を選択します。
-
-
特定のデバイス ID
device/22/data
を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含む MQTT トピックには発行できません。-
MQTT クライアントで、[Publish to a topic] (トピックへの発行) を選択します。
-
[Topic name] (トピック名) に、入力トピックの名前
device/22/data
を入力します。 -
[Message payload] (メッセージペイロード) に、次のサンプルデータを入力します。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
MQTT メッセージを発行するには、[Publish] (発行) を選択します。
-
MQTT クライアントで、[Subscribe to a topic] (トピックへのサブスクライブ) を選択します。[Subscribe] (サブスクライブ) 列で、
device/+/data
サブスクリプションを選択します。前のステップのサンプルデータがそこに表示されていることを確認します。
-
-
ルールが作成した DynamoDB テーブルの行を確認します。
-
AWS IoT コンソールの [DynamoDB Tables]
(DynamoDB テーブル) ハブで、[wx_data] を選択してから、[Items] (項目) タブを選択します。 [Items] (アイテム) タブを既に開いている場合は、テーブルのヘッダーの右上にある更新アイコンを選択して、表示を更新する必要がある場合があります。
-
テーブルの sample_time 値はリンクであり、オープンであることに注意してください。最初のメッセージを送ったばかりの場合は、そのメッセージだけがリストに表示されます。
このリンクには、テーブルのその行のすべてのデータが表示されます。
-
device_data エントリを展開して、ルールクエリステートメントの結果のデータを表示します。
-
この表示で使用できるデータのさまざまな表現を詳しく確認します。このディスプレイでデータを編集することもできます。
-
このデータ行の確認が終了したら、加えた変更を保存するには [Save] (保存) を選択し、変更を保存せずに終了するには [Cancel] (キャンセル) を選択します。
-
正しい動作が確認できない場合は、トラブルシューティングのヒントを確認してください。
DynamoDB ルールのトラブルシューティング
想定する結果が表示されない場合に備えて、確認すべき事項をいくつかご紹介します。
-
エラーバナーが表示された
入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。
-
MQTT クライアントで入力メッセージが表示されない
入力メッセージを
device/22/data
トピックにサブスクライブすると、そのメッセージは MQTT クライアントに表示されます。device/+/data
トピックフィルターを選択します。確認すべき事項
-
サブスクライブしたトピックフィルターを確認する
手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。
メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。
-
メッセージ発行機能を確認する
MQTT クライアントの [Subscriptions] (サブスクリプション) で、[device/+/data] を選択し、パブリッシュ メッセージのトピックを確認してから、[Publish to topic] (トピックに発行) を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。
-
-
DynamoDB テーブルにデータが表示されない
まず、テーブルのヘッダーの右上にある更新アイコンを選択して、表示を更新します。探しているデータが表示されない場合は、以下を確認してください。
確認すべき事項
-
MQTT クライアントの AWS リージョン と作成したルールを確認する
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
-
ルールクエリステートメントの入力メッセージのトピックを確認する
ルールが機能するためには、ルールクエリステートメントの FROM 句のトピックフィルターに一致するトピック名を持つメッセージを受信する必要があります。
ルールクエリステートメントのトピックフィルターの綴りを、MQTT クライアントのトピックフィルターの綴りと照らし合わせて確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
-
入力メッセージペイロードの内容を確認する
ルールが機能するためには、SELECT ステートメントで宣言されているメッセージペイロード内のデータフィールドを見つける必要があります。
ルールクエリステートメントの
temperature
フィールドの綴りを、MQTT クライアントのメッセージペイロードの綴りと照らし合わせて確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントのtemperature
フィールドはメッセージペイロードのtemperature
フィールドと同じである必要があります。メッセージペイロード内の JSON ドキュメントが正しくフォーマットされていることを確認します。JSON にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。
-
ルールアクションで使用されるキー名とフィールド名を確認する
トピックルールで使用されるフィールド名は、発行メッセージの JSON メッセージペイロードにあるフィールド名と一致する必要があります。
コンソールで作成したルールを開き、そのルールを持つ MQTT クライアントで使用されているルールアクション設定のフィールド名を確認します。
-
ルールによって使用されているロールを確認する
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。
ルールにメッセージデータの受信と DynamoDB テーブルの更新を許可するポリシーは、使用されるトピックに固有のものです。ルールで使用されるトピックまたは DynamoDB テーブル名を変更した場合は、ルールアクションのロールを更新して、ポリシーが一致するように更新する必要があります。
これが問題であると疑われる場合は、ルールのアクションを編集し、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。
-
ステップ 4: 結果と次のステップを確認する
このルールを使用して DynamoDB テーブルにいくつかのメッセージを送信した後、チュートリアルからいくつかの側面を変更すると、テーブルに書き込まれるデータにどのように影響するかを試してみてください。手始めにいくつかアイデアをご紹介します。
-
入力メッセージのトピックの
device_id
を変更し、データへの影響を観察します。これを使用して、複数の気象センサーからのデータ受信をシミュレートできます。 -
ルールクエリステートメントで選択したフィールドを変更し、データへの影響を確認します。これを使用すると、テーブルに保存されたデータをフィルタリングできます。
-
再発行ルールアクションを追加して、テーブルに追加された各行について MQTT メッセージを送信します。これをデバッグに使用することができます。
このチュートリアルを完了したら、チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする を確認してください。