チュートリアル: IoT Hub メッセージ ルーティングを使用してデバイス データを Azure Storage に送信する

Azure IoT Hub のメッセージ ルーティングを使用して、IoT デバイスから Blob Storage、Service Bus キュー、Service Bus トピック、Event Hubs などの Azure サービスにテレメトリ データを送信します。 すべての IoT ハブには、Event Hubs との互換性がある、既定の組み込みのエンドポイントがあります。 ルーティング クエリを定義することで、カスタム エンドポイントを作成し、他の Azure サービスにメッセージをルーティングすることもできます。 IoT ハブに到着した各メッセージは、ルーティング クエリが一致するすべてのエンドポイントにルーティングされます。 メッセージが、定義されているルーティング クエリのいずれとも一致しない場合、既定のエンドポイントにルーティングされます。

このチュートリアルでは、以下のタスクを実行します。

  • IoT ハブを作成し、デバイス メッセージを送信します。
  • ストレージ アカウントを作成します。
  • ストレージ アカウントのカスタム エンドポイントを作成し、IoT ハブからメッセージをルーティングします。
  • ストレージ アカウント BLOB 内のデバイス メッセージを表示します。

前提条件

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

  • Azure サブスクリプション内の IoT ハブ。 ハブがまだない場合は、「IoT ハブの作成」の手順に従うことができます。

  • このチュートリアルでは、C# 向けの Azure IoT SDK からのサンプル コードを使用します。

    • SDK リポジトリをダウンロードするか、開発用マシンに複製します。
    • 開発用マシン上に .NET Core 3.0.0 以降をインストールします。 dotnet --version を実行してバージョンを確認し、必要に応じて .NET をダウンロードします。
  • ポート 8883 がファイアウォールで開放されていることを確認してください。 このチュートリアルのサンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。 このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。 この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。

  • 必要に応じて、Azure IoT Explorer をインストールします。 このツールは、メッセージが IoT ハブに到着したときのメッセージの監視に役立ちます。 この記事では、Azure IoT Explorer を使用します。

Azure portal には、その他の前提条件はありません。

デバイスを登録し、IoT Hub にメッセージを送信する

IoT ハブに新しいデバイスを登録します。

重要

この記事では、Shared Access Signature (対称キー認証とも呼ばれます) を使用してデバイスを接続する手順について説明しています。 この認証方法はテストと評価には便利ですが、デバイスの認証方法としては、X.509 証明書を使用する方が安全です。 詳細については、「セキュリティのベスト プラクティス」の「接続のセキュリティ」を参照してください。>

  1. Azure Portal にサインインし、IoT Hub に移動します。

  2. メニューの [デバイス管理] セクションから [デバイス] を選択します。

  3. [デバイスの追加] を選択します。

    Azure portal での新しいデバイスの追加を示すスクリーンショット。

  4. デバイス ID を指定し、[保存] を選択します。

  5. 新しいデバイスがデバイスの一覧に表示されます。 そうでない場合は、ページを更新します。 デバイス ID を選択し、[デバイスの詳細] ページを開きます。

  6. デバイス キーの 1 つをコピーして保存します。 この値を使用して、シミュレートされたデバイス テレメトリ メッセージを生成するサンプル コードを構成します。

    デバイスの詳細ページからの主キーのコピーを示すスクリーンショット。

デバイス ID とキーが用意されたので、サンプル コードを使用して IoT Hub へのデバイス テレメトリ メッセージの送信を開始します。

ヒント

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

  1. 前提条件の一部として実行しなかった場合は、GitHub から C# リポジトリの Azure IoT SDK を今すぐにダウンロードまたは複製してください。

  2. SDK をダウンロードまたはクローンしたフォルダーから、azure-iot-sdk-csharp\iothub\device\samples\how to guides\HubRoutingSample フォルダーに移動します。

  3. Azure IoT C# SDK と HubRoutingSample.csproj ファイルに指定されている必要な依存関係をインストールします。

    dotnet restore
    
  4. 任意のエディターで Parameters.cs ファイルをオープンします。 このファイルには、サンプルでサポートされているパラメーターが示されます。 この記事では、サンプルを実行するときに、PrimaryConnectionString パラメーターのみを使用します。 このファイルのコードを確認します。 変更は不要です。

  5. 次のコマンドを使用してサンプル コードをビルドし、実行します。

    <myDevicePrimaryConnectionString> を IoT ハブ内のデバイスのプライマリ接続文字列に置き換えてください。

    dotnet run --PrimaryConnectionString <myDevicePrimaryConnectionString>
    
  6. メッセージが IoT Hub に送信されるときに、出力用に印刷されたメッセージが表示されるようになります。 チュートリアルの間は、このプログラムを実行したままにします。

メッセージを表示するように IoT Explorer を構成する

IoT Hub に接続し、組み込みエンドポイントに到着したメッセージを読み取るように IoT Explorer を構成します。

まず、IoT ハブの接続文字列を取得します。

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

  2. メニューの [セキュリティ設定] セクションから [共有アクセス ポリシー] を選択します。

  3. iothubowner ポリシーを選択します。

    iothubowner 共有アクセス ポリシーを開く。

  4. プライマリ接続文字列をコピーします。

    iothubowner プライマリ接続文字列をコピーする。

次に、その接続文字列を使用して、IoT ハブ用に IoT Explorer を構成します。

  1. 開発用マシンで IoT Explorer を開きます。

  2. [接続の追加] を選択します。

    IoT エクスプローラーでの IoT ハブ接続の追加を示すスクリーンショット。

  3. ハブの接続文字列をテキスト ボックスに貼り付けます。

  4. [保存] を選択します。

  5. IoT ハブに接続すると、デバイスの一覧が表示されます。 このチュートリアル用に作成したデバイス ID を選択します。

  6. [テレメトリ] を選択します。

  7. デバイスが引き続き実行されている状態で、[スタート] を選択します。 デバイスが実行されていない場合、テレメトリは表示されません。

    IoT エクスプローラーでデバイス テレメトリの監視を開始する。

  8. デバイスから届くメッセージが表示され、最新のものが上部に表示されます。

    組み込みのエンドポイントで IoT ハブに到着するメッセージを表示する。

    受信メッセージをしばらく見て、通常、ストレージ、クリティカルの 3 種類のメッセージ表示を確認します。 これを確認したら、デバイスを停止できます。

これらのメッセージはすべて、IoT ハブの既定の組み込みエンドポイントに到着します。 次のセクションでは、カスタム エンドポイントを作成し、メッセージのプロパティに基づいて、これらのメッセージの一部をストレージにルーティングします。 これらのメッセージは、IoT Explorer に表示されなくなります。メッセージは、IoT ハブ内の他のルートと一致しない場合にのみ組み込みエンドポイントに送信されるためです。

メッセージ ルーティングを設定する

シミュレートされたデバイスからメッセージに添付されたプロパティに基づいて、メッセージを異なるリソースにルーティングします。 カスタム ルーティングされないメッセージは、既定のエンドポイント (メッセージ/イベント) に送信されます。

このチュートリアルのサンプル アプリは、IoT ハブに送信する各メッセージにレベル プロパティを割り当てます。 各メッセージには、 通常ストレージ、または クリティカルのレベルがランダムに割り当てられます。

最初の手順では、データのルーティング先のエンドポイントを設定します。 2 番目の手順では、そのエンドポイントを使用するメッセージ ルートを設定します。 ルーティングの設定後、ポータルでエンドポイントとメッセージ ルートを表示できます。

ストレージ アカウントの作成

Azure Storage アカウントとそのアカウント内にコンテナーを作成します。このアカウントには、そのアカウントにルーティングされるデバイス メッセージが保持されます。

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

  2. [作成] を選択します

  3. ストレージ アカウントには、下の値を指定します。

    パラメーター
    サブスクリプション IoT Hub を含む同じサブスクリプションを選択します。
    リソース グループ IoT Hub を含む同じリソース グループを選択します。
    Storage account name (ストレージ アカウント名) グローバルに一意の名前を [ストレージ アカウント] に指定します。
    パフォーマンス 既定値の [標準] をそのまま使用します。

    ストレージ アカウントの作成を示すスクリーンショット。

  4. [確認と作成] を選択すると、他のすべての既定値をそのまま使用できます。

  5. 検証が完了した後、 [作成] を選択します。

  6. デプロイが完了したら、[リソースに移動] を選択します。

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

  8. [+ コンテナー] を選択して、新しいコンテナーを作成します。

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

  9. コンテナーの名前を入力し、[作成] を選択します。

ストレージ アカウントへのルーティング

ストレージ アカウントへのルーティングを設定します。 このセクションでは、作成したストレージ アカウントを指す新しいエンドポイントを定義します。 次に、 [level] プロパティが [strage] に設定されているメッセージをフィルター処理するルートを作成し、それらを ストレージ エンドポイントにルーティングします。

Note

データは、既定の Apache Avro 形式または JSON のいずれかで Blob Storage に書き込むことができます。

エンコード形式は、BLOB ストレージ エンドポイントの構成時にのみ設定できます。 既に設定されているエンドポイントの形式は変更できません。 JSON エンコードを使用する場合は、メッセージのシステム プロパティで contentType を JSON に設定し、contentEncoding を UTF-8 に設定する必要があります。

BLOB ストレージ エンドポイントの使用に関する詳細については、ストレージへのルーティングに関するガイダンスを参照してください。

重要

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

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

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

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

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

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

    正しいオプションが選ばれている [ストレージ エンドポイントの追加] ウィンドウを示すスクリーンショット。

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

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

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

    ルーティング クエリを使用したルートの追加を示すスクリーンショット。

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

ルーティングされたメッセージを表示する

ルートが IoT Hub で作成され、有効になると、そのクエリ条件を満たすメッセージのストレージ エンドポイントへのルーティングが直ちに開始されます。

IoT Explorer を使用して組み込みエンドポイントを監視する

開発用マシンの IoT Explorer セッションに戻ります。 IoT Explorer が IoT ハブの組み込みエンドポイントを監視することを思い出してください。 つまり、作成したカスタム ルートによってルーティングされていないメッセージのみが表示されます。

コードを実行して、サンプルをもう一度開始します。 受信メッセージをしばらく監視すると、levelnormal または critical に設定されているメッセージのみが表示されます。

ストレージ コンテナー内のメッセージを表示する

メッセージがストレージ コンテナーに到着していることを確認します。

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

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

  3. このチュートリアル用に作成したコンテナーを選択します。

  4. IoT ハブの名前を持つフォルダーが存在する必要があります。 .json ファイルが表示されるまで、ファイル構造をドリルダウンします。

    ストレージ内のルーティングされたメッセージの検索を示すスクリーンショット。

  5. JSON ファイルを選択し、[ダウンロード] を選択して JSON ファイルをダウンロードします。 level プロパティが storage に設定されているデバイスからのメッセージが含まれていることを確認します。

  6. サンプルの実行を停止します。

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

このチュートリアルで使用した Azure リソースをすべて削除するには、リソース グループを削除します。 これにより、そのグループ内に含まれているすべてのリソースも削除されます。 リソース グループ全体を削除しない場合は、Azure portal を使用して個々のリソースを見つけて削除します。

次のチュートリアルに進む場合は、ここで作成したリソースを残してください。

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

次のステップ

このチュートリアルでは、Azure リソースのカスタム エンドポイントを作成し、そのエンドポイントにデバイス メッセージを送信するルートを作成する方法について説明しました。 次のチュートリアルに進み、ダウンストリーム処理を簡略化するために使用できる追加のデータでメッセージをエンリッチする方法を学習します