次の方法で共有


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

対象:IoT Edge 1.5 チェックマーク IoT Edge 1.5

重要

IoT Edge 1.5 LTS は、サポートされているリリースです。 IoT Edge 1.4 LTS は 2024 年 11 月 12 日に終了しました。 以前のリリースを使用している場合は、「Update IoT Edgeを参照してください。

この記事では、Visual Studio Codeを使用して複数の言語でIoT Edgeモジュールをデバッグする方法について説明します。 開発用コンピューターで、Visual Studio Codeを使用して、モジュールをローカルまたはリモートのモジュール コンテナーにアタッチしてデバッグします。

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

  • Azure IoT Edge 開発ツール コマンドライン ツール (CLI)。 このツールは開発に適しています。
  • Azure IoT Edge の Visual Studio Code 拡張機能用ツール。 拡張機能はメンテナンス モードになっています。

この記事の冒頭にあるツール セレクター ボタンを使用して、ツールのバージョンを選択します。

Visual Studio Codeでは、次のプログラミング言語IoT Edgeモジュールの記述がサポートされています。

  • C# と C# Azure Functions
  • C
  • Python
  • Node.js
  • Java

Azure IoT Edgeは、次のデバイス アーキテクチャで動作します。

  • AMD64
  • ARM32v7
  • ARM64

サポートされているオペレーティング システム、言語、およびアーキテクチャの詳細については、「Language and architecture support (言語とアーキテクチャのサポート)」を参照してください。

Visual Studio Code IoT Edge拡張機能を使用する場合は、IoT Edge シミュレーターでモジュール コードを起動してデバッグすることもできます。

IoT Edge for Linux on Windows (EFLOW) を使用して、linux コンテナーでWindows開発コンピューターとデバッグ モジュールを使用することもできます。 モジュールの開発に EFLOW を使用する方法の詳細については、「Tutorial: Windows」を参照してください。

Visual Studio Codeのデバッグ機能を初めて使用する場合は、「Visual Studio Code デバッグを参照してください。

前提条件

Windows、macOS、または Linux を実行しているコンピューターまたは仮想マシンを開発マシンとして使用できます。 Windows コンピューターでは、Windowsまたは Linux モジュールを開発できます。 Linux モジュールを開発するには、Docker Desktop 用の requirements を満たすWindows コンピューターを使用します。

開発とデバッグに必要なツールをインストールするには、Visual Studio Code チュートリアルを使用して Develop Azure IoT Edge モジュールを完了します。

Visual Studio Codeをインストールします。

次の拡張機能を追加します。

  • Azure IoT Edge 拡張機能。 Visual Studio Code 拡張機能用の Azure IoT Edge ツールは、メンテナンス モードです。
  • Azure IoT Hub 拡張機能。

デバイスでモジュールをデバッグするには、次のものが必要です。

  • 少なくとも 1 つのIoT Edge デバイスを持つアクティブなIoT Hub。
  • 物理IoT Edge デバイスまたは仮想デバイス。 Linuxのクイックスタートの手順に従って、Azureに仮想デバイスを作成。
  • カスタム IoT Edge モジュール。 カスタム モジュールを作成するには、Visual Studio Code チュートリアルを使用して、Develop Azure IoT Edge モジュールの手順に従います。

IoT Edge シミュレーターを使用してコンテナーなしでデバッグする

IoT Edge シミュレーターは、開発用コンピューターで実行され、1 つのIoT Edge デバイスの動作をシミュレートするツールです。 IoT Edge シミュレーターを使用すると、物理デバイスや完全なIoT Edge デバイス ランタイムなしで、IoT Edge モジュールを開発してテストできます。

次のデバッグ手順では、カスタム モジュールが既に作成されていることを前提としています。 カスタム モジュールを作成していない場合は、Visual Studio Code チュートリアルを使用して、Develop Azure IoT Edge モジュールの手順に従います。

C または Python を使用している場合、コンテナーなしでモジュールをデバッグすることはできません。

IoT Edge シミュレーターを使用してアタッチ モードでデバッグする

アタッチ モードでのデバッグは、C またはPythonでは使用できません。

IoT Edge ランタイムを使用してモジュールをデバッグする

各モジュール フォルダーには、コンテナーの種類ごとに複数の Docker ファイルが含まれています。 拡張子 .debug で終わる任意のファイルを使用して、テスト用のモジュールをビルドします。

このメソッドを使用してモジュールをデバッグする場合、モジュールは IoT Edge ランタイムの上で実行されます。 IoT EdgeデバイスとVisual Studio Codeは同じコンピューター上で実行できますが、通常、Visual Studio Codeは開発用コンピューター上で実行され、IoT Edgeランタイムとモジュールは別の物理マシンで実行されます。 Visual Studio Codeからデバッグするには:

  • IoT Edge デバイスをセットアップし、.debug Dockerfile を使用してIoT Edge モジュールをビルドしてから、IoT Edge デバイスにデプロイします。
  • Visual Studio Codeがリモート コンピューター上のコンテナー内のプロセスにアタッチできるように、launch.jsonを更新します。 このファイルは、ワークスペース内の フォルダー内にあり、デバッグをサポートする新しいモジュールを追加するたびに更新されます。
  • リモート SSH デバッグを使用して、リモート マシン上のコンテナーにアタッチします。

モジュールをビルドして IoT Edge デバイスにデプロイする

Visual Studio Codeで、deployment.debug.template.json 配置マニフェスト ファイルを開きます。 展開マニフェストでは、ターゲット IoT Edge デバイスで構成するモジュールについて説明します。 デプロイする前に、Azure Container Registry資格情報とモジュール イメージを適切な createOptions 値で更新します。 createOption 値の詳細については、「IoT Edge モジュールのコンテナー作成オプションを構成する方法を参照してください。

  1. Azure Container Registryを使用してモジュール イメージを格納する場合は、 edgeAgent>settings>registryCredentials セクションdeployment.debug.template.jsonに資格情報を追加します。 両方の場所の myacr を独自のレジストリ名に置き換え、パスワードと ログイン サーバー アドレスを指定します。 次に例を示します。

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_azure_container_registry_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    ...
    
  2. 一覧表示されているシステム (edgeHub と edgeAgent) とカスタム モジュール (filtermodule など) ごとに、次の文字列化されたコンテンツを createOptions の値に追加するか置き換えます。 必要に応じて、値を変更します。

    "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    

    たとえば、filtermodule の構成は次のようになります:

    "filtermodule": {
    "version": "1.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    
  1. Visual Studio Code コマンド パレットで、コマンド Azure IoT Edge: IoT Edge ソリューションのビルドとプッシュを実行します。
  2. 対象のソリューションの ファイルを選択します。
  3. Visual Studio Code エクスプローラー ビューの Azure IoT Hub>Devices セクションで、展開のIoT Edgeデバイス名を右クリックし、 [単一デバイスの展開の作成 を選択します。

    ヒント

    選択したデバイスが IoT Edge デバイスであることを確認するには、それを選択してモジュールの一覧を展開し、$edgeHub$edgeAgent の存在を確認します。 すべてのIoT Edgeデバイスには、これら 2 つのモジュールが含まれています。

  4. ソリューションの config フォルダーに移動し、 ファイルを選択して、[Select Edge Deployment Manifest]\(Edge 配置マニフェストの選択\) を選択します。

ターミナルで コマンドを実行して、デバイスまたは仮想マシンからコンテナーの状態を確認します。 このコマンドを実行すると、コンテナーが一覧表示されます。 Visual Studio Codeされ、IoT Edge ランタイムが同じコンピューターで実行されている場合は、Visual Studio Code Docker ビューで状態を確認します。

重要

イメージのAzure Container Registryなどのプライベート レジストリを使用している場合は、イメージをプッシュするために認証が必要になる場合があります。 docker login <Azure Container Registry login server> または az acr login --name <Azure Container Registry name> を使用して認証します。

Docker にサインインする

コンテナー イメージをレジストリ内のストレージにプッシュできるように、Docker にコンテナー レジステリの資格情報を提供します。

  1. レジストリの作成後に保存したAzure Container Registry資格情報を使用して Docker にサインインします。

    docker login -u <Azure Container Registry username> -p <Azure Container Registry password> <Azure Container Registry login server>
    

    の使用を推奨するセキュリティ警告が表示される場合があります。 運用環境のシナリオでは推奨されるベスト プラクティスですが、このチュートリアルの範囲外です。 詳細については、docker login のリファレンスをご覧ください。

  2. Azure Container Registryにサインインします。 コマンドを使用するには、azが必要になる場合があります。 このコマンドでは、[設定][アクセス キー] でのコンテナー レジストリで見つかったユーザー名とパスワードが求められます。

    az acr login -n <Azure Container Registry name>
    

ヒント

もしこのチュートリアルの途中でログアウトしてしまった場合は、Docker のサインイン手順を繰り返し、Azure Container Registry のサインイン手順を行ってください。その後、続行してください。

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

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

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

たとえば、ローカル レジストリまたはAzure Container Registryのイメージをビルドするには、次のコマンドを使用します。

# Build the image for the local registry

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

# Or build the image for an Azure Container Registry

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

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

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

docker push <ImageName>

次に例を示します。

# Push the Docker image to the local registry

docker push localhost:5000/filtermodule:0.0.1-amd64

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

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

IoT Edge Azure CLI set-modules コマンドを使用して、モジュールをAzure IoT Hubにデプロイします。 たとえば、deployment.debug.template.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 ポータルの IoT Hub >セキュリティ設定>共有アクセス ポリシー>iothubowner で確認できます。

モジュールをデバッグする

リモート デバイスでモジュールをデバッグするには、Visual Studio Codeでリモート SSH デバッグを使用します。

Remote Development 拡張機能をインストールして、Visual Studio Code のリモート デバッグを有効にします。 Visual Studio Codeのリモートデバッグの詳細については、「Visual Studio Code リモート開発」を参照してください。

Visual Studio Codeでのリモート SSH デバッグの使用の詳細については、「 SSH を使用したリモート開発を参照してください。

Visual Studio Codeデバッグ ビューで、モジュールのデバッグ構成ファイルを選択します。 既定では、.debug Dockerfile、モジュールのコンテナー 設定、および ファイルは、localhost を使用します。

[ デバッグの開始] または [F5] を選択し、アタッチするプロセスを選択します。 Visual Studio Codeデバッグ ビューには、左側のパネルに変数が表示されます。

Docker リモート SSH を使用したデバッグ

Docker エンジンと Moby エンジンはコンテナーへの SSH 接続をサポートしており、これによりリモート デバイスに接続している Visual Studio Code でデバッグが可能になります。 この機能を使用するには、次の前提条件を満たす必要があります。

リモート SSH デバッグの前提条件は、使用する言語によって異なる場合があります。 次のセクションでは、.NETのセットアップについて説明します。 その他の言語については、SSH を使用したリモート デバッグに関するページで概要をご確認ください。 リモート デバッグを構成する方法の詳細については、Visual Studio Codeドキュメントの各言語のデバッグ セクションに含まれています。

Docker SSH トンネリングを構成する

  1. Docker SSH トンネリングの手順に従って、開発用コンピューターで SSH トンネリングを設定します。 SSH トンネリングには、公開/秘密キーの組での認証と、リモート デバイス エンドポイントを定義する Docker コンテキストが必要です。

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

  3. Visual Studio Codeで、コマンド パレット (Ctrl + Shift + P) を使用して Docker Context: Use コマンドを発行し、リモート コンピューターを指す Docker コンテキストをアクティブにします。 このコマンドを使用すると、Visual Studio Codeと Docker CLI の両方でリモート コンピューター コンテキストを使用できます。

    ヒント

    すべての Docker コマンドは、現在のコンテキストを使用します。 デバッグが完了したら、必ずコンテキストを "既定値" に戻してください。

  4. リモート Docker コンテキストがアクティブであることを確認するには、次のようにリモート デバイスで実行中のコンテナーを一覧表示します。

    docker ps
    

    出力には、次のようなリモート デバイスで実行されているコンテナーが一覧表示されます。

    PS C:\> docker ps        
    CONTAINER ID   IMAGE                                                             COMMAND                   CREATED        STATUS         PORTS                                                                                                                                   NAMES
    a317b8058786   myacr.azurecr.io/filtermodule:0.0.1-amd64                         "dotnet filtermodule…"    24 hours ago   Up 6 minutes                                                                                                                                           filtermodule
    d4d949f8dfb9   mcr.microsoft.com/azureiotedge-hub:1.5                            "/bin/sh -c 'echo \"$…"   24 hours ago   Up 6 minutes   0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:5671->5671/tcp, :::5671->5671/tcp, 0.0.0.0:8883->8883/tcp, :::8883->8883/tcp, 1883/tcp   edgeHub
    1f0da9cfe8e8   mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0   "/bin/sh -c 'echo \"$…"   24 hours ago   Up 6 minutes                                                                                                    
                                           tempSensor
    66078969d843   mcr.microsoft.com/azureiotedge-agent:1.5                          "/bin/sh -c 'exec /a…"    24 hours ago   Up 6 minutes                                                                                                    
                                           edgeAgent
    
  5. .vscode ディレクトリで、Visual Studio Codeで launch.json を開き、新しい構成を追加します。 [ 構成の追加] を選択し、モジュールに対応するリモートアタッチ テンプレートを選択します。 たとえば、次の構成は .NET Core 用です。 PipeArgs の -H パラメーターの値を、デバイスの DNS 名または IP アドレスに変更します。

    "configurations": [
    {
      "name": "Remote Debug IoT Edge Module (.NET Core)",
      "type": "coreclr",
      "request": "attach",
      "processId": "${command:pickRemoteProcess}",
      "pipeTransport": {
        "pipeProgram": "docker",
        "pipeArgs": [
          "-H",
          "ssh://user@my-device-vm.eastus.cloudapp.azure.com:22",
          "exec",
          "-i",
          "filtermodule",
          "sh",
          "-c"
        ],
        "debuggerPath": "~/vsdbg/vsdbg",
        "pipeCwd": "${workspaceFolder}",
        "quoteArgs": true
      },
      "sourceFileMap": {
        "/app": "${workspaceFolder}/modules/filtermodule"
      },
      "justMyCode": true
    },
    

モジュールをリモートでデバッグする

  1. Visual Studio Code デバッグ ビューで、デバッグ構成 Remote Debug IoT Edge Module (.NET Core) を選択します。

  2. [デバッグの開始] を選択するか、F5 を押します。 アタッチするプロセスを選択します。

  3. Visual Studio Codeデバッグ ビューには、左側のパネルに変数が表示されます。

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

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

    ブレークポイントで一時停止したリモート デバイス上の Docker コンテナーに接続されているVisual Studio Codeのスクリーンショット。

前の例は、リモート コンテナーでモジュールIoT Edgeデバッグする方法を示しています。 この例では、リモート Docker コンテキストを追加し、リモート デバイスでの Docker 特権に対する変更を加えています。 モジュールのデバッグが完了したら、Docker コンテキストを "既定値" に設定し、ユーザー アカウントから特権を削除してください。

Raspberry Pi デバイスの使用例については、この IoT Developer ブログ エントリを参照してください。

次のステップ

モジュールをビルドしたら、Azure IoT Edge モジュールをデプロイする方法について説明します。

IoT Edge デバイス用のモジュールを開発するには、Azure IoT Hub SDK について学習し、使用します。