次の方法で共有


チュートリアル: IoT Edge for Linux on Windows を使用して Linux コンテナーを使用する IoT Edge モジュールを開発する

適用対象: IoT Edge 1.4 チェックマーク IoT Edge 1.4

重要

サポートされているリリースは、Azure IoT Edge 1.5 LTS と IoT Edge 1.4 です。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日にサービス終了になります。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

このチュートリアルでは、IoT Edge for Linux on Windows と Visual Studio 2022 を使用して、独自のコードを開発、デバッグし、Azure IoT Edge デバイスにデプロイする方法について説明します。 である Linux デバイスに C# モジュールをデプロイすることで、IoT Edge ソリューションの最も一般的な開発者シナリオを学習します。 Windows 上の Linux コンテナーで実行するカスタム IoT Edge モジュールのデプロイとデバッグを行います。 別の言語の使用や Azure サービスのデプロイを予定している場合でも、このチュートリアルは開発ツールと概念の学習に役立ちます。

このチュートリアルには、次の 2 つの IoT Edge 開発ツールの手順が含まれています。

  • Azure IoT Edge Dev Tool CLI コマンド ライン インターフェイス (CLI) (開発に推奨されるツールです)
  • Visual Studio 用 Azure IoT Edge Tools 拡張機能 (現在はメンテナンス モードです)

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

このチュートリアルでは、以下の内容を学習します。

  • 開発マシンを設定する。
  • IoT Edge 開発ツールを使用して、新しいプロジェクトを作成します。
  • プロジェクトをコンテナーとしてビルドして、Azure Container Registry に格納する。
  • コードを IoT Edge デバイスにデプロイする。

前提条件

このチュートリアルでは、Windows を実行しているマシンを開発用マシンとして使用していることを前提としています。 Windows コンピューターでは、Windows または Linux のいずれかのモジュールを開発できます。 このチュートリアルでは、モジュールの構築とデプロイのために、IoT Edge for Linux on Windows を使用して Linux コンテナーを開発する方法について説明します。

作業を開始する前に、次のことを行います。

  • IoT Edge for Linux on Windows をインストールします。

  • クイックスタート「初めての IoT Edge モジュールを Windows デバイスにデプロイする」を参照してください。

  • .NET Core SDK をダウンロードします。

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

  • Visual Studio 2022 のインストールの準備ができたら、Visual Studio Marketplace から Azure IoT Edge Tools をダウンロードしてインストールします。

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

    ヒント

    Visual Studio 2019 を使用している場合は、Visual Studio Marketplace から Visual Studio 2019 用の Azure IoT Edge Tools をダウンロードしてインストールしてください。

  • Azure CLI をインストールします。
  • Azure にクラウド リソースとして Free または Standard レベルの IoT ハブを作成します。

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

主要な概念

このチュートリアルでは、"IoT Edge モジュール" の開発について順を追って説明します。 IoT Edge モジュールは、実行可能コードを含むコンテナーです。 IoT Edge デバイスには 1 つ以上のモジュールをデプロイできます。 モジュールは、センサーからのデータの取り込み、データのクリーニングと分析、IoT ハブへのメッセージの送信などの特定のタスクを実行します。 詳細については、「Azure IoT Edge モジュールについて」を参照してください。

IoT Edge モジュールを開発する場合は、開発マシンと、モジュールが最終的にデプロイされるターゲット IoT Edge デバイスの違いを理解することが重要です。 モジュール コードを保持するためにビルドするコンテナーは、ターゲット デバイスのオペレーティング システム (OS) と一致している必要があります。

たとえば、Windows コンピューター上でモジュールを開発し、IoT Edge を実行する Linux デバイスをターゲットとするというシナリオが最も一般的です。 その場合、コンテナーの OS は Linux です。

このチュートリアルを進めていくときには、開発マシンの OS とコンテナーの OS の違いに留意してください。 このチュートリアルでは、開発には Windows ホストを、モジュールの構築とデプロイには IoT Edge for Linux on Windows 仮想マシン (VM) を使用します。

このチュートリアルでは、Linux コンテナーを使用して IoT Edge を実行しているデバイスをターゲットとしています。 ご使用の開発マシンで Linux コンテナーが実行される限り、自分の好きなオペレーティング システムを使用することができます。 Linux コンテナーを使用した開発には Visual Studio を使用することをお勧めします。そのため、このチュートリアルでもそれを使用します。 Visual Studio Code も使用できますが、この 2 つのツールにはサポートに違いがあります。 詳細については、「Visual Studio Code を使用して Azure IoT Edge モジュールを開発する」を参照してください。

リモート接続用に Docker CLI と Docker エンジンを設定する

IoT Edge モジュールはコンテナーとしてパッケージ化されるので、それらをビルドおよび管理するためには、開発マシン上にコンテナー エンジンが必要です。

IoT Edge for Linux on Windows VM には、Docker エンジンのインスタンスが既に含まれています。 このチュートリアルでは、Windows 開発者マシンから IoT Edge for Linux on Windows VM Docker インスタンスにリモート接続する方法について説明します。 このリモート接続を使用すると、Docker Desktop for Windows への依存関係はなくなります。

Docker CLI を構成する

最初の手順では、リモート Docker エンジンに接続できるように、Windows 開発用マシン上で Docker CLI を構成します。

  1. Docker CLI のプリコンパイル済み docker.exe バージョンを Chocolatey からダウンロードします。 また、GitHub から公式の cli プロジェクトをダウンロードし、リポジトリの手順に従ってコンパイルすることもできます。

  2. docker.exe を開発マシンのディレクトリ (たとえば、C:\Docker\bin) に展開します。

  3. [PC 情報]>[システム情報]>[システムの詳細設定] を開きます。

  4. [詳細設定]>[環境変数] を選択します。 [ユーザー変数]Path を選択します。

  5. Path 変数を編集し、docker.exe の場所を追加します。

  6. 管理者特権の PowerShell セッションを開きます。

  7. 次のコマンドを使用して、Docker CLI にアクセスできることを確認します。

    docker --version
    

    すべての構成が正常に完了すると、コマンドの出力に Docker のバージョンが表示されます。 それは Docker version 20.10.12, build e91ed57 のようになります。

Docker エンジンを構成する

2 番目の手順では、外部接続を受け入れるように IoT Edge for Linux on Windows VM Docker エンジンを構成し、適切なファイアウォール規則を追加します。

警告

Docker エンジンを外部接続に公開すると、セキュリティ上のリスクが高まるおそれがあります。 この構成は開発目的でのみ使用してください。 開発が完了したら、必ず構成を既定の設定に戻します。

  1. 管理者特権の PowerShell セッションを開き、次のコマンドを実行します。

    # Configure the IoT Edge for Linux on Windows VM Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the IoT Edge for Linux on Windows VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the IoT Edge for Linux on Windows VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    出力例を次に示します:

    PS C:\> # Configure the IoT Edge for Linux on Windows virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the IoT Edge for Linux on Windows VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the IoT Edge for Linux on Windows VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    

接続をテストする

最後のセットアップ手順は、IoT Edge for Linux on Windows VM Docker エンジンへの Docker 接続をテストすることです。

  1. IoT Edge for Linux on Windows VM の IP アドレスを取得します。

    Get-EflowVmAddr
    

    ヒント

    静的 IP を使用せずに IoT Edge for Linux on Windows VM がデプロイされた場合、Windows ホスト OS の再起動またはネットワークの変更によって IP アドレスが変わる可能性があります。 Docker エンジンへのリモート接続を確立するたびに、IoT Edge for Linux on Windows VM に正しい IP アドレスを使用していることを確認します。

    出力例を次に示します:

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  2. IoT Edge for Linux on Windows VM Docker エンジンに接続し、hello-world サンプル コンテナーを実行します。 <EFLOW-VM-IP> を、前の手順で取得した IoT Edge for Linux on Windows VM の IP アドレスに置き換えます。

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

    コンテナーのダウンロードが完了すると、コンテナーが実行され、次の出力が生成されます。

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you're currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

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

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

重要

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

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

  1. Visual Studio で、スタート ページで [新しいプロジェクトの作成] を選択するか、ツール バーの [新しいプロジェクト] ボタンを選択して、新しいプロジェクトを作成します。

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

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

  4. [モジュールの追加] ダイアログで、開発するモジュールの種類を選択します。 [既存のモジュール] を選択して、既存の IoT Edge モジュールをデプロイに追加することもできます。

  5. [モジュール名] でモジュール名を指定します。

  6. [リポジトリ URL] で、モジュールのイメージ リポジトリの名前を指定します。 Visual Studio により、モジュール名には自動的に localhost:5000/<対象のモジュール名> が設定されます。 独自のレジストリ情報に置き換えます。

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

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

    Visual Studio ソリューションにアプリケーションとモジュールを追加するための選択項目のスクリーンショット。

    Note

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

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

プロジェクト構造

ソリューションには、メイン プロジェクト フォルダーとモジュール フォルダーという 2 つのプロジェクトレベルのフォルダーがあります。 たとえば、AzureIotEdgeApp1 というメイン プロジェクト フォルダーと、IotEdgeModule1 というモジュール フォルダーがあるとします。

メイン プロジェクト フォルダーには、配置マニフェストが含まれています。 配置マニフェストは、ターゲットの IoT Edge デバイス上で構成されるモジュールを記述した JSON ドキュメントです。

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

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

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

展開テンプレートには以下が含まれます。

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

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

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

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

    IoT Edge ランタイム バージョンを設定するための選択項目のスクリーンショット。

  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 配置マニフェスト ファイルを開きます。

  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",
        //...
    

Visual Studio 2022 リモート Docker エンジン インスタンスを設定する

IoT Edge for Linux on Windows VM 内で実行されるリモート Docker エンジンを使用するように Azure IoT Edge Tools 拡張機能を構成します。

  1. [ツール]>[Azure IoT Edge Tools]>[IoT Edge ツールの設定] を選択します。

  2. DOCKER_HOST の localhost 値を、IoT Edge for Linux on Windows VM の IP アドレスに置き換えます。 IP アドレスを覚えていない場合は、IoT Edge for Linux on Windows PowerShell コマンドレット Get-EflowVmAddr を使用して取得します。 たとえば、IoT Edge for Linux on Windows VM の IP アドレスが 172.20.1.100 の場合、新しい値は tcp://172.20.1.100:2375 になるはずです。

    IoT Edge ツールの設定のスクリーンショット

  3. [OK] を選択します。

モジュールの開発

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

既定のソリューションでは、SimulatedTemperatureSensor モジュールのシミュレートされたデータがモジュールにルーティングされます。 モジュールは入力を受け取り、それを Azure IoT Hub に送信します。

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

1 つのモジュールをビルドしてプッシュする

通常は、複数のモジュールを含むソリューション全体内で実行する前に、各モジュールをテストしてデバッグする必要があります。 ソリューションは、IoT Edge for Linux on Windows VM 内で実行されている Docker エンジンを使用してビルドまたはデバッグされるため、最初の手順では、リモート デバッグを有効にするようにモジュールをビルドして公開します。

  1. ソリューション エクスプローラーで、モジュール プロジェクト フォルダー (たとえば、myIotEdgeModule) を選択します。

  2. カスタム モジュールをスタートアップ プロジェクトとして設定します。 メニューの [プロジェクト]>[スタートアップ プロジェクトに設定] を選択します。

  3. C# Linux モジュールをデバッグするには、Dockerfile.amd64.debug ファイルを更新して SSH サービスを有効にする必要があります。 Dockerfile.amd64.debug ファイルは、リモート デバッグをサポートする Azure IoT Edge AMD64 C# モジュール用の Dockerfile のテンプレートを使用するように更新します。

    Note

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

    テンプレートの最後の行 ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"] にある DLL の名前が IoT Edge モジュール プロジェクトの名前と一致していることを確認します。

  4. Linux モジュールとの SSH 接続を確立するには、RSA キーを作成する必要があります。 新しい RSA キーを作成するには、管理者特権の PowerShell セッションを開き、次のコマンドを実行します。 RSA キーを同じ IoT Edge モジュール フォルダーに保存します。また、キーの名前は必ず id_rsa にします。

    ssh-keygen -t RSA -b 4096 -m PEM
    

    SSH キーを作成する PowerShell コマンドのスクリーンショット。

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

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <Container Registry username> -p <Container Registry password> <Container Registry login server>
    
  1. ソリューション エクスプローラーで、プロジェクト フォルダーを右クリックし、[IoT Edge モジュールのビルドしてプッシュする] を選択します。 このコマンドを使用して、各モジュールの Docker イメージをビルドしてプッシュします。

  2. Azure Container Registry のようなプライベート レジストリを使用している場合は、deployment.template.json ファイルにあるランタイム設定にレジストリのログイン情報を追加する必要があります。 プレースホルダーを実際の Container Registry 管理者ユーザー名、パスワード、レジストリ名に置き換えてください。

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

    Note

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

  3. モジュールの SSH サービスにアクセスするには、ポート 22 を公開する必要があります。 このチュートリアルではホスト ポートとして 10022 を使用しますが、別のポートを指定することもできます。 指定したポートは、Linux C# モジュールに接続するための SSH ポートとして使用されます。 ファイル deployment.debug.template.json 内のこの Linux モジュール設定の SSH ポート情報を createOptions に追加する必要があります。

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. ソリューション エクスプローラーで、プロジェクト フォルダーを右クリックし、[IoT Edge のデプロイの生成] を選択して、新しい IoT Edge デプロイの JSON をビルドします。

  5. [表示]>[Cloud Explorer] を選択します。 Visual Studio 2019 にサインインしていることを確認します。

  6. Cloud Explorer でサブスクリプションを展開して、Azure IoT Hub とデプロイする Azure IoT Edge デバイスを探します。

  7. IoT Edge デバイスを右クリックし、[デプロイの作成] を選択します。 実際のプラットフォーム用に構成したデバッグ配置マニフェストに移動します。 これは、Visual Studio ソリューションの config フォルダー (deployment.amd64.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 配置マニフェスト ファイルを開きます。

デプロイの前に、Azure Container Registry 資格情報とモジュール イメージおよび適切な createOptions の値で更新する必要があります。 createOption の値の詳細については、「IoT Edge モジュールのコンテナー作成オプションを構成する方法」を参照してください。

  1. Azure コンテナー レジストリを使用してモジュール イメージを保存している場合は、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. image プロパティの値を、レジストリにプッシュしたモジュール イメージ名に置き換えます。 たとえば、カスタム モジュール IotEdgeModule1 用にタグ付けされたイメージ myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 をプッシュした場合は、image プロパティの値をタグ値に置き換えます。

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

    たとえば、IotEdgeModule1imagecreateOptions の設定は次の例のようになります。

    "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\"}]}}}"
    }
    
  4. IoT Edge Azure CLI set-modules コマンドを使用して、モジュールを Azure IoT ハブにデプロイします。 たとえば、deployment.debug.amd64.json ファイルで定義されたモジュールを IoT Edge デバイス my-device の IoT ハブ 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>[セキュリティの設定]>[共有アクセス ポリシー] にあります。

  5. Cloud Explorer でエッジ デバイスを右クリックして更新し、新しいモジュールが $edgeAgent および $edgeHub モジュールと共に実行されていることを確認します。

ソリューションのデバッグ

  1. 管理者特権の PowerShell セッションで、次のコマンドを実行します。

    1. Linux C# モジュールの名前に基づいて、moduleId の値を取得します。 プレースホルダー <iot-edge-module-name> は、モジュールの名前に置き換えます。

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. $moduleId が正しいことを確認します。 変数が空の場合は、正しいモジュール名を使用していることを確認します。

    3. Linux コンテナー内で SSH サービスを開始します。

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. IoT Edge for Linux on Windows VM 上でモジュールの SSH ポートを開きます。 (このチュートリアルではポート 10022 を使用します)。

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    警告

    セキュリティ上の理由から、IoT Edge for Linux on Windows VM が再起動されるたびに、IP テーブル ルールは削除され、元の設定に戻ります。 また、モジュールの SSH サービスを手動で再度開始する必要があります。

  2. SSH サービスが正常に開始されたら、[デバッグ]>[プロセスにアタッチ] を選択し、[接続の種類][SSH] に設定し、[接続先] を IoT Edge for Linux on Windows VM の IP アドレスに設定します。 IoT Edge for Linux on Windows VM の IP アドレスがわからない場合は、Get-EflowVmAddr PowerShell コマンドレットを使用できます。

    IP を入力し、Enter キーを押します。 ポップアップ ウィンドウに次の構成を入力します。

    フィールド
    hostname IoT Edge for Linux on Windows VM の IP アドレス
    ポート 10022 (またはデプロイ構成で使用したもの)
    ユーザー名 root
    認証の種類 秘密キー
    秘密キー ファイル 前の手順で作成した id_rsa 値の完全なパス
    パスフレーズ 前の手順で作成したキーに使用したパスフレーズ
  3. SSH を使用してモジュールに正常に接続したら、プロセスを選択して [アタッチ] を選択できます。 C# モジュールの場合は、プロセス dotnet を選択し、[アタッチ先][マネージド (CoreCLR)] にする必要があります。 最初は 10 秒から 20 秒かかる場合があります。

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

    • C# で開発している場合は ModuleBackgroundService.cs 内の PipeMessage() 関数にブレークポイントを設定します。
    • C を使用している場合は main.c 内の InputQueue1Callback() 関数にブレークポイントを設定します。
  5. SimulatedTemperatureSensor の出力は、カスタム Linux C# モジュールの input1 にリダイレクトされるはずです。 ブレークポイントがトリガーされるはずです。 Visual Studio の [ローカル] ウィンドウで変数を確認できます。

    単一のモジュールをデバッグする方法のスクリーンショット。

  6. デバッグを停止するには、Ctrl + F5 キーを押すか、[停止] ボタンを選択します。

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

次の推奨記事に進む場合は、作成したリソースおよび構成を維持して、再利用することができます。 また、同じ IoT Edge デバイスをテスト デバイスとして使用し続けることもできます。

そうでない場合は、課金されないようにするために、ローカル構成と、この記事で使用した Azure リソースを削除します。

Azure リソースを削除する

Azure のリソースとリソース グループは、削除すると元に戻すことができません。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 保持したいリソースが含まれている既存のリソース グループ内に IoT ハブを作成した場合は、リソース グループを削除するのではなく、IoT ハブ リソースだけを削除してください。

リソースを削除するには、次の手順に従います。

  1. Azure portal にサインインし、 [リソース グループ] を選択します。

  2. IoT Edge のテスト リソースを含んだリソース グループの名前を選択します。

  3. リソース グループに含まれるリソースの一覧を確認します。 それらすべてを削除する場合は、[リソース グループの削除] を選択します。 一部だけを削除する場合は、削除する各リソースを選択して個別に削除してください。

次のステップ

このチュートリアルでは、開発マシンに Visual Studio を設定し、そこから最初の IoT Edge モジュールをデプロイしてデバッグしました。 これで基本的な概念が理解できたので、モジュールを通過するデータを分析できるように、モジュールに機能を追加してみます。