Share via


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

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

重要

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

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

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

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

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

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

前提条件

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

Visual Studio 2022 の準備ができたら、次のツールとコンポーネントも必要になります。

  • 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 Marketplace から Azure IoT Edge Tools for VS 2019 をダウンロードしてインストールします。

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

クラウド リソース:

  • Azure の Free レベルまたは Standard レベルの IoT Hub

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

主要な概念

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

IoT Edge モジュールを開発する場合は、開発マシンと、モジュールが最終的にデプロイされるターゲット IoT Edge デバイスの違いを理解することが重要です。 モジュール コードを保持するためにビルドするコンテナーは、ターゲット デバイスのオペレーティング システム (OS) と一致している必要があります。 たとえば、最も一般的なシナリオは、ある人が Windows コンピューターでモジュールを開発しているが、そのターゲットとして、IoT Edge を実行している Linux デバイスを予定している場合です。 その場合、コンテナーのオペレーティング システムは Linux になります。 このチュートリアルを進めていくときには、開発マシンの OSコンテナーの OS の違いに留意してください。 このチュートリアルでは、開発に Windows ホストを、モジュールの構築とデプロイに IoT Edge for Linux on Windows (EFLOW) VM を使用します。

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

docker-cli と Docker エンジンのリモート接続を設定する

IoT Edge モジュールはコンテナーとしてパッケージ化されるので、それらをビルドおよび管理するためには、開発マシン上にコンテナー エンジンが必要です。 EFLOW 仮想マシンには既に Docker エンジンのインスタンスが含まれているため、このチュートリアルでは、Windows 開発者マシンから EFLOW VM Docker インスタンスにリモート接続する方法について説明します。 これを使用することで、Docker Desktop for Windows への依存関係をなくします。

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

  1. docker-cli Chocolatey から docker-cli のプリコンパイル済みバージョンの docker.exe をダウンロードします。 また、docker/cli GitHub から公式の cli プロジェクトをダウンロードし、リポジトリの手順に従ってコンパイルすることもできます。
  2. docker.exe を開発用マシン内のディレクトリに展開します。 たとえば、C:\Docker\bin です
  3. [About your PC] (PC 情報) ->[システム情報] ->[システムの詳細設定] の順に開きます
  4. [詳細設定] ->[環境変数] の順に選択してから、[ユーザー変数] の下で [Path] を確認します
  5. Path 変数を編集し、docker.exe の場所を追加します
  6. 管理者特権の PowerShell セッションを開きます
  7. このコマンドを使用して Docker CLI にアクセスできることを確認します
    docker --version
    

すべてが正常に構成された場合、前のコマンドによって Docker バージョンが Docker version 20.10.12, build e91ed57 のように出力されます。

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

警告

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

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

    # Configure the EFLOW virtual machine 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 EFLOW 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 EFLOW 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 EFLOW 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 EFLOW 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 EFLOW 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
    
  2. 最後の手順では、EFLOW VM の Docker エンジンへの Docker 接続をテストします。 まず、EFLOW VM の IP アドレスが必要です。

    Get-EflowVmAddr
    

    ヒント

    EFLOW VM が静的 IP を使用せずにデプロイされた場合、Windows ホスト OS の再起動またはネットワークの変更によって IP アドレスが変更される可能性があります。 リモート Docker エンジン接続を確立するときは、必ず毎回正しい EFLOW 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 
    
  3. 取得した IP アドレスを使用して、EFLOW VM の Docker エンジンに接続し、Hello-World サンプル コンテナーを実行します。 <EFLOW-VM-IP> は、前の手順で取得した EFLOW 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 are 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 プロジェクトを作成するには、Visual Studio IoT Edge 拡張機能を使用する必要があります。

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

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

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

  4. [モジュールの追加] ウィンドウで、開発するモジュールの種類を選択します。 [既存のモジュール] を選択して、既存の IoT Edge モジュールをデプロイに追加することもできます。 モジュール名とモジュール イメージ リポジトリを指定します。

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

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

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

    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 ランタイム バージョンの設定] を選択します。

    [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 を開きます。 配置マニフェストは、ターゲットの 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",
        //...
    

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

Azure IoT Edge ツールの拡張機能を使用して、EFLOW 仮想マシン内で実行されているリモート Docker エンジンを使用するように構成します。

  1. [ツール] ->[Azure IoT Edge tools] (Azure IoT Edge ツール) ->[IoT Edge tools settings...] (IoT Edge ツールの設定) の順に選択します。

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

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

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

モジュールの開発

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

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

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

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

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

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

  2. C# Linux モジュールをデバッグするには、SSH サービスを有効にするように Dockerfile.amd64.debug ファイルを更新する必要があります。 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 モジュール プロジェクトの名前と一致していることを確認してください。

    Dockerfile テンプレートの設定のスクリーンショット

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

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

    SSH キーの作成方法のスクリーンショット

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

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

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

          "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 ポートとして使用されます。 SSH ポート情報は、ファイル deployment.debug.template.json にあるこの Linux モジュールの設定の "createOptions" に追加する必要があります。

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

  5. [表示]>[Cloud Explorer] をクリックして、Cloud Explorer を開きます。 Visual Studio 2019 にログインしていることを確認します。

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

  7. IoT Edge デバイスを右クリックし、[デプロイの作成] を選択します。 deployment.amd64.json など、Visual Studio ソリューションの config フォルダーにある、プラットフォーム用に構成されているデバッグ デプロイ マニフェストに移動します。

モジュールの 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](共有アクセス ポリシー) にあります。

  1. 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. EFLOW VM でモジュールの SSH ポートを開きます (このチュートリアルではポート 10022 を使用します)

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

    警告

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

  2. SSH サービスが正常に開始されたら、[デバッグ] ->[プロセスにアタッチ] の順に選択し、[接続の種類] を [SSH] に、[Connection target] (接続先) を EFLOW VM の IP アドレスに設定します。 EFLOW VM の IP がわからない場合は、Get-EflowVmAddr PowerShell コマンドレットを使用できます。 まず、IP アドレスを入力してから Enter キーを押します。 ポップアップ ウィンドウに次の構成を入力します。

    フィールド
    hostname EFLOW VM の IP を使用します
    ポート 10022 (またはデプロイ構成で使用したもの)
    ユーザー名 root
    認証の種類 秘密キー
    秘密キー ファイル 前の手順で作成した id_rsa への完全なパス
    パスフレーズ 前の手順で作成したキーに使用したパスフレーズ

    リモート システムへの接続方法のスクリーンショット

  3. SSH を使用してモジュールに正常に接続したら、プロセスを選択して [アタッチ] を選択できます。 C# モジュールの場合は、dotnet というプロセスを選択し、[アタッチ先] を [マネージド (CoreCLR)] にする必要があります。 最初は 10 秒から 20 秒かかる場合があります。

    エッジ モジュール プロセスのアタッチ方法のスクリーンショット。

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

    • C# で開発する場合は ModuleBackgroundService.cs 内の PipeMessage() 関数にブレークポイントを設定します。
    • C を使用する場合は InputQueue1Callback() 内の 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 モジュールをデプロイしてデバッグしました。 これで基本的な概念が理解できたので、モジュールを通過するデータを分析できるように、モジュールに機能を追加してみます。