Visual Studio 2022 を使用して Azure IoT Edge 用のモジュールを開発してデバッグする

適用対象:IoT Edge 1.4 checkmark IoT Edge 1.4

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

この記事では、Visual Studio 2022 を使用してカスタムの Azure IoT Edge モジュールを開発、デバッグ、およびデプロイする方法を示します。 Visual Studio 2022 では、C および C# で記述された IoT Edge モジュール用テンプレートを提供しています。 サポートされるデバイス アーキテクチャは、Windows X64 と、Linux X64 または ARM32 および ARM64 (プレビュー) です。 サポートされているオペレーティング システム、言語、およびアーキテクチャの詳細については、「Language and architecture support (言語とアーキテクチャのサポート)」を参照してください。

この記事には、2 つの IoT Edge 開発ツールの手順が含まれています。

  • コマンド ライン インターフェイス (CLI) は、開発に推奨されるツールです。
  • Visual Studio 拡張機能用の Azure IoT Edge ツール。 拡張機能はメンテナンス モードになっています。

最初に、ツール セレクター ボタンを使用して、この記事のツール オプションを選択します。 両方のツールには、次のような利点があります。

  • ローカル開発用コンピューター上で IoT Edge ソリューションとモジュールの作成、編集、ビルド、実行、デバッグを行うことができます。
  • Visual Studio 開発の利点を利用して、C または C# で Azure IoT モジュールのコードを書きます。
  • Azure IoT Hub を使用して IoT Edge ソリューションを IoT Edge デバイスにデプロイできます。

前提条件

この記事では、Windows を実行しているマシンを開発用マシンとして使用していることを前提としています。

  • 開発用マシンで Visual Studio 2022 をインストールするか、変更します。 [C++ ワークロードを使用した Azure 開発デスクトップ開発] オプションを選択します。

  • Visual Studio Marketplace から Azure IoT Edge Tools をダウンロードしてインストールします。 Azure IoT Edge Tools 拡張機能を使用して、IoT Edge ソリューションを作成および構築できます。 推奨される開発ツールは、コマンド ライン (CLI) Azure IoT Edge 開発ツールです。 拡張機能には、Visual Studio プロジェクトの作成に使用される Azure IoT Edge プロジェクト テンプレートが含まれています。 現時点では、使用する開発ツールに関係なく、拡張機能がインストールされている必要があります。

    重要

    Azure IoT Edge Tools for VS 2022 拡張機能は、メインテナント モードです。 推奨される開発ツールは、コマンド ライン (CLI) Azure IoT Edge 開発ツールです

    ヒント

    Visual Studio 2019 を使用している場合は、Visual Studio マーケットプレースから Azure IoT Edge Tools for VS 2019 をダウンロードしてインストールします。

  • Vcpkg ライブラリ マネージャーをインストールします

    git clone https://github.com/Microsoft/vcpkg
    cd vcpkg
    bootstrap-vcpkg.bat
    

    Windows 用の azure-iot-sdk-c パッケージをインストールします

    vcpkg.exe install azure-iot-sdk-c:x64-windows
    vcpkg.exe --triplet x64-windows integrate install
    
  • モジュール イメージをビルドして実行するために、Docker 互換のコンテナー管理システムをダウンロードし、開発用コンピューターにインストールします。 例として、Docker Community Edition をインストールします。

  • Linux コンテナーを使用してモジュールを開発するには、Docker Desktop の要件を満たす Windows コンピューターを使用します。

  • モジュール イメージを格納する Azure Container Registry または Docker Hub を作成します。

    ヒント

    プロトタイプおよびテスト目的で、クラウド レジストリの代わりに Docker のローカル レジストリを使用できます。

  • Azure CLI をインストールします。

  • デバイスでモジュールをテストするには、少なくとも 1 つの IoT Edge デバイスを備えたアクティブな IoT Hub が必要です。 テスト用の IoT Edge デバイスを作成するには、Azure portal または CLI で作成します。

    • Azure portal で作成するのが最も迅速です。 Azure portal から目的の IoT Hub リソースに移動します。 [デバイス管理] メニューの [デバイス] を選択し、[デバイスの追加] を選択します。

      [デバイスの作成] で、[デバイス ID] を使用してデバイスに名前を付け、[IoT Edge デバイス] チェック ボックスをオンにして、左下の [保存] を選択します。

      最後に、[デバイス管理] > [デバイス] メニューから、IoT Hub に新しいデバイスが存在することを確認します。 Azure portal を通じた IoT Edge デバイスの作成の詳細については、「対称キーを使用して Linux で IoT Edge デバイスを作成およびプロビジョニングする」を参照してください。

    • CLI を使用して IoT Edge デバイスを作成するには、Linux または Windows のクイックスタートの手順に従います。 IoT Edge デバイスを登録するプロセスで、IoT Edge デバイスを作成します。

    開発用マシンで IoT Edge デーモンを実行している場合は、Visual Studio で開発を始める前に、EdgeHub と EdgeAgent を停止することが必要になる可能性があります。

Azure IoT Edge プロジェクトを作成する

Visual Studio の IoT Edge プロジェクト テンプレートでは、IoT Edge デバイスにデプロイできるソリューションが作成されます。 まず、Azure IoT Edge ソリューションを作成します。 次に、そのソリューションにモジュールを作成します。 各 IoT Edge ソリューションには、複数のモジュールを含めることができます。

ソリューション内に 3 つのプロジェクトを構築してゆきます。 温度センサー モジュールに加えて EdgeAgentEdgeHub を含むメイン モジュール。 次に、さらに 2 つの IoT Edge モジュールを追加します。

重要

Visual Studio によって作成された IoT Edge プロジェクト構造は、Visual Studio Code のプロジェクト構造と同じではありません。

現在、Azure IoT Edge Dev Tool CLI では、Visual Studio プロジェクトの種類の作成はサポートされていません。 Visual Studio プロジェクトを作成するには、Visual Studio IoT Edge 拡張機能を使用する必要があります。

  1. Visual Studio で、新しいプロジェクトを作成します。

  2. [新しいプロジェクトの作成] で、Azure IoT Edge を検索します。 IoT Edge デバイスのプラットフォームとアーキテクチャに一致するプロジェクトを選択し、[次へ] を選択します。

    Create New Project

  3. [新しいプロジェクトの構成] で、プロジェクトの名前を入力し、場所を指定して、[作成] を選択します。

  4. [モジュールの追加] で、開発するモジュールの種類を選択します。 デプロイに追加する既存のモジュールがある場合は、[既存のモジュール] を選択します。

  5. [モジュール名] に、モジュールの名前を入力します。 コンテナー レジストリ内に一意の名前を選択します。

  6. [リポジトリ URL] で、モジュールのイメージ リポジトリの名前を指定します。 Visual Studio により、モジュール名には自動的に localhost:5000/<> が設定されます。 独自のレジストリ情報に置き換えます。 テスト用に Docker のローカル レジストリを使用する場合、localhost を使用します。 Azure Container Registry を使用する場合、お使いのレジストリの設定のログイン サーバーを使用します。 ログイン サーバーは <レジストリ名>.azurecr.io のようになります。 この文字列の localhost:5000 部分だけを置き換えて、最終的な結果が <レジストリ名>.azurecr.io/<対象のモジュール名> になるようにします。

  7. [追加] を選択して、お使いのモジュールをプロジェクトに追加します。

    Screenshot of how to add Application and Module.

    Note

    既存の IoT Edge プロジェクトがある場合でも、module.json ファイルを開くとリポジトリの URL を変更できます。 リポジトリ URL は、JSON ファイルの repository プロパティ内にあります。

これで、IoT Edge プロジェクトと IoT Edge モジュールが Visual Studio ソリューションに作成されました。

プロジェクト構造

ソリューションには、メイン プロジェクト フォルダーと 1 つのモジュール フォルダーを含む 2 つのプロジェクト レベル のフォルダーがあります。 たとえば、 AzureIotEdgeApp1 という名前のメイン プロジェクト フォルダーと IotEdgeModule1 という名前のモジュール フォルダーがあるとします。 メイン プロジェクト フォルダーには、配置マニフェストが含まれています。

モジュール プロジェクト フォルダーには、選択した言語に応じて、Program.cs または main.c という名前のモジュール コード用ファイルが含まれています。 このフォルダーには、モジュールのメタデータを記述する module.json という名前のファイルも含まれています。 ここに含まれているさまざまな Docker ファイルによって、Windows または Linux コンテナーとしてモジュールをビルドするために必要な情報が提供されます。

プロジェクトの配置マニフェスト

編集する配置マニフェストに名前が付けられます deployment.debug.template.json。 このファイルは IoT Edge 配置マニフェストのテンプレートであり、そこに、デバイス上で実行されるすべてのモジュールが、それらの相互のに通信方法と一緒に定義されています。 デプロイ マニフェストの詳細については、モジュールをデプロイしてルートを確立する方法に関するページを参照してください。

このデプロイ テンプレートを開いた場合、edgeAgentedgeHub の2 つのランタイム モジュールと、この Visual Studio プロジェクト内で作成したカスタム モジュールが含まれていることを確認できます。 SimulatedTemperatureSensor という名前の 4 番目のモジュールも含まれています。 この既定のモジュールでは、モジュールのテストに使用できるシミュレートされたデータが生成されます。必要ない場合は削除します。 シミュレートされた温度センサーの仕組みについては、SimulatedTemperatureSensor.csproj のソース コードを確認してください。

IoT Edge ランタイム バージョンを設定する

現在、最新の安定ランタイム バージョンは 1.4 です。 IoT Edge ランタイムバージョンを最新の安定リリースまたはデバイスのターゲットにするバージョンに更新する必要があります。

  1. ソリューション エクスプローラーでメイン プロジェクトの名前を右クリックし、[IoT Edge ランタイム バージョンの設定] を選択します。

    Screenshot of how to find and select the menu item named 'Set IoT Edge Runtime version'.

  2. ドロップダウン メニューを使用して、IoT Edge デバイスが実行されているランタイム バージョンを選択し、 [OK] を選択して変更を保存します。 変更が行われなかった場合は、[キャンセル] を選択して終了します。

    現時点では、拡張機能には最新のランタイム バージョンの選択は含まれていません。 ランタイム バージョンを 1.2 より高く設定する場合は、 deployment.debug.template.json 配置マニフェスト ファイルを開きます。 システム ランタイム モジュール イメージ edgeAgent および edgeHub のランタイム バージョンを変更します。 たとえば、IoT Edge ランタイム バージョン 1.4 を使用する場合は、配置マニフェスト ファイルで次の行を変更します。

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. バージョンを変更した場合は、プロジェクトの名前を右クリックして配置マニフェストを再生成し、[IoT Edge の配置の生成] を選択します。 これにより、配置テンプレートに基づいて配置マニフェストが生成され、Visual Studio プロジェクトの config フォルダーに表示されます

  1. deployment.debug.template.json 配置マニフェスト ファイルを開きます配置マニフェストは、ターゲットの IoT Edge デバイス上で構成されるモジュールを記述した JSON ドキュメントです。

  2. システム ランタイム モジュール イメージ edgeAgent および edgeHub のランタイム バージョンを変更します。 たとえば、IoT Edge ランタイム バージョン 1.4 を使用する場合は、配置マニフェスト ファイルで次の行を変更します。

    "systemModules": {
        "edgeAgent": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
        //...
        "edgeHub": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
        //...
    

モジュール インフラストラクチャと開発オプション

新しいモジュールを追加すると、コードに触れることなくテストを開始できるよう、ビルドしてデバイスにデプロイする準備ができている既定のコードが付属します。 モジュール コードは、モジュール フォルダー内の Program.cs (C# の場合) または main.c (C の場合) という名前のファイルにあります。

既定のソリューションは、SimulatedTemperatureSensor モジュールのシミュレートされたデータがモジュールにルーティングされ、そこで入力が受け取られて IoT Hub に送信されるように構築されています。

モジュール テンプレートを独自のコードでカスタマイズする準備ができたら、Azure IoT Hub SDK を使用して、セキュリティ、デバイス管理、信頼性など、IoT ソリューションの主なニーズに対処するモジュールをビルドします。

シミュレーターを使用したデバッグ

Azure IoT EdgeHub 開発ツールでは、ローカルでの開発およびデバッグ エクスペリエンスが提供されます。 このツールにより、IoT Edge ランタイムなしに IoT Edge モジュールを起動することができ、IoT Edge モジュールとソリューションのローカルでの作成、開発、テスト、実行、デバッグを行えます。 テストするために、イメージをコンテナー レジストリにプッシュしたり、それらをデバイスに配置したりする必要はありません。

詳細については、「Azure IoT EdgeHub 開発ツール」を参照してください。

Visual Studio でツールを初期化するには:

  1. Azure portal または Azure CLI から、IoT Edge デバイスの接続文字列 (IoT Hub 内にあります) を取得します。

    CLI を使用して接続文字列を取得する場合は、次のコマンドを使用し、"[device_id]" と "[hub_name]" を実際の値に置き換えます。

    az iot hub device-identity connection-string show --device-id [device_id] --hub-name [hub_name]
    
  2. Visual Studio の [ツール] メニューから、[Azure IoT Edge Tools]>[IoT Edge シミュレーターのセットアップ] と選択します。

  3. 接続文字列を貼り付けて、[OK] を選びます。

Note

結果は後続の Azure IoT Edge ソリューションすべてに自動的に適用されるため、お使いの開発用コンピューターではこの手順に一度だけ従う必要があります。 この手順にもう一度従うことができるのは、別の接続文字列への変更が必要になった場合のみです。

1 つのモジュールをビルドしてデバッグする

通常は、複数のモジュールを含むソリューション全体で実行する前に、各モジュールをテストしてデバッグする必要があります。 IoT Edge シミュレーター ツールを使用すると、ポート 53000 経由で送信メッセージを分離して 1 つのモジュールを実行できます。

  1. [ソリューション エクスプローラー]で、モジュール プロジェクト フォルダー (IotEdgeModule1 など) を選択して強調表示します。 カスタム モジュールをスタートアップ プロジェクトとして設定します。 メニューから [プロジェクト> スタートアップ プロジェクトとして設定] を選択します。

  2. [F5] キーを押すか、ツール バーの実行ボタンを選択して、1 つのモジュールの IoT Edge シミュレーターを起動します。 最初は 10 秒から 20 秒かかる場合があります。

    Screenshot of how to run a module.

  3. モジュールが正常に初期化された場合は、.Net Core コンソール アプリのウィンドウが表示されたことが分かるはずです。

  4. モジュールを検査するためのブレークポイントを設定します。

    • C# で開発する場合は ModuleBackgroundService.cs 内の PipeMessage() 関数にブレークポイントを設定します。
    • C を使用する場合は InputQueue1Callback() 内の InputQueue1Callback() 関数にブレークポイントを設定します。
  5. メッセージを送信してモジュールをテストします。 1 つのモジュールをデバッグする場合、シミュレーターは既定のポート 53000 でメッセージをリッスンします。 モジュールにメッセージを送信するには、 Git BashWSL Bash などのコマンド シェルから次の curl コマンドを実行します。

    curl --header "Content-Type: application/json" --request POST --data '{"inputName": "input1","data":"hello world"}' http://localhost:53000/api/v1/messages
    

    URL で右中かっこ/右角かっこが一致しないエラーが発生した場合、代わりに次のコマンドを試してください。

    curl --header "Content-Type: application/json" --request POST --data "{\"inputName\": \"input1\", \"data\", \"hello world\"}"  http://localhost:53000/api/v1/messages
    

    Screenshot of the output console, Visual Studio project, and Bash window.

    ブレークポイントがトリガーされるはずです。 デバッガーの実行中に見つかる変数は、Visual Studio の [ローカル] ウィンドウで参照できます。 [デバッグ>]、[Windows>ローカル] の順に移動します。

    Bash またはシェルに、{"message":"accepted"} という確認が表示されるはずです。

    .NET コンソールに、次のように表示されるはずです。

    IoT Hub module client initialized.
    Received message: 1, Body: [hello world]
    

    ヒント

    curl の代わりに PostMan またはその他の API ツールを使用してメッセージを送信することもできます。

  6. Ctrl + F5 キーを押すか停止ボタンをクリックして、デバッグを停止します。

複数のモジュールのビルドとデバッグ

1 つのモジュールの開発が完了したら、複数のモジュールを含むソリューション全体を実行してデバッグします。 IoT Edge シミュレーター ツールを使用すると、メッセージ ルーティング用のシミュレートされた edgeHub を含む、配置マニフェストで定義されているすべてのモジュールを実行できます。 この例では、2 つのカスタム モジュールとシミュレートされた温度センサー モジュールを実行します。 シミュレートされた温度センサー モジュールからのメッセージは、各カスタム モジュールにルーティングされます。

  1. ソリューション エクスプローラーで、メイン プロジェクト フォルダーを右クリックして、ソリューションに 2 つ目のモジュールを追加します。 メニューの [追加]>[New IoT Edge Module]\(新しい IoT Edge モジュール\) を選択します。

    Screenshot of how to add a 'New IoT Edge Module' from the menu.

  2. Add module ウィンドウで、新しいモジュールに名前を付け、リポジトリ URL の localhost:5000 の部分を、前に行ったように Azure Container Registry ログイン サーバーに置き換えます。

  3. deployment.debug.template.json ファイルを開き、新しいモジュールが modules セクションに追加されていることを確認します。 新しいモジュールから IoT Hub にメッセージを送信するため、新しいルートも EdgeHub 内の routes セクションに追加されました。 シミュレートされた温度センサーから新しいモジュールにデータを送信するには、JSON の次のような行によって別のルートを追加します。 <NewModuleName> (2 か所) を独自のモジュール名に置き換えます。

    "sensorTo<NewModuleName>": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/<NewModuleName>/inputs/input1\")"
    
  4. メイン プロジェクト (AzureIotEdgeApp1 など) を右クリックし、[スタートアップ プロジェクトとして設定] を選択します。 メイン プロジェクトをスタートアップ プロジェクトとして設定すると、ソリューション内のすべてのモジュールが実行されます。 これには、ソリューションに追加したモジュール、シミュレートされた温度センサー モジュール、およびシミュレートされた Edge ハブの両方が含まれます。

  5. [F5] キーを押すか、実行ツールバー ボタンを選択してソリューションを実行します。 最初は 10 秒から 20 秒かかる場合があります。 このプロジェクトに必要なポートをバインドする可能性のある他の Docker コンテナーが実行中でないことを確認してください。

  6. モジュールごとに 2 つの .NET Core コンソール アプリ ウィンドウが表示されます。

  7. モジュールを検査するためのブレークポイントを設定します。

    • C# で開発する場合は ModuleBackgroundService.cs 内の PipeMessage() 関数にブレークポイントを設定します。
    • C を使用する場合は InputQueue1Callback() 内の InputQueue1Callback() 関数にブレークポイントを設定します。
  8. 各モジュール内にブレークポイントを作成したら、F5 キーを押して複数のモジュールを同時に実行し、デバッグします。 各ウィンドウが異なるモジュールを表している .Net Core コンソール アプリ ウィンドウが複数表示されるはずです。

    Screenshot of Visual Studio with two output consoles.

  9. Ctrl + F5 キーを押すか停止ボタンをクリックして、デバッグを停止します。

イメージをビルドしてレジストリにプッシュする

モジュールを開発してデバッグすると、モジュール イメージをビルドして Azure Container Registry にプッシュできるようになります。 その後、モジュールを IoT Edge デバイスに展開できます。

  1. IoT Edge メイン プロジェクトが、独立したモジュールの 1 つではなく、スタートアップ プロジェクトを設定します。

  2. モジュール イメージに対して作成する構成として [デバッグ] または [リリース] を選択します。

    Note

    [デバッグ] を選択すると、Visual Studio では、Docker イメージのビルドに Dockerfile.(amd64|windows-amd64).debug が使用されます。 これにより、コンテナー イメージのビルド中に .NET Core コマンド ライン デバッガー VSDBG が組み込まれます。 運用環境対応の IoT Edge モジュールの場合は、[リリース] 構成を使用することをお勧めします。これには、VSDBG が含まれていない Dockerfile.(amd64|windows-amd64) が使用されます。

  3. Azure Container Registry (ACR) のようなプライベート レジストリを使用している場合は、次の Docker コマンドを使用してサインインします。 ユーザー名とパスワードは、Azure portal のレジストリの [アクセス キー] ページから取得できます。

    docker login <ACR login server>
    
  4. ファイル deployment.debug.template.json 内にあるランタイム設定に、Azure Container Registry のログイン情報を追加してみましょう。 これには、2 つの方法があります。 レジストリ資格情報は、.env ファイルに追加すること (最も安全)、または deployment.debug.template.json ファイルに直接追加することができます。

    資格情報を .env ファイルに追加する:

    [ソリューション エクスプローラー][すべてのファイルを表示] ツール バー ボタンを選択します。 ファイルが .env 表示されます。 .env ファイルに、Azure Container Registry のユーザー名とパスワードを追加します。 これらの資格情報は、Azure portal では、Azure Container Registry の [アクセス キー] ページに記載されています。

    Screenshot of button that shows all files in the Solution Explorer.

        DEFAULT_RT_IMAGE=1.2
        CONTAINER_REGISTRY_USERNAME_myregistry=<my-registry-name>
        CONTAINER_REGISTRY_PASSWORD_myregistry=<my-registry-password>
    

    資格情報を deployment.debug.template.json に直接追加する

    資格情報を展開テンプレートに直接追加する場合は、プレースホルダーを ACR 管理者のユーザー名、パスワード、レジストリ名に置き換えます。

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.io"
              }
            }
          }
    

    Note

    この記事では、開発とテストのシナリオに便利な、Azure Container Registry の管理者ログイン資格情報を使用します。 運用環境のシナリオに向けて準備ができたら、サービス プリンシパルのような最小限の特権で認証できるオプションを使用することをお勧めします。 詳細については、[コンテナー レジストリへのアクセスを管理する] を参照してください。

  5. ローカル レジストリを使用している場合は、ローカル レジストリを実行することができます。

  6. 最後に、ソリューション エクスプローラーでメイン プロジェクト フォルダーを右クリックし、[IoT Edge モジュールをビルドしてプッシュする] を選択して、各モジュールの Docker イメージをビルドしてプッシュします。 これには数分かかる場合があります。 Visual Studio の出力コンソールに Finished Build and Push IoT Edge Modules. と表示されたら完了です。

ソリューションのデプロイ

モジュール イメージをビルドして Azure Container Registry にプッシュしたため、ソリューションを IoT Edge デバイスにデプロイできます。 既に、このチュートリアルを通して見てきた配置マニフェスト テンプレートがあります。 それから配置マニフェストを生成し、次に Azure CLI コマンドを使用して、Azure の IoT Edge デバイスにモジュールをデプロイしましょう。

  1. Visual Studio ソリューション エクスプローラーでメイン プロジェクトを右クリックし、[IoT Edge の配置の生成] を選択します。

    Screenshot of location of the 'generate deployment' menu item.

  2. ローカルの Visual Studio メイン プロジェクト フォルダーに移動し、config フォルダーにアクセスします。 ファイル パスは C:\Users\<YOUR-USER-NAME>\source\repos\<YOUR-IOT-EDGE-PROJECT-NAME>\config のようになるでしょう。 ここでは、次のような deployment.amd64.debug.json生成された配置マニフェストを見つけます。

  3. deployment.amd64.debug.json ファイルを調べ、edgeHub スキーマのバージョンが 1.2 に設定されていることを確認します。

     "$edgeHub": {
         "properties.desired": {
           "schemaVersion": "1.2",
           "routes": {
             "IotEdgeModule2022ToIoTHub": "FROM /messages/modules/IotEdgeModule2022/outputs/* INTO $upstream",
             "sensorToIotEdgeModule2022": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/IotEdgeModule2022/inputs/input1\")",
             "IotEdgeModule2022bToIoTHub": "FROM /messages/modules/IotEdgeModule2022b/outputs/* INTO $upstream"
           },
           "storeAndForwardConfiguration": {
             "timeToLiveSecs": 7200
           }
         }
       }
    

    ヒント

    Visual Studio 2022 の展開テンプレートには 1.2 スキーマ バージョンが必要です。 これを 1.1 または 1.0 にする必要がある場合は、配置が生成されるまで待機します (これを deployment.debug.template.json で変更しないでください)。 配置を生成すると、既定で 1.2 スキーマが作成されます。 ただし、生成されたマニフェストを Azure にデプロイする前に、必要に応じて deployment.amd64.debug.json を手動で変更できます。

    重要

    現在、IoT Edge デバイスが配置されると、スキーマ バージョン 1.2 の Azure portal では正しく表示されません (バージョン 1.1 では問題ありません)。 これは既知のバグであり、まもなく修正される予定です。 ただし、これはお使いのデバイスには影響しません。IoT Hub に接続されたままであり、Azure CLI を使用していつでも通信可能であるためです。

    Screenshot of Azure portal error on the IoT Edge device page.

  4. ここで、Azure CLI コマンドを使用してマニフェストを配置してみましょう。 Visual Studio の開発者コマンド プロンプトを開き、config ディレクトリに変更します。

        cd config
    
  5. IoT Edge デバイスのマニフェストを IoT Hub に配置します。 このコマンドによって、ソリューションで開発されたモジュールを使用するようにデバイスが構成されます。 配置マニフェストは、前の手順で作成し、config フォルダーに保存しました。 config フォルダーから次の配置コマンドを実行します。 [device id][hub name][file path] は、実際の値に置き換えます。 IoT Edge デバイス ID が IoT Hub に存在しない場合は、このデバイス ID を作成する必要があります。

        az iot edge set-modules --device-id [device id] --hub-name [hub name] --content [file path]
    

    たとえば、コマンドは次のようになります。

    az iot edge set-modules --device-id my-device-name --hub-name my-iot-hub-name --content deployment.amd64.debug.json
    
  6. コマンドの実行後、コマンド プロンプトには、JSON で出力された配置の確認が表示されます。

モジュールの Docker イメージをビルドする

モジュールを開発すると、モジュール イメージをビルドしてコンテナー レジストリに格納し、IoT Edge デバイスにデプロイできるようになります。

モジュールの Dockerfile を使用して、モジュールの Docker イメージをビルドします。

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

たとえば、コマンド シェルがプロジェクト ディレクトリにあり、モジュール名が IotEdgeModule1 であるとします。 ローカル レジストリまたは Azure コンテナー レジストリのイメージをビルドするには、次のコマンドを使用します。

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure Container Registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

モジュールの Docker イメージをプッシュする

モジュール イメージをローカル レジストリまたはコンテナー レジストリにプッシュします。

docker push <ImageName>

次に例を示します。

# Push the Docker image to the local registry

docker push localhost:5000/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure Container Registry
az acr login --name myacr
docker push myacr.azurecr.io/iotedgemodule1:0.0.1-amd64

モジュールを IoT Edge デバイスにデプロイします。

Visual Studio で、メイン プロジェクトの deployment.debug.template.json 配置マニフェスト ファイルを開きます。 配置マニフェストは、ターゲットの IoT Edge デバイス上で構成されるモジュールを記述した JSON ドキュメントです。 デプロイの前に、Azure Container Registry 資格情報とモジュール イメージおよび適切な createOptions の値で更新する必要があります。 createOption の値の詳細については、「IoT Edge モジュールのコンテナー作成オプションを構成する方法」を参照してください。

  1. Azure Container Registry を使用してモジュール イメージを格納する場合は、edgeAgent 設定で deployment.debug.template.json資格情報を追加する必要があります。 たとえば、 にします。

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    //...
    
  2. 画像 のプロパティの値を、レジストリにプッシュしたモジュール イメージ名に置き換えます。 たとえば、カスタム モジュール myacr.azurecr.io/iotedgemodule1:0.0.1-amd64IotEdgeModule1 用にタグ付けされたイメージ をプッシュした場合は、イメージ プロパティの値を タグ値に置き換えます。

  3. createOptions 値を、デプロイ テンプレート内の各システムおよびカスタム モジュールの文字列化されたコンテンツに追加または置き換えます。

    たとえば、IotEdgeModule1 の イメージcreateOptions の設定は次のようになります。

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    

IoT Edge Azure CLI set-modules コマンドを使用して、モジュールを Azure IoT Hub にデプロイします。 たとえば、deployment.debug.amd64.json ファイルで定義されているモジュールを、IoT Edge デバイス my-device の IoT Hub my-iot-hub にデプロイするには、次のコマンドを使用します。

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

ヒント

IoT Hub 接続文字列は、Azure portal の Azure IoT Hub の >[セキュリティの設定]>[Shared access policies](共有アクセス ポリシー) にあります。

デバイスへの配置を確認する

IoT Edge モジュールが Azure にデプロイされたことを確認するには、たとえば SSH や Azure Bastion を使用して、デバイス (または仮想マシン) にサインインし、IoT Edge list コマンドを実行します。

   iotedge list

デバイスまたは仮想マシンで実行されているモジュールの一覧が表示されるはずです。

   NAME                        STATUS           DESCRIPTION      CONFIG
   SimulatedTemperatureSensor  running          Up a minute      mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0
   edgeAgent                   running          Up a minute      mcr.microsoft.com/azureiotedge-agent:1.2
   edgeHub                     running          Up a minute      mcr.microsoft.com/azureiotedge-hub:1.2
   IotEdgeModule1              running          Up a minute      myacr.azurecr.io/iotedgemodule1:0.0.1-amd64.debug
   myIotEdgeModule2            running          Up a minute      myacr.azurecr.io/myiotedgemodule2:0.0.1-amd64.debug

Docker リモート SSH を使用してデバッグする

Docker エンジンと Moby エンジンでは、コンテナーへの SSH 接続がサポートされているため、Visual Studio を使用してリモート デバイスでコードをアタッチおよびデバッグできます。

  1. Docker にリモート接続するには、root レベルの特権が必要です。 非 root ユーザーとしての Docker の管理に関するページの手順に従って、リモート デバイスでの Docker デーモンへの接続を許可します。 デバッグが完了したら、Docker グループからユーザーを削除できます。

  2. Visual Studio を使用して、リモート デバイス 上の Docker コンテナーで実行されているプロセスにアタッチする 手順に従います。

  3. Visual Studio で、カスタム モジュールにブレークポイントを設定します。

  4. ブレークポイントにヒットすると、変数の検査、コードのステップ実行、モジュールのデバッグを行うことができます。

    Screenshot of Visual Studio attached to remote docker container on a device paused on a breakpoint.

次のステップ