適用対象: IoT Edge 1.5
重要
IoT Edge 1.5 LTS は 、サポートされているリリースです。 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 のいずれかのモジュールを開発できます。 このチュートリアルでは、モジュールのビルドとデプロイに Windows 上の Linux 用 IoT Edge を使用して、Linux コンテナーの開発について説明します。
作業を開始する前に、次のことを行います。
Windows に IoT Edge for Linux をインストールします。
クイック スタートの「 初めての IoT Edge モジュールを Windows デバイスにデプロイする」を参照してください。
.NET Core SDK をダウンロードします。
開発用マシンで Visual Studio 2022 をインストールするか、変更します。 C++ ワークロード オプションを使用して Azure 開発とデスクトップ開発を選択します。
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 から Azure IoT Edge Tools for Visual Studio 2019 をダウンロードしてインストールします。
- Azure CLI をインストールします。
- クラウド リソースとして Azure に無料または Standard レベルの IoT ハブ を作成します。
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 を構成します。
docker.exe
から、プリコンパイル済みの バージョンの Docker CLI をダウンロードします。 GitHub から公式 cli プロジェクトをダウンロードし、リポジトリの手順に従ってコンパイルすることもできます。docker.exe
を開発マシンのディレクトリ (たとえば、C:\Docker\bin
) に展開します。「PC について>システム情報>システム設定について」を開きます。
[詳細設定>Environment 変数] を選択します。 ユーザー変数でパスを選択します。
Path 変数を編集し、
docker.exe
の場所を追加します。管理者特権の PowerShell セッションを開きます。
次のコマンドを使用して、Docker CLI にアクセスできることを確認します。
docker --version
すべての構成が正常に完了すると、コマンドの出力に Docker のバージョンが表示されます。 それは
Docker version 20.10.12, build e91ed57
のようになります。
Docker エンジンを構成する
2 番目の手順では、外部接続を受け入れるように IoT Edge for Linux on Windows VM Docker エンジンを構成し、適切なファイアウォール規則を追加します。
警告
Docker エンジンを外部接続に公開すると、セキュリティ上のリスクが高まるおそれがあります。 この構成は開発目的でのみ使用してください。 開発が完了したら、必ず構成を既定の設定に戻します。
管理者特権の 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 接続をテストすることです。
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
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 拡張機能を使用する必要があります。
Visual Studio で、スタート ページで [ 新しいプロジェクトの作成 ] を選択するか、ツール バーの [新しいプロジェクト] ボタンを選択して 、新しいプロジェクト を作成します。
[ 新しいプロジェクトの作成 ] ページで、 Azure IoT Edge を検索します。 IoT Edge デバイスのプラットフォーム (Linux IoT Edge モジュール) とアーキテクチャに一致するプロジェクトを選択し、[ 次へ] を選択します。
[ 新しいプロジェクトの構成 ] ページで、プロジェクトの名前を入力し、場所を指定して、[ 作成] を選択します。
[ モジュールの追加 ] ダイアログで、開発するモジュールの種類を選択します。 既存のモジュールを選択して、既存の IoT Edge モジュールをデプロイに追加することもできます。
[ モジュール名] で、モジュール名を指定します。
[ リポジトリ URL] で、モジュールのイメージ リポジトリの名前を指定します。 Visual Studio によって、モジュール名に localhost:5000/< モジュール名>が自動的に設定されます。 独自のレジストリ情報に置き換えます。
テストにローカル Docker レジストリを使用する場合は、 localhost を使用します。 Azure Container Registry を使用する場合、お使いのレジストリの設定のログイン サーバーを使用します。 ログイン サーバーは <registry name>.azurecr.io のようになります。 文字列の localhost:5000 部分のみを置き換え、最終的な結果が <のように見えるようにします>。
[ 追加] を選択して、モジュールをプロジェクトに追加します。
注
既存の 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 配置マニフェストのテンプレートです。 このファイルを使用して、モジュール間の通信方法も定義します。 配置マニフェストの詳細については、「 モジュールをデプロイしてルートを確立する方法」を参照してください。
展開テンプレートには以下が含まれます。
-
edgeAgent
、edgeHub
という 2 つのランタイム モジュール。 - この Visual Studio プロジェクトで作成したカスタム モジュール。
-
SimulatedTemperatureSensor
という名前のモジュール。 この既定のモジュールでは、モジュールのテストに使用できるシミュレートされたデータが生成されます (必要ない場合は削除します)。 シミュレートされた温度センサーのしくみを確認するには、 SimulatedTemperatureSensor.csproj ソース コードを表示します。
IoT Edge ランタイムのバージョンを設定する
現在、最新の安定ランタイム バージョンは 1.5 です。 IoT Edge ランタイムバージョンを最新の安定リリースまたはデバイスのターゲットにするバージョンに更新します。
ソリューション エクスプローラーで、メイン プロジェクトの名前を右クリックし、[IoT Edge ランタイム バージョンの設定] を選択します。
ドロップダウン メニューを使用して、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", //...
バージョンを変更した場合は、プロジェクトの名前を右クリックし、[ IoT Edge の配置の生成] を選択して、配置マニフェストを再生成します。 この手順では、展開テンプレートに基づいて配置マニフェストを生成します。 マニフェストは Visual Studio プロジェクトの
config
フォルダーに表示されます。
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", //...
Visual Studio 2022 リモート Docker エンジン インスタンスを設定する
IoT Edge for Linux on Windows VM 内で実行されるリモート Docker エンジンを使用するように Azure IoT Edge Tools 拡張機能を構成します。
[ツール>Azure IoT Edge ツール>IoT Edge ツールの設定を選択します。
DOCKER_HOST localhost の値を、Windows VM 上の IoT Edge for Linux の IP アドレスに置き換えます。 IP アドレスを覚えていない場合は、IoT Edge for Linux on Windows PowerShell コマンドレット
Get-EflowVmAddr
を使用して取得します。 たとえば、Windows VM 上の IoT Edge for Linux の IP アドレスが 172.20.1.100 の場合、新しい値は tcp://172.20.1.100:2375 する必要があります。[ 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 エンジンを使用してビルドまたはデバッグされるため、最初の手順では、リモート デバッグを有効にするようにモジュールをビルドして公開します。
ソリューション エクスプローラーで、モジュール プロジェクト フォルダー (たとえば、
myIotEdgeModule
) を選択します。カスタム モジュールをスタートアップ プロジェクトとして設定します。 メニューの [プロジェクト]>[スタートアップ プロジェクトとして設定]を選択します。
C# Linux モジュールをデバッグするには、
Dockerfile.amd64.debug
ファイルを更新して SSH サービスを有効にする必要があります。Dockerfile.amd64.debug
ファイルを更新して、次のテンプレートを使用します。Dockerfile for Azure IoT Edge AMD64 C# モジュールとリモート デバッグ サポート。注
[デバッグ] を選択すると、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 モジュール プロジェクトの名前と一致していることを確認します。Linux モジュールとの SSH 接続を確立するには、RSA キーを作成する必要があります。 新しい RSA キーを作成するには、管理者特権の PowerShell セッションを開き、次のコマンドを実行します。 RSA キーを同じ IoT Edge モジュール フォルダーに保存します。また、キーの名前は必ず
id_rsa
にします。ssh-keygen -t RSA -b 4096 -m PEM
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>
ソリューション エクスプローラーで、プロジェクト フォルダーを右クリックし、[IoT Edge モジュールのビルドとプッシュ] を選択します。 このコマンドを使用して、各モジュールの Docker イメージをビルドしてプッシュします。
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 の管理者サインイン資格情報を使用します。 運用環境のシナリオに向けて準備ができたら、サービス プリンシパルのような最小限の特権で認証できるオプションを使用することをお勧めします。 詳細については、「 コンテナー レジストリへのアクセスの管理」を参照してください。
モジュールの SSH サービスにアクセスするには、ポート 22 を公開する必要があります。 このチュートリアルではホスト ポートとして 10022 を使用しますが、別のポートを指定することもできます。 指定したポートは、Linux C# モジュールに接続するための SSH ポートとして使用されます。 ファイル
createOptions
内のこの Linux モジュール設定の SSH ポート情報をdeployment.debug.template.json
に追加する必要があります。"createOptions": { "HostConfig": { "Privileged": true, "PortBindings": { "22/tcp": [ { "HostPort": "10022" } ] } } }
ソリューション エクスプローラーでプロジェクト フォルダーを右クリックし、[IoT Edge のデプロイの生成] を選択して、新しい IoT Edge デプロイ JSON をビルドします。
[>] を選択します。 Visual Studio 2019 にサインインしていることを確認します。
Cloud Explorer でサブスクリプションを展開し、デプロイする Azure IoT Hub と Azure IoT Edge デバイスを見つけます。
IoT Edge デバイスを右クリックし、[ デプロイの作成] を選択します。 実際のプラットフォーム用に構成したデバッグ配置マニフェストに移動します。 これは、Visual Studio ソリューションの
config
フォルダー (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 モジュールのコンテナー作成オプションを構成する方法」を参照してください。
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" } } } }, //...
image
プロパティの値を、レジストリにプッシュしたモジュール イメージ名に置き換えます。 たとえば、カスタム モジュールmyacr.azurecr.io/iotedgemodule1:0.0.1-amd64
用にタグ付けされたイメージIotEdgeModule1
をプッシュした場合は、image プロパティの値をタグ値に置き換えます。createOptions
値を、"展開テンプレートのシステムおよびカスタム モジュールごとに" 文字列化されたコンテンツに追加または置き換えます。たとえば、
image
のcreateOptions
とIotEdgeModule1
の設定は次の例のようになります。"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 ハブにデプロイします。 たとえば、
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 接続文字列は、Azure portal の Azure IoT Hub>Security 設定>共有アクセス ポリシーで確認できます。
Cloud Explorer でエッジ デバイスを右クリックして更新し、新しいモジュールが
$edgeAgent
モジュールおよび$edgeHub
モジュールと共に実行されていることを確認します。
ソリューションのデバッグ
管理者特権の PowerShell セッションで、次のコマンドを実行します。
Linux C# モジュールの名前に基づいて、
moduleId
の値を取得します。 プレースホルダー<iot-edge-module-name>
は、モジュールの名前に置き換えます。$moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
$moduleId
が正しいことを確認します。 変数が空の場合は、正しいモジュール名を使用していることを確認します。Linux コンテナー内で SSH サービスを開始します。
Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
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 サービスを手動で再度開始する必要があります。
SSH サービスを正常に開始したら、 デバッグ>プロセスへのアタッチを選択し、 接続の種類 を SSH に設定し、 接続ターゲット を Windows VM 上の Linux 用 IoT Edge の IP アドレスに設定します。 IoT Edge for Linux on Windows VM の IP アドレスがわからない場合は、
Get-EflowVmAddr
PowerShell コマンドレットを使用できます。IP を入力し、Enter キーを押します。 ポップアップ ウィンドウに次の構成を入力します。
フィールド 値 ホスト名 IoT Edge for Linux on Windows VM の IP アドレス [ポート] 10022(もしくはデプロイ構成で使用したもの) ユーザー名 根 認証の種類 秘密キー 秘密キー ファイル 前の手順で作成した id_rsa
値の完全なパスパスフレーズ 前の手順で作成したキーに使用したパスフレーズ SSH を使用してモジュールに正常に接続したら、プロセスを選択して [ アタッチ] を選択できます。 C# モジュールでは、プロセス dotnet と Attach to Managed (CoreCLR) を選択する必要があります。 最初は 10 秒から 20 秒かかる場合があります。
モジュールを検査するためのブレークポイントを設定します。
- C# で開発している場合は
PipeMessage()
内のModuleBackgroundService.cs
関数にブレークポイントを設定します。 - C を使用している場合は
InputQueue1Callback()
内のmain.c
関数にブレークポイントを設定します。
- C# で開発している場合は
SimulatedTemperatureSensor
の出力は、カスタム Linux C# モジュールのinput1
にリダイレクトされるはずです。 ブレークポイントがトリガーされるはずです。 変数は、Visual Studio の [ローカル] ウィンドウで確認できます。デバッグを停止するには、Ctrl + F5 キーを押すか、[ 停止 ] ボタンを選択します。
リソースをクリーンアップする
次の推奨記事に進む場合は、作成したリソースおよび構成を維持して、再利用することができます。 また、同じ IoT Edge デバイスをテスト デバイスとして使用し続けることもできます。
そうでない場合は、課金されないようにするために、ローカル構成と、この記事で使用した Azure リソースを削除します。
Azure リソースを削除する
Azure のリソースとリソース グループは、削除すると元に戻すことができません。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 保持するリソースを含む既存のリソース グループ内に IoT Hub を作成した場合は、リソース グループではなく、IoT Hub リソース自体のみを削除します。
リソースを削除するには、次の手順に従います。
Azure portal にサインインし、[リソース グループ] を選択します。
IoT Edge のテスト リソースを含んだリソース グループの名前を選択します。
リソース グループに含まれているリソースの一覧を確認します。 それらすべてを削除する場合は、[ リソース グループの削除] を選択できます。 一部だけを削除する場合は、削除する各リソースを選択して個別に削除してください。
次のステップ
このチュートリアルでは、開発マシンに Visual Studio を設定し、そこから最初の IoT Edge モジュールをデプロイしてデバッグしました。 これで基本的な概念が理解できたので、モジュールを通過するデータを分析できるように、モジュールに機能を追加してみます。