次の方法で共有


チュートリアル: Windows 上の Linux 用IoT Edgeを使用して、Linux コンテナーを使用して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を参照してください。

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

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

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

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

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

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

前提条件

このチュートリアルでは、Windows実行されているマシンを開発用コンピューターとして使用することを前提としています。 Windows コンピューターでは、Windowsまたは Linux モジュールを開発できます。 このチュートリアルでは、WindowsIoT Edge を使用して、モジュールのビルドとデプロイ> Linux コンテナーの開発について説明します。

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

  • IoT Edge for Linux を 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開発ツール CLI です。 拡張機能には、Visual Studio プロジェクトの作成に使用するAzure IoT Edge プロジェクト テンプレートが含まれています。 現時点では、使用する開発ツールに関係なく、拡張機能をインストールする必要があります。

    ヒント

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

  • クラウド リソースとしてAzureに free または standard レベルの IoT ハブを作成します。

Azure アカウントがない場合は、開始する前に free アカウントを作成します。

主要な概念

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

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

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

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

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

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

IoT Edgeモジュールはコンテナーとしてパッケージ化されるため、開発用コンピューター上にコンテナー エンジンを構築して管理する必要があります。

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

Docker CLI を構成する

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

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

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

  3. PC について>システム情報>システム設定について」を開きます。

  4. [詳細設定>Environment 変数] を選択します。 ユーザー変数パスを選択します。

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

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

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

    docker --version
    

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

Docker エンジンを構成する

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

警告

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
    

接続をテストする

最後のセットアップ手順では、Windows VM Docker エンジンで Linux 用IoT Edgeへの Docker 接続をテストします。

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

    Get-EflowVmAddr
    

    ヒント

    Windows VM 上の Linux のIoT Edgeが静的 IP なしでデプロイされた場合、ホスト OS の再起動またはネットワークの変更Windows間で IP アドレスが変更される可能性があります。 Docker エンジンへのリモート接続を確立するたびに、Windows VM 上の Linux 用IoT Edgeに正しい 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. Windows VM Docker エンジン上の Linux 用IoT Edgeに接続し、hello-world サンプル コンテナーを実行します。 <EFLOW-VM-IP> を、前の手順で取得した VM IP アドレス上Windows Linux 用のIoT Edgeに置き換えます。

    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開発ツール CLI では、Visual Studio プロジェクトの種類の作成はサポートされていません。 Azure IoT Edge ツール拡張機能を使用して、Visual Studio プロジェクトを作成する必要があります。

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

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

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

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

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

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

    テストにローカル Docker レジストリを使用する場合は、 localhost を使用します。 Azure Container Registryを使用する場合は、レジストリの設定からログイン サーバーを使用します。 ログイン サーバーは <registry name>.azurecr.io のようになります。 文字列の localhost:5000 部分のみを置き換え、最終的な結果が <のように見えるようにします>。

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

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

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

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

プロジェクト構造

ソリューションには、メイン プロジェクト フォルダーとモジュール フォルダーという 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.5 です。 IoT Edgeランタイム のバージョンを、最新の安定したリリースまたはデバイスのターゲットにするバージョンに更新します。

  1. Solution Explorerで、メイン プロジェクトの名前を右クリックし、 ランタイム バージョン IoT Edgeを選択します。

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

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

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

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

  1. deployment.debug.template.json 配置マニフェスト ファイルを開きます。

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

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

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

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

  1. Tools>Azure IoT Edge tools>IoT Edge tools settings を選択します。

  2. DOCKER_HOST localhost の値を、Windows VM 上の Linux のIoT Edgeの IP アドレスに置き換えます。 IP アドレスを覚えていない場合は、Windows PowerShell コマンドレット Get-EflowVmAddr で Linux 用のIoT Edgeを使用して取得します。 たとえば、Windows VM 上の Linux のIoT Edgeの 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 つのモジュールをビルドしてプッシュする

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

  1. Solution Explorer で、モジュール プロジェクト フォルダー (たとえば、myIotEdgeModule) を選択します。

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

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

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

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

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

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

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

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

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <Container Registry username> -p <Container Registry password> <Container Registry login server>
    
  1. Solution Explorer で、プロジェクト フォルダーを右クリックし、 Build および Push IoT Edge Modules を選択します。 このコマンドを使用して、各モジュールの 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"
              }
            }
          }
    

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

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

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. Solution Explorer で、プロジェクト フォルダーを右クリックし、Generate Deployment for IoT Edge を選択して、新しいIoT Edgeデプロイ JSON をビルドします。

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

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

  7. IoT Edge デバイスを右クリックし、 展開を選択します。 実際のプラットフォーム用に構成したデバッグ配置マニフェストに移動します。 config など、Visual Studio ソリューションの deployment.amd64.json フォルダーにあります。

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

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

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

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

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

# 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 Container Registryを使用してモジュール イメージを格納する場合は、deployment.debug.template.json 設定で資格情報を edgeAgent に追加します。 次に例を示します。

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

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

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

    "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-iot-hub の IoT ハブ my-deviceにデプロイするには、次のコマンドを使用します。

    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 connection stringは、Azure ポータルの 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. Windows VM 上で実行されている Linux 用 IoT Edge のモジュールの SSH ポートを開きます。 (このチュートリアルではポート 10022 を使用します)。

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

    警告

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

  2. SSH サービスを正常に開始したら、Debug>プロセスへのアタッチ を選択します。 Connection TypeSSH に設定し、Connection ターゲット を Windows VM 上の Linux のIoT Edgeの IP アドレスに設定します。 Windows VM 上の Linux 用IoT Edgeの IP アドレスがわからない場合は、Get-EflowVmAddr PowerShell コマンドレットを使用できます。

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

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

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

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

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

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

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

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

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

Azure リソースを削除する

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

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

  1. Azure ポータルにサインインし、Resource グループ を選択します。
  2. IoT Edgeテスト リソースを含むリソース グループの名前を選択します。
  3. リソース グループに含まれるリソースの一覧を確認します。 それらすべてを削除する場合は、[ リソース グループの削除] を選択できます。 一部のみを削除する場合は、各リソースを選択して個別に削除します。

次のステップ

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

チュートリアル: Visual Studio Code を使用して Azure IoT Edge モジュールを開発します