チュートリアル: 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 つ目のコンテナーを作成する必要があります。

  1. Azure portal で、[ストレージ アカウント] を検索します。

  2. 先ほど作成したアカウントを選択します。

  3. [ストレージ アカウント] メニューの [データ ストレージ] セクションから [コンテナー] を選択します。

  4. [コンテナー] を選んで、新しいコンテナーを作成します。

    ストレージ コンテナーの作成のスクリーンショット。

  5. コンテナーに enriched という名前を付け、[作成] を選択します。

2 つ目のエンドポイントにメッセージをルーティングする

エンリッチ メッセージのために 2 つ目のエンドポイントとルートを作成します。

重要

この記事には、Shared Access Signature を使用してサービスに接続する手順が記載されています。 この認証方法はテストと評価には便利ですが、Microsoft Entra ID とマネージド ID を使用してサービスに認証する方が安全です。 詳細については、セキュリティのベスト プラクティス > クラウドのセキュリティに関するページをご覧ください。

  1. Azure portal で IoT Hub に移動します。

  2. リソース メニューの [ハブ設定] で、[メッセージ ルーティング] を選択し、[追加] を選択します。

    IoT ハブに新しいルートを追加する [追加] ボタンの場所を示すスクリーンショット。

  3. [エンドポイント] タブで、次の情報を指定してストレージ エンドポイントを作成します。

    パラメーター
    [エンドポイントの種類] [ストレージ] を選択します。
    [エンドポイント名] ContosoStorageEndpointEnriched」と入力します。
    [Azure Storage コンテナー] [コンテナーを選択します] を選択します。 プロンプトに従って、前のセクションで作成したストレージ アカウントとエンリッチされたコンテナーを選択します。
    [エンコード] [JSON] を選択します。 このフィールドが淡色表示されている場合、ストレージ アカウント リージョンは JSON をサポートしません。 その場合は、既定の [AVRO] で続行します。

    エンドポイントのコンテナーの選択を示すスクリーンショット。

  4. 残りのパラメーターの既定値をそのまま使用し、[作成 + 次へ] を選択します。

  5. ストレージ エンドポイントを追加したので、新しいルートの作成を続けます。 新しいルートに関して、次の情報を入力します。

    パラメーター
    名前 ContosoStorageRouteEnriched
    データ ソース ドロップダウン リストから [デバイス テレメトリ メッセージ] が選択されていることを確認します。
    ルートの有効化 このフィールドが enabled に設定されていることを確認します。
    ルーティング クエリ クエリ文字列として、「level="storage"」と入力します。

    ルーティング クエリ情報の保存を示すスクリーンショット。

  6. [エンリッチメントの作成 + 追加] を選択します。

新しいエンドポイントにメッセージ エンリッチメントを追加する

enriched ストレージ コンテナーにルーティングされる 3 つのメッセージ エンリッチメントを作成します。

  1. ルートの追加ウィザードの [エンリッチメント] タブで、enriched と呼ばれるストレージ コンテナーのエンドポイントに送信されるメッセージのメッセージ エンリッチメントが 3 つ追加されます。

    ContosoStorageEndpointEnriched エンドポイントのメッセージ エンリッチメントとしてこれらの値を追加します。

    名前
    myIotHub $hubname
    DeviceLocation $twin.tags.location (前提としてデバイス ツインに場所タグがある)
    customerID 6ce345b8-1e4a-411e-9398-d34587459a3a

    作業が完了すると、エンリッチメントは次の画像のようになります。

    すべてのエンリッチメントが追加されたテーブルのスクリーンショット。

  2. [追加] を選択して、メッセージ エンリッチメントを追加します。

これで、エンリッチ メッセージ用に作成したエンドポイントにルーティングされるすべてのメッセージに、メッセージ エンリッチメントが設定されました。 デバイス ツインに場所タグを追加しない場合は、「メッセージ エンリッチメントをテストする」セクションまでスキップしてチュートリアルを続けることができます。

デバイス ツインに場所タグを追加する

IoT ハブで構成されたメッセージ エンリッチメントのいずれかに DeviceLocation のキーを指定します。この値は次のデバイス ツイン パスによって決まります: $twin.tags.location。 デバイス ツインに場所タグがない場合、メッセージ エンリッチメントの DeviceLocation キーの文字列として、ツイン パス $twin.tags.location がスタンプされます。

デバイスのツインに場所タグを追加するには、次の手順に従います。

  1. Azure Portal で、IoT ハブに移動します。

  2. IoT ハブのナビゲーション メニューで [デバイス] を選択して、デバイスを選択します。

  3. デバイス ページの上部にある [デバイス ツイン] タブを選択し、デバイス ツインの下部にある右中かっこの直前に次の行を追加します。 次に、 [保存] を選択します。

      , "tags": {"location": "Plant 43"}
    

    Azure portal で位置タグをデバイス ツインに追加するスクリーンショット。

ヒント

約5分間待ってから、次のセクションに進みます。 デバイス ツインの更新が メッセージ エンリッチメント値に反映されるまで、最大でもそれくらいの時間がかかることがあります。

メッセージ エンリッチメントでデバイス ツイン パスを処理する方法の詳細については、「 メッセージ エンリッチメントの制限事項」を参照してください。 デバイス ツインの詳細については、「IoT Hub のデバイス ツインの理解と使用」を参照してください。

メッセージ エンリッチメントをテストする

メッセージ エンリッチメントは ContosoStorageEndpointEnriched エンドポイントに対して構成されているので、シミュレートされたデバイスのアプリケーションを実行して、IoT ハブにメッセージを送信します。 この時点で、メッセージのルーティングは次のように設定されています。

  • チュートリアルの最初のパートで作成したストレージ エンドポイントにルーティングされたメッセージは、エンリッチされず、そのときに作成したストレージ コンテナーに格納されます。

  • ストレージ エンドポイント ContosoStorageEndpointEnriched にルーティングされたメッセージはエンリッチされて、ストレージ コンテナー enriched に格納されます。

このチュートリアルの最初のパートにある SimulatedDevice コンソール アプリケーションをまだ実行していない場合は、もう一度実行します。

ヒント

このチュートリアルの Azure CLI の手順に従っている場合は、別のセッションでサンプル コードを実行します。 これにより、CLI の残りの手順を実行している間にサンプル コードの実行を継続できます。

  1. サンプル フォルダーで、 /iot-hub/Tutorials/Routing/SimulatedDevice/ フォルダーに移動します。

  2. さきほど更新した変数定義はまだ有効なはずですが、そうでない場合は Program.cs ファイル内で編集します。

    1. Program クラスの上部にある変数定義を見つけます。 次の変数を自分の情報で更新します。

      • s_myDeviceId: デバイスを IoT ハブに登録するときに割り当てたデバイス ID。
      • s_iotHubUri: IOTHUB_NAME.azure-devices.net 形式を受け取る IoT ハブのホスト名。
      • s_deviceKey: デバイス ID 情報に含まれるデバイスの主キー。
    2. ファイルを保存して閉じます。

  3. サンプル コードを実行する。

    dotnet run
    

コンソール アプリケーションを数分間実行した後、データを確認します。

  1. Azure portal のストレージ アカウントに移動します。

  2. ナビゲーション メニューから [ストレージ ブラウザー] を選びます。 [BLOB コンテナー] を選ぶと、これらのチュートリアルの過程で作成した 2 つのコンテナーが表示されます。

    ストレージ アカウント内の BLOB コンテナーを示すスクリーンショット。

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"
}

リソースをクリーンアップする

このチュートリアルの両方のパートで作成したリソースをすべて削除するには、リソース グループを削除します。 これにより、そのグループ内に含まれているすべてのリソースも削除されます。 リソース グループ全体を削除しない場合は、リソース グループ内の個々のリソースを選んで削除できます。

  1. Azure portal で、このチュートリアルの IoT ハブとストレージ アカウントを含むリソース グループに移動します。
  2. リソース グループ内にあるすべてのリソースを確認して、クリーンアップするリソースを決定します。
    • すべてのリソースを削除する場合は、 [リソース グループの削除] を選択します。
    • 特定のリソースのみを削除する場合は、各リソース名の横にあるチェック ボックスを使用して、削除するリソースを選択します。 次に、 [削除] を選択します。

次のステップ

このチュートリアルでは、IoT Hub メッセージがエンドポイントにルーティングされる際にメッセージ エンリッチメントを構成し、テストしました。

メッセージ エンリッチメントの詳細については、メッセージ エンリッチメントの概要に関するページを参照してください。

IoT Hub の詳細については、次のチュートリアルに進んでください。