Visual Studio 2022 を使用して Azure IoT Edge 用のモジュールを開発してデバッグする
適用対象: IoT Edge 1.5
IoT Edge 1.4
重要
サポートされているリリースは、IoT Edge 1.5 LTS と IoT Edge 1.4 LTS です。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日にサポートが終了します。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。
この記事では、Visual Studio 2022 を使用してカスタムの Azure IoT Edge モジュールを開発、デバッグ、およびデプロイする方法を示します。 Visual Studio 2022 では、C および C# で記述された IoT Edge モジュール用テンプレートを提供しています。 サポートされるデバイス アーキテクチャは、Windows X64 と、Linux X64 または ARM32 および ARM64 (プレビュー) です。 サポートされているオペレーティング システム、言語、およびアーキテクチャの詳細については、「Language and architecture support (言語とアーキテクチャのサポート)」を参照してください。
この記事には、2 つの IoT Edge 開発ツールの手順が含まれています。
- コマンド ライン インターフェイス (CLI) は、開発に推奨されるツールです。
- Azure IoT Edge Tools for Visual Studio 拡張機能。 拡張機能はメンテナンス モードになっています。
最初に、ツール セレクター ボタンを使用して、この記事のツール オプションを選択します。 両方のツールには、次のような利点があります。
- ローカル開発用コンピューター上で IoT Edge ソリューションとモジュールの作成、編集、ビルド、実行、デバッグを行うことができます。
- Visual Studio 開発の利点を利用して、C または C# で Azure IoT モジュールのコードを書きます。
- Azure IoT Hub を使用して IoT Edge ソリューションを IoT Edge デバイスにデプロイできます。
前提条件
この記事では、Windows を実行しているマシンを開発用マシンとして使用していることを前提としています。
開発用マシンで Visual Studio 2022 をインストールするか、変更します。 [C++ ワークロードを使用した Azure 開発 と デスクトップ開発] オプションを選択します。
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 をダウンロードしてインストールします。
Vcpkg ライブラリ マネージャーをインストールします
git clone https://github.com/Microsoft/vcpkg cd vcpkg bootstrap-vcpkg.bat
Windows 用の azure-iot-sdk-c パッケージをインストールします
vcpkg.exe install azure-iot-sdk-c:x64-windows vcpkg.exe --triplet x64-windows integrate install
モジュール イメージをビルドして実行するために、Docker 互換のコンテナー管理システムをダウンロードし、開発用コンピューターにインストールします。 例として、Docker Community Edition をインストールします。
Linux コンテナーを使用してモジュールを開発するには、Docker Desktop の要件を満たす Windows コンピューターを使用します。
モジュール イメージを格納する Azure Container Registry または Docker Hub を作成します。
ヒント
プロトタイプおよびテスト目的で、クラウド レジストリの代わりに Docker のローカル レジストリを使用できます。
Azure CLI をインストールします。
デバイス上でお使いのモジュールをテストするには、1 つ以上の IoT Edge デバイスを使用するアクティブな IoT Hub が必要です。 テスト用の IoT Edge デバイスを作成する場合、Azure portal または CLI で作成できます。
Azure portal で作成するのが最も迅速です。 Azure portal から目的の IoT Hub リソースに移動します。 [デバイス管理] メニューの [デバイス] を選択し、[デバイスの追加] を選択します。
[デバイスの作成] で、[デバイス ID] を使用してデバイスに名前を付け、[IoT Edge デバイス] チェック ボックスをオンにして、左下の [保存] を選択します。
最後に、[デバイス管理] > [デバイス] メニューから、IoT Hub に新しいデバイスが存在することを確認します。 Azure portal を通じた IoT Edge デバイスの作成の詳細については、「対称キーを使用して Linux で IoT Edge デバイスを作成およびプロビジョニングする」を参照してください。
CLI で IoT Edge デバイスを作成するには、Linux または Windows 用のクイック スタートの手順に従ってください。 IoT Edge デバイスを登録するプロセスで、IoT Edge デバイスを作成します。
開発用マシンで IoT Edge デーモンを実行している場合は、Visual Studio で開発を始める前に、EdgeHub と EdgeAgent を停止することが必要になる可能性があります。
Azure IoT Edge プロジェクトを作成する
Visual Studio の IoT Edge プロジェクト テンプレートでは、IoT Edge デバイスにデプロイできるソリューションが作成されます。 まず、Azure IoT Edge ソリューションを作成します。 その後、そのソリューションにモジュールを作成します。 各 IoT Edge ソリューションには、複数のモジュールを含めることができます。
警告
Visual Studio 拡張機能用の Azure IoT Edge ツールには、C および C# モジュール用のプロジェクト テンプレートがありません。 現在、この問題の解決に向けて取り組んでいます。 拡張機能を使用して IoT Edge モジュールを作成できない場合は、次の回避策を使用してください。
次のファイルをダウンロードし、一覧表示されている Visual Studio テンプレート ディレクトリに配置します。
テンプレート ファイル | ディレクトリに追加する |
---|---|
azureiotedgemodule-v0.0.4.zip | %userprofile%\Documents\Visual Studio 2022\Templates\ProjectTemplates\Visual C# |
azureiotedgevcmodulevs17-v0.0.9.zip | %userprofile%\Documents\Visual Studio 2022\Templates\ProjectTemplates\Visual C++ Project |
ソリューション内に 3 つのプロジェクトを構築してゆきます。 温度センサー モジュールに加えて EdgeAgent と EdgeHub を含むメイン モジュール。 次に、さらに 2 つの IoT Edge モジュールを追加します。
重要
Visual Studio によって作成される IoT Edge プロジェクトの構造は、Visual Studio Code の場合と同じではありません。
現在、Azure IoT Edge Dev Tool CLI では、Visual Studio プロジェクトの種類の作成はサポートされていません。 Visual Studio プロジェクトを作成するには、Visual Studio IoT Edge 拡張機能を使用する必要があります。
Visual Studio で、新しいプロジェクトを作成します。
[新しいプロジェクトの作成] で、Azure IoT Edge を検索します。 IoT Edge デバイスのプラットフォームとアーキテクチャに一致するプロジェクトを選択し、[次へ] を選択します。
[新しいプロジェクトの構成] で、プロジェクトの名前を入力し、場所を指定して、[作成] を選択します。
[モジュールの追加] で、開発するモジュールの種類を選択します。 デプロイに追加する既存のモジュールがある場合は、[既存のモジュール] を選択します。
[モジュール名] に、モジュールの名前を入力します。 コンテナー レジストリ内に一意の名前を選択します。
[リポジトリ URL] で、モジュールのイメージ リポジトリの名前を指定します。 Visual Studio により、モジュール名には自動的に localhost:5000/<対象のモジュール名<> が設定されます。 独自のレジストリ情報に置き換えます。 テスト用に Docker のローカル レジストリを使用する場合、localhost を使用します。 Azure Container Registry を使用する場合、お使いのレジストリの設定のログイン サーバーを使用します。 ログイン サーバーは <レジストリ名>.azurecr.io のようになります。 この文字列の localhost:5000 部分だけを置き換えて、最終的な結果が <レジストリ名>.azurecr.io/<対象のモジュール名> になるようにします。
[追加] を選択して、お使いのモジュールをプロジェクトに追加します。
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 配置マニフェストのテンプレートであり、そこに、デバイス上で実行されるすべてのモジュールが、それらの相互のに通信方法と一緒に定義されています。 デプロイ マニフェストの詳細については、モジュールをデプロイしてルートを確立する方法に関するページを参照してください。
このデプロイ テンプレートを開いた場合、edgeAgent と edgeHub の2 つのランタイム モジュールと、この Visual Studio プロジェクト内で作成したカスタム モジュールが含まれていることを確認できます。 SimulatedTemperatureSensor という名前の 4 番目のモジュールも含まれています。 この既定のモジュールでは、モジュールのテストに使用できるシミュレートされたデータが生成されます。必要ない場合は削除します。 シミュレートされた温度センサーの仕組みについては、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 を開きます。 配置マニフェストは、ターゲットの IoT Edge デバイス上で構成されるモジュールを記述した 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", //...
モジュール インフラストラクチャと開発オプション
新しいモジュールを追加すると、コードに触れることなくテストを開始できるよう、ビルドしてデバイスにデプロイする準備ができている既定のコードが付属します。 モジュール コードは、モジュール フォルダー内の Program.cs
(C# の場合) または main.c
(C の場合) という名前のファイルにあります。
既定のソリューションは、SimulatedTemperatureSensor モジュールのシミュレートされたデータがモジュールにルーティングされ、そこで入力が受け取られて IoT Hub に送信されるように構築されています。
モジュール テンプレートを独自のコードでカスタマイズする準備ができたら、Azure IoT Hub SDK を使用して、セキュリティ、デバイス管理、信頼性など、IoT ソリューションの主なニーズに対処するモジュールをビルドします。
シミュレーターを使用したデバッグ
Azure IoT EdgeHub 開発ツールでは、ローカルでの開発およびデバッグ エクスペリエンスが提供されます。 このツールにより、IoT Edge ランタイムなしに IoT Edge モジュールを起動することができ、IoT Edge モジュールとソリューションのローカルでの作成、開発、テスト、実行、デバッグを行えます。 テストするために、イメージをコンテナー レジストリにプッシュしたり、それらをデバイスに配置したりする必要はありません。
詳細については、「Azure IoT EdgeHub 開発ツール」を参照してください。
Visual Studio でツールを初期化するには:
Azure portal または Azure CLI から、IoT Edge デバイスの接続文字列 (IoT Hub 内にあります) を取得します。
CLI を使用して接続文字列を取得する場合は、次のコマンドを使用し、"[device_id]" と "[hub_name]" を実際の値に置き換えます。
az iot hub device-identity connection-string show --device-id [device_id] --hub-name [hub_name]
Visual Studio の [ツール] メニューから、[Azure IoT Edge Tools]>[IoT Edge シミュレーターのセットアップ] と選択します。
接続文字列を貼り付けて、[OK] を選びます。
Note
結果は後続の Azure IoT Edge ソリューションすべてに自動的に適用されるため、お使いの開発用コンピューターではこの手順に一度だけ従う必要があります。 この手順にもう一度従うことができるのは、別の接続文字列への変更が必要になった場合のみです。
1 つのモジュールをビルドしてデバッグする
通常は、複数のモジュールを含むソリューション全体内で実行する前に、各モジュールをテストしてデバッグする必要があります。 IoT Edge シミュレーター ツールを使用すると、ポート 53000 経由で送信メッセージを分離して 1 つのモジュールを実行できます。
[ソリューション エクスプローラー]で、モジュール プロジェクト フォルダー (IotEdgeModule1 など) を選択して強調表示します。 カスタム モジュールをスタートアップ プロジェクトとして設定します。 メニューから [プロジェクト> スタートアップ プロジェクトとして設定] を選択します。
[F5] キーを押すか、ツール バーの実行ボタンを選択して、1 つのモジュールの IoT Edge シミュレーターを起動します。 最初は 10 秒から 20 秒かかる場合があります。
モジュールが正常に初期化された場合は、.Net Core コンソール アプリのウィンドウが表示されたことが分かるはずです。
モジュールを検査するためのブレークポイントを設定します。
- C# で開発する場合は ModuleBackgroundService.cs 内の
PipeMessage()
関数にブレークポイントを設定します。 - C を使用する場合は
InputQueue1Callback()
内のInputQueue1Callback()
関数にブレークポイントを設定します。
- C# で開発する場合は ModuleBackgroundService.cs 内の
メッセージを送信してモジュールをテストします。 単一のモジュールをデバッグする場合、シミュレーターによって、既定のポート 53000 でメッセージがリッスンされます。 モジュールにメッセージを送信するには、 Git Bash や WSL Bash などのコマンド シェルから次の curl コマンドを実行します。
curl --header "Content-Type: application/json" --request POST --data '{"inputName": "input1","data":"hello world"}' http://localhost:53000/api/v1/messages
URL で右中かっこ/右角かっこが一致しないエラーが発生した場合、代わりに次のコマンドを試してください。
curl --header "Content-Type: application/json" --request POST --data "{\"inputName\": \"input1\", \"data\", \"hello world\"}" http://localhost:53000/api/v1/messages
ブレークポイントがトリガーされるはずです。 デバッガーの実行中に見つかる変数は、Visual Studio の [ローカル] ウィンドウで参照できます。 [デバッグ>]、[Windows>ローカル] の順に移動します。
Bash またはシェルに、
{"message":"accepted"}
という確認が表示されるはずです。.NET コンソールに、次のように表示されるはずです。
IoT Hub module client initialized. Received message: 1, Body: [hello world]
Ctrl + F5 キーを押すか停止ボタンをクリックして、デバッグを停止します。
複数のモジュールのビルドとデバッグ
1 つのモジュールの開発が完了したら、複数のモジュールを含むソリューション全体を実行してデバッグします。 IoT Edge シミュレーター ツールを使用すると、メッセージ ルーティング用のシミュレートされた edgeHub を含む、配置マニフェストで定義されているすべてのモジュールを実行できます。 この例では、2 つのカスタム モジュールとシミュレートされた温度センサー モジュールを実行します。 シミュレートされた温度センサー モジュールからのメッセージは、各カスタム モジュールにルーティングされます。
ソリューション エクスプローラーで、メイン プロジェクト フォルダーを右クリックして、ソリューションに 2 つ目のモジュールを追加します。 メニューの [追加]>[New IoT Edge Module]\(新しい IoT Edge モジュール\) を選択します。
Add module
ウィンドウで、新しいモジュールに名前を付け、リポジトリ URL のlocalhost:5000
の部分を、前に行ったように Azure Container Registry ログイン サーバーに置き換えます。deployment.debug.template.json
ファイルを開き、新しいモジュールが modules セクションに追加されていることを確認します。 新しいモジュールから IoT Hub にメッセージを送信するため、新しいルートもEdgeHub
内の routes セクションに追加されました。 シミュレートされた温度センサーから新しいモジュールにデータを送信するには、JSON
の次のような行によって別のルートを追加します。<NewModuleName>
(2 か所) を独自のモジュール名に置き換えます。"sensorTo<NewModuleName>": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/<NewModuleName>/inputs/input1\")"
メイン プロジェクト (AzureIotEdgeApp1 など) を右クリックし、[スタートアップ プロジェクトとして設定] を選択します。 メイン プロジェクトをスタートアップ プロジェクトとして設定すると、ソリューション内のすべてのモジュールが実行されます。 これには、ソリューションに追加した両方のモジュール、シミュレートされた温度センサー モジュール、シミュレートされた Edge ハブが含まれます。
[F5] キーを押すか、実行ツールバー ボタンを選択してソリューションを実行します。 最初は 10 秒から 20 秒かかる場合があります。 このプロジェクトに必要なポートをバインドする可能性のある他の Docker コンテナーが実行中でないことを確認してください。
モジュールごとに 2 つの .NET Core コンソール アプリ ウィンドウが表示されます。
モジュールを検査するためのブレークポイントを設定します。
- C# で開発する場合は ModuleBackgroundService.cs 内の
PipeMessage()
関数にブレークポイントを設定します。 - C を使用する場合は
InputQueue1Callback()
内のInputQueue1Callback()
関数にブレークポイントを設定します。
- C# で開発する場合は ModuleBackgroundService.cs 内の
各モジュール内にブレークポイントを作成したら、F5 キーを押して複数のモジュールを同時に実行し、デバッグします。 各ウィンドウが異なるモジュールを表している .Net Core コンソール アプリ ウィンドウが複数表示されるはずです。
Ctrl + F5 キーを押すか停止ボタンをクリックして、デバッグを停止します。
イメージをビルドしてレジストリにプッシュする
モジュールを開発してデバッグすると、モジュール イメージをビルドして Azure Container Registry にプッシュできるようになります。 その後、モジュールを IoT Edge デバイスに展開できます。
IoT Edge メイン プロジェクトが、独立したモジュールの 1 つではなく、スタートアップ プロジェクトを設定します。
モジュール イメージに対して作成する構成として [デバッグ] または [リリース] を選択します。
Note
[デバッグ] を選択すると、Visual Studio では、Docker イメージのビルドに
Dockerfile.(amd64|windows-amd64).debug
が使用されます。 これにより、コンテナー イメージのビルド中に .NET Core コマンド ライン デバッガー VSDBG が組み込まれます。 運用環境対応の IoT Edge モジュールの場合は、[リリース] 構成を使用することをお勧めします。これには、VSDBG が含まれていないDockerfile.(amd64|windows-amd64)
が使用されます。Azure Container Registry (ACR) のようなプライベート レジストリを使用している場合は、次の Docker コマンドを使用してサインインします。 ユーザー名とパスワードは、Azure portal のレジストリの [アクセス キー] ページから取得できます。
docker login <ACR login server>
ファイル
deployment.debug.template.json
内にあるランタイム設定に、Azure Container Registry のログイン情報を追加してみましょう。 これには、2 つの方法があります。 レジストリ資格情報は、.env
ファイルに追加すること (最も安全)、またはdeployment.debug.template.json
ファイルに直接追加することができます。資格情報を
.env
ファイルに追加する:[ソリューション エクスプローラー] の [すべてのファイルを表示] ツール バー ボタンを選択します。
.env
ファイルが表示されます。.env
ファイルに、Azure Container Registry のユーザー名とパスワードを追加します。 これらの資格情報は、Azure portal では、Azure Container Registry の [アクセス キー] ページに記載されています。DEFAULT_RT_IMAGE=1.2 CONTAINER_REGISTRY_USERNAME_myregistry=<my-registry-name> CONTAINER_REGISTRY_PASSWORD_myregistry=<my-registry-password>
資格情報を deployment.debug.template.json に直接追加する
資格情報を展開テンプレートに直接追加する場合は、プレースホルダーを ACR 管理者のユーザー名、パスワード、レジストリ名に置き換えます。
"settings": { "minDockerVersion": "v1.25", "loggingOptions": "", "registryCredentials": { "registry1": { "username": "<username>", "password": "<password>", "address": "<registry name>.azurecr.io" } } }
Note
この記事では、開発とテストのシナリオに便利な、Azure Container Registry の管理者ログイン資格情報を使用します。 運用環境のシナリオに向けて準備ができたら、サービス プリンシパルのような最小限の特権で認証できるオプションを使用することをお勧めします。 詳細については、[コンテナー レジストリへのアクセスを管理する] を参照してください。
ローカル レジストリを使用している場合は、ローカル レジストリを実行することができます。
最後に、ソリューション エクスプローラーでメイン プロジェクト フォルダーを右クリックし、[IoT Edge モジュールをビルドしてプッシュする] を選択して、各モジュールの Docker イメージをビルドしてプッシュします。 これには数分かかる場合があります。 Visual Studio の出力コンソールに
Finished Build and Push IoT Edge Modules.
と表示されたら完了です。
ソリューションのデプロイ
モジュール イメージをビルドして Azure Container Registry にプッシュしたため、ソリューションを IoT Edge デバイスにデプロイできます。 既に、このチュートリアルを通して見てきた配置マニフェスト テンプレートがあります。 それから配置マニフェストを生成し、次に Azure CLI コマンドを使用して、Azure の IoT Edge デバイスにモジュールをデプロイしましょう。
Visual Studio ソリューション エクスプローラーでメイン プロジェクトを右クリックし、[IoT Edge の配置の生成] を選択します。
ローカルの Visual Studio メイン プロジェクト フォルダーに移動し、
config
フォルダーにアクセスします。 ファイル パスはC:\Users\<YOUR-USER-NAME>\source\repos\<YOUR-IOT-EDGE-PROJECT-NAME>\config
のようになるでしょう。 ここで、生成された配置マニフェスト (deployment.amd64.debug.json
など) を見つけます。deployment.amd64.debug.json
ファイルを調べ、edgeHub
スキーマのバージョンが 1.2 に設定されていることを確認します。"$edgeHub": { "properties.desired": { "schemaVersion": "1.2", "routes": { "IotEdgeModule2022ToIoTHub": "FROM /messages/modules/IotEdgeModule2022/outputs/* INTO $upstream", "sensorToIotEdgeModule2022": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/IotEdgeModule2022/inputs/input1\")", "IotEdgeModule2022bToIoTHub": "FROM /messages/modules/IotEdgeModule2022b/outputs/* INTO $upstream" }, "storeAndForwardConfiguration": { "timeToLiveSecs": 7200 } } }
ヒント
Visual Studio 2022 の展開テンプレートには 1.2 スキーマ バージョンが必要です。 これを 1.1 または 1.0 にする必要がある場合は、配置が生成されるまで待機します (これを
deployment.debug.template.json
で変更しないでください)。 配置を生成すると、既定で 1.2 スキーマが作成されます。 ただし、生成されたマニフェストを Azure にデプロイする前に、必要に応じてdeployment.amd64.debug.json
を手動で変更できます。重要
現在、IoT Edge デバイスが配置されると、スキーマ バージョン 1.2 の Azure portal では正しく表示されません (バージョン 1.1 では問題ありません)。 これは既知のバグであり、まもなく修正される予定です。 ただし、これはお使いのデバイスには影響しません。IoT Hub に接続されたままであり、Azure CLI を使用していつでも通信可能であるためです。
ここで、Azure CLI コマンドを使用してマニフェストを配置してみましょう。 Visual Studio の開発者コマンド プロンプトを開き、config ディレクトリに変更します。
cd config
IoT Edge デバイスのマニフェストを IoT Hub に配置します。 このコマンドによって、ソリューションで開発されたモジュールを使用するようにデバイスが構成されます。 配置マニフェストは、前の手順で作成し、config フォルダーに保存しました。 config フォルダーから次の配置コマンドを実行します。
[device id]
、[hub name]
、[file path]
は、実際の値に置き換えます。 IoT Edge デバイス ID が IoT Hub に存在しない場合は、このデバイス ID を作成する必要があります。az iot edge set-modules --device-id [device id] --hub-name [hub name] --content [file path]
たとえば、コマンドは次のようになります。
az iot edge set-modules --device-id my-device-name --hub-name my-iot-hub-name --content deployment.amd64.debug.json
コマンドの実行後、コマンド プロンプトには、
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 配置マニフェスト ファイルを開きます。 配置マニフェストは、ターゲットの IoT Edge デバイス上で構成されるモジュールを記述した JSON ドキュメントです。 デプロイの前に、Azure Container Registry 資格情報とモジュール イメージおよび適切な createOptions
の値で更新する必要があります。 createOption の値の詳細については、「IoT Edge モジュールのコンテナー作成オプションを構成する方法」を参照してください。
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" } } } }, //...
画像 のプロパティの値を、レジストリにプッシュしたモジュール イメージ名に置き換えます。 たとえば、カスタム モジュール
myacr.azurecr.io/iotedgemodule1:0.0.1-amd64
IotEdgeModule1 用にタグ付けされたイメージ をプッシュした場合は、イメージ プロパティの値を タグ値に置き換えます。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](共有アクセス ポリシー) にあります。
デバイスへの配置を確認する
IoT Edge モジュールが Azure にデプロイされたことを確認するには、たとえば SSH や Azure Bastion を使用して、デバイス (または仮想マシン) にサインインし、IoT Edge list コマンドを実行します。
iotedge list
デバイスまたは仮想マシンで実行されているモジュールの一覧が表示されるはずです。
NAME STATUS DESCRIPTION CONFIG
SimulatedTemperatureSensor running Up a minute mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0
edgeAgent running Up a minute mcr.microsoft.com/azureiotedge-agent:1.2
edgeHub running Up a minute mcr.microsoft.com/azureiotedge-hub:1.2
IotEdgeModule1 running Up a minute myacr.azurecr.io/iotedgemodule1:0.0.1-amd64.debug
myIotEdgeModule2 running Up a minute myacr.azurecr.io/myiotedgemodule2:0.0.1-amd64.debug
Docker リモート SSH を使用してデバッグする
Docker エンジンと Moby エンジンでは、コンテナーへの SSH 接続がサポートされているため、Visual Studio を使用してリモート デバイスでコードをアタッチおよびデバッグできます。
Docker にリモート接続するには、root レベルの特権が必要です。 非 root ユーザーとしての Docker の管理に関するページの手順に従って、リモート デバイスでの Docker デーモンへの接続を許可します。 デバッグが完了したら、Docker グループからユーザーを削除できます。
Visual Studio を使用して、リモート デバイス 上の Docker コンテナーで実行されているプロセスにアタッチする 手順に従います。
Visual Studio で、カスタム モジュールにブレークポイントを設定します。
ブレークポイントにヒットすると、変数の検査、コードのステップ実行、モジュールのデバッグを行うことができます。
次のステップ
お使いの IoT Edge デバイス用にカスタム モジュールを開発するには、「Azure IoT Hub SDK の概要と使用方法」を参照してください。
特定の IoT Edge デバイスの device-to-cloud (D2C) メッセージを監視するには、「チュートリアル: IoT Edge デバイスを監視する」を参照して作業を開始してください。