チュートリアル: Azure IoT Hub のメッセージ エンリッチメントを使用する
メッセージ エンリッチメントは、指定されたエンドポイントに送信される前のメッセージに対し、追加情報を含んだスタンプ メッセージを適用する Azure IoT Hub の機能です。 メッセージ エンリッチメントを使用する理由の 1 つは、ダウンストリームの処理を単純化するために用いることのできるデータを追加することです。 たとえば、デバイス ツイン タグを使用してデバイスのメッセージのエンリッチメントを行えば、この情報のために顧客側でデバイス ツイン API を呼び出す負担を軽減することができます。 詳細については、メッセージ エンリッチメントの概要に関するページを参照してください。
このチュートリアルの最初のパートでは、カスタム エンドポイントを作成し、他の Azure サービスにメッセージをルーティングする方法を確認しました。 このチュートリアルでは、IoT ハブ用のメッセージ エンリッチメントをテストするために必要な追加リソースを作成し、構成する方法について説明します。 このリソースには、エンリッチ メッセージを保持するための既存のストレージ アカウント (チュートリアルの最初のパートで作成したもの) の 2 つ目のストレージ コンテナーと、それらをそこに送信するメッセージ ルートが含まれます。 メッセージ ルーティングとメッセージ エンリッチメントの構成が完了したら、アプリケーションを使用してメッセージを IoT ハブに送信します。 その後、ハブによって両方のストレージ コンテナーにルーティングされます。 enriched ストレージ コンテナーのエンドポイントに送信されるメッセージだけがエンリッチされます。
このチュートリアルでは、以下のタスクを実行します。
- ストレージ アカウントで 2 つ目のコンテナーを作成します。
- 別のカスタム エンドポイントを作成し、IoT ハブからそこにメッセージをルーティングします。
- 新しいエンドポイントにルーティングされるメッセージ エンリッチメントを構成します。
- IoT デバイスをシミュレートするアプリを実行し、ハブにメッセージを送信します。
- その結果を表示して、メッセージ エンリッチメントがターゲット メッセージに適用されていることを確認します。
前提条件
Azure サブスクリプションが必要です。 Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
「チュートリアル: IoT Hub メッセージ ルーティングを使用してデバイス データを Azure Storage に送信する」を完了し、そのために作成したリソースを保守している必要があります。
ポート 8883 がファイアウォールで開放されていることを確認してください。 このチュートリアルのデバイス サンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。 このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。 この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。
Azure portal には、その他の前提条件はありません。
ストレージ アカウントで 2 つ目のコンテナーを作成する
このチュートリアルの最初のパートでは、ルーティングされたメッセージ用にストレージ アカウントとコンテナーを作成しました。 次は、エンリッチ メッセージ用に 2 つ目のコンテナーを作成する必要があります。
Azure portal で、[ストレージ アカウント] を検索します。
先ほど作成したアカウントを選択します。
[ストレージ アカウント] メニューの [データ ストレージ] セクションから [コンテナー] を選択します。
[コンテナー] を選んで、新しいコンテナーを作成します。
コンテナーに
enriched
という名前を付け、[作成] を選択します。
2 つ目のエンドポイントにメッセージをルーティングする
エンリッチ メッセージのために 2 つ目のエンドポイントとルートを作成します。
重要
この記事には、Shared Access Signature を使用してサービスに接続する手順が記載されています。 この認証方法はテストと評価には便利ですが、Microsoft Entra ID とマネージド ID を使用してサービスに認証する方が安全です。 詳細については、セキュリティのベスト プラクティス > クラウドのセキュリティに関するページをご覧ください。
Azure portal で IoT Hub に移動します。
リソース メニューの [ハブ設定] で、[メッセージ ルーティング] を選択し、[追加] を選択します。
[エンドポイント] タブで、次の情報を指定してストレージ エンドポイントを作成します。
パラメーター 値 [エンドポイントの種類] [ストレージ] を選択します。 [エンドポイント名] 「 ContosoStorageEndpointEnriched
」と入力します。[Azure Storage コンテナー] [コンテナーを選択します] を選択します。 プロンプトに従って、前のセクションで作成したストレージ アカウントとエンリッチされたコンテナーを選択します。 [エンコード] [JSON] を選択します。 このフィールドが淡色表示されている場合、ストレージ アカウント リージョンは JSON をサポートしません。 その場合は、既定の [AVRO] で続行します。 残りのパラメーターの既定値をそのまま使用し、[作成 + 次へ] を選択します。
ストレージ エンドポイントを追加したので、新しいルートの作成を続けます。 新しいルートに関して、次の情報を入力します。
パラメーター 値 名前 ContosoStorageRouteEnriched データ ソース ドロップダウン リストから [デバイス テレメトリ メッセージ] が選択されていることを確認します。 ルートの有効化 このフィールドが enabled
に設定されていることを確認します。ルーティング クエリ クエリ文字列として、「 level="storage"
」と入力します。[エンリッチメントの作成 + 追加] を選択します。
新しいエンドポイントにメッセージ エンリッチメントを追加する
enriched ストレージ コンテナーにルーティングされる 3 つのメッセージ エンリッチメントを作成します。
ルートの追加ウィザードの [エンリッチメント] タブで、enriched と呼ばれるストレージ コンテナーのエンドポイントに送信されるメッセージのメッセージ エンリッチメントが 3 つ追加されます。
ContosoStorageEndpointEnriched エンドポイントのメッセージ エンリッチメントとしてこれらの値を追加します。
名前 値 myIotHub $hubname
DeviceLocation $twin.tags.location
(前提としてデバイス ツインに場所タグがある)customerID 6ce345b8-1e4a-411e-9398-d34587459a3a
作業が完了すると、エンリッチメントは次の画像のようになります。
[追加] を選択して、メッセージ エンリッチメントを追加します。
これで、エンリッチ メッセージ用に作成したエンドポイントにルーティングされるすべてのメッセージに、メッセージ エンリッチメントが設定されました。 デバイス ツインに場所タグを追加しない場合は、「メッセージ エンリッチメントをテストする」セクションまでスキップしてチュートリアルを続けることができます。
デバイス ツインに場所タグを追加する
IoT ハブで構成されたメッセージ エンリッチメントのいずれかに DeviceLocation のキーを指定します。この値は次のデバイス ツイン パスによって決まります: $twin.tags.location
。 デバイス ツインに場所タグがない場合、メッセージ エンリッチメントの DeviceLocation キーの文字列として、ツイン パス $twin.tags.location
がスタンプされます。
デバイスのツインに場所タグを追加するには、次の手順に従います。
Azure Portal で、IoT ハブに移動します。
IoT ハブのナビゲーション メニューで [デバイス] を選択して、デバイスを選択します。
デバイス ページの上部にある [デバイス ツイン] タブを選択し、デバイス ツインの下部にある右中かっこの直前に次の行を追加します。 次に、 [保存] を選択します。
, "tags": {"location": "Plant 43"}
ヒント
約5分間待ってから、次のセクションに進みます。 デバイス ツインの更新が メッセージ エンリッチメント値に反映されるまで、最大でもそれくらいの時間がかかることがあります。
メッセージ エンリッチメントでデバイス ツイン パスを処理する方法の詳細については、「 メッセージ エンリッチメントの制限事項」を参照してください。 デバイス ツインの詳細については、「IoT Hub のデバイス ツインの理解と使用」を参照してください。
メッセージ エンリッチメントをテストする
メッセージ エンリッチメントは ContosoStorageEndpointEnriched エンドポイントに対して構成されているので、シミュレートされたデバイスのアプリケーションを実行して、IoT ハブにメッセージを送信します。 この時点で、メッセージのルーティングは次のように設定されています。
チュートリアルの最初のパートで作成したストレージ エンドポイントにルーティングされたメッセージは、エンリッチされず、そのときに作成したストレージ コンテナーに格納されます。
ストレージ エンドポイント ContosoStorageEndpointEnriched にルーティングされたメッセージはエンリッチされて、ストレージ コンテナー enriched に格納されます。
このチュートリアルの最初のパートにある SimulatedDevice コンソール アプリケーションをまだ実行していない場合は、もう一度実行します。
ヒント
このチュートリアルの Azure CLI の手順に従っている場合は、別のセッションでサンプル コードを実行します。 これにより、CLI の残りの手順を実行している間にサンプル コードの実行を継続できます。
サンプル フォルダーで、
/iot-hub/Tutorials/Routing/SimulatedDevice/
フォルダーに移動します。さきほど更新した変数定義はまだ有効なはずですが、そうでない場合は
Program.cs
ファイル内で編集します。Program クラスの上部にある変数定義を見つけます。 次の変数を自分の情報で更新します。
- s_myDeviceId: デバイスを IoT ハブに登録するときに割り当てたデバイス ID。
- s_iotHubUri:
IOTHUB_NAME.azure-devices.net
形式を受け取る IoT ハブのホスト名。 - s_deviceKey: デバイス ID 情報に含まれるデバイスの主キー。
ファイルを保存して閉じます。
サンプル コードを実行する。
dotnet run
コンソール アプリケーションを数分間実行した後、データを確認します。
Azure portal のストレージ アカウントに移動します。
ナビゲーション メニューから [ストレージ ブラウザー] を選びます。 [BLOB コンテナー] を選ぶと、これらのチュートリアルの過程で作成した 2 つのコンテナーが表示されます。
enriched というコンテナー内のメッセージには、メッセージ エンリッチメントが適用されています。 先ほど作成したコンテナー内のメッセージには、エンリッチメントが適用されていない生のメッセージが格納されます。 enriched コンテナーをドリルダウンして一番下まで移動し、最新のメッセージ ファイルを開きます。 次に、もう一方のコンテナーに対して同じ操作を行って、1 つがエンリッチされ、もう 1 つがエンリッチされていないことを確認します。
エンリッチされたメッセージを見ると、次のように、"myIotHub"
とハブ名、場所、顧客 ID が含まれているはずです。
{
"EnqueuedTimeUtc":"2019-05-10T06:06:32.7220000Z",
"Properties":
{
"level":"storage",
"myIotHub":"{your hub name}",
"DeviceLocation":"Plant 43",
"customerID":"6ce345b8-1e4a-411e-9398-d34587459a3a"
},
"SystemProperties":
{
"connectionDeviceId":"Contoso-Test-Device",
"connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
"connectionDeviceGenerationId":"636930642531278483",
"enqueuedTime":"2019-05-10T06:06:32.7220000Z"
},"Body":"eyJkZXZpY2VJZCI6IkNvbnRvc28tVGVzdC1EZXZpY2UiLCJ0ZW1wZXJhdHVyZSI6MjkuMjMyMDE2ODQ4MDQyNjE1LCJodW1pZGl0eSI6NjQuMzA1MzQ5NjkyODQ0NDg3LCJwb2ludEluZm8iOiJUaGlzIGlzIGEgc3RvcmFnZSBtZXNzYWdlLiJ9"
}
リソースをクリーンアップする
このチュートリアルの両方のパートで作成したリソースをすべて削除するには、リソース グループを削除します。 これにより、そのグループ内に含まれているすべてのリソースも削除されます。 リソース グループ全体を削除しない場合は、リソース グループ内の個々のリソースを選んで削除できます。
- Azure portal で、このチュートリアルの IoT ハブとストレージ アカウントを含むリソース グループに移動します。
- リソース グループ内にあるすべてのリソースを確認して、クリーンアップするリソースを決定します。
- すべてのリソースを削除する場合は、 [リソース グループの削除] を選択します。
- 特定のリソースのみを削除する場合は、各リソース名の横にあるチェック ボックスを使用して、削除するリソースを選択します。 次に、 [削除] を選択します。
次のステップ
このチュートリアルでは、IoT Hub メッセージがエンドポイントにルーティングされる際にメッセージ エンリッチメントを構成し、テストしました。
メッセージ エンリッチメントの詳細については、メッセージ エンリッチメントの概要に関するページを参照してください。
IoT Hub の詳細については、次のチュートリアルに進んでください。