チュートリアル: IoT Edge for Linux on Windows を使用して、IoT Edge デバイスの階層を作成する
適用対象: IoT Edge 1.4
重要
サポートされているリリースは、IoT Edge 1.5 LTS と IoT Edge 1.4 です。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日にサポートが終了します。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。
階層レイヤーに編成された複数のネットワークに Azure IoT Edge ノードをデプロイできます。 階層内の各レイヤーは、その下のレイヤーにあるデバイスからのメッセージと要求を処理するゲートウェイ デバイスです。 この構成は、入れ子になったエッジとも呼ばれます。
最上位レイヤーだけがクラウドに接続できるように、デバイスの階層構造を構築できます。下位レイヤーは、その上下に隣接するレイヤーとだけ通信できます。 このネットワーク レイヤー化は、ほとんどの産業用ネットワークの基礎であり、ISA-95 標準に準拠しています。
このチュートリアルでは、IoT Edge for Linux on Windows を使用して IoT Edge デバイスの階層を作成し、IoT Edge ランタイム コンテナーをデバイスにデプロイして、デバイスをローカルで構成する手順について説明します。 次のタスクを実行します。
- IoT Edge デバイスの階層でリレーションシップを作成して定義します。
- 階層内のデバイスで IoT Edge ランタイムを構成します。
- デバイス階層全体で一貫した証明書をインストールします。
- 階層内のデバイスにワークロードを追加します。
- IoT Edge API プロキシ モジュールを使用して、下位レイヤー デバイスから単一のポートを介して HTTP トラフィックを安全にルーティングします。
ヒント
このチュートリアルには、IoT Edge の入れ子機能を紹介する手動の手順と自動の手順が混在しています。
IoT Edge デバイスの階層が完全に自動的に設定されるようすを確認したい場合は、スクリプト化された産業用 IoT 向け Azure IoT Edge サンプルをガイドとして独自のスクリプトに取り組みます。 このスクリプト化されたシナリオでは、工場環境をシミュレートするための構成済みのデバイスとして Azure 仮想マシンがデプロイされます。
IoT Edge デバイスの階層を手動で作成および管理する手順の詳細を確認したい場合は、IoT Edge デバイス ゲートウェイ階層の使用法ガイドを参照してください。
このチュートリアルでは、以下のネットワーク レイヤーを定義します。
最上位レイヤー: このレイヤーの IoT Edge デバイスは、クラウドに直接接続できます。
下位レイヤー: 最上位レイヤーより下にあるレイヤーの IoT Edge デバイスは、クラウドに直接接続できません。 データを送受信するには、1 つまたは複数の中間 IoT Edge デバイスを経由する必要があります。
このチュートリアルでは、わかりやすくするために 2 つのデバイスから成る階層を採用しています。 最上位レイヤー デバイスは、階層の最上位レイヤーにあるデバイスを表します。これは、クラウドに直接接続できます。 このデバイスは、親デバイスと呼ばれます。 下位レイヤー デバイスは、階層の下位レイヤーにあるデバイスを表します。これは、クラウドに直接接続できません。 必要に応じて、さらにデバイスを追加して運用環境を表すことができます。 下位レイヤーのデバイスは、子デバイスとも呼ばれます。
Note
子デバイスには、入れ子になったトポロジ内のダウンストリーム デバイスまたはゲートウェイ デバイスを使用できます。
前提条件
IoT Edge デバイスの階層を作成するには、以下のものが必要です。
- Azure IoT 拡張機能 v0.10.6 以降がインストールされた、Azure CLI v2.3.1 を使用した Azure Cloud Shell の Bash シェル。 このチュートリアルでは、Azure Cloud Shell を使用します。 Azure CLI モジュールと拡張機能の現在のバージョンを確認するには、az version を実行します。
- Azure IoT Edge for Linux on Windows を実行している 2 つの Windows デバイス。 両方のデバイスは、外部仮想スイッチを使用してデプロイする必要があります。
ヒント
Windows ホスト OS でポート フォワーディングが構成されている場合は、内部または既定の仮想スイッチを使用できます。 ただし、このチュートリアルをわかりやすくするために、両方のデバイスで外部仮想スイッチを使用し、同じ外部ネットワークに接続する必要があります。
ネットワークの詳細については、「Azure IoT Edge for Linux on Windows ネットワーク」と「Azure IoT Edge for Linux on Windows ネットワークの構成」を参照してください。
DMZ で EFLOW デバイスを設定する必要がある場合は、「Azure IoT Edge for Linux on Windows の産業用 IoT と DMZ の構成を構成する方法」を参照してください。
- 有効なサブスクリプションがある Azure アカウント。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
- Azure の Free レベルまたは Standard レベルの IoT Hub。
- 最下位レイヤー デバイスを除くすべてのデバイスで、443、5671、8883 の各ポートが受信用に開放されていることを確認します。
- 443: REST API の呼び出しと Docker コンテナー イメージのプルのために、親と子のエッジ ハブの間で使用されます。
- 5671、8883: AMQP と MQTT に使用されます。
ヒント
EFLOW 仮想マシン ファイアウォールの詳細については、IoT Edge for Linux on Windows のセキュリティに関する記事を参照してください。
IoT Edge デバイス階層を作成する
IoT Edge デバイスにより、階層のレイヤーが構成されます。 このチュートリアルでは、2 つの IoT Edge デバイス (最上位レイヤー デバイスと下位レイヤー デバイス) の階層を作成します。 必要に応じて、さらにダウンストリーム デバイスを作成できます。
IoT Edge デバイスの階層を作成して構成するには、az iot edge devices create Azure CLI コマンドを使用します。 このコマンドでは、さまざまな手順を自動化してまとめることで、階層の構成を簡素化します。
- IoT Hub にデバイスを作成する
- デバイス間の通信を承認するための親子関係を設定する
- 配置マニフェストを各デバイスに適用する
- 各デバイスが相互に安全な通信を確立するための証明書チェーンを生成する
- 各デバイスの構成ファイルを生成する
デバイス構成を作成する
1 つの子デバイスを持つ親デバイスを含む入れ子になったエッジ デバイスのグループを作成します。 このチュートリアルでは、基本的なサンプル配置マニフェストを使用します。 その他のシナリオの例については、構成例テンプレートを確認してください。
az iot edge devices create コマンドを使用する前に、最上位レイヤーと下位レイヤー デバイスの配置マニフェストを定義する必要があります。 deploymentTopLayer.json サンプル ファイルをローカル コンピューターにダウンロードします。
最上位レイヤー デバイスの配置マニフェストは、IoT Edge API プロキシ モジュールを定義し、下位レイヤー デバイスから IoT Hub へのルートを宣言します。
deploymentLowerLayer.json サンプル ファイルをローカル コンピューターにダウンロードします。
下位レイヤー デバイスの配置マニフェストには、シミュレートされた温度センサー モジュールが含まれており、最上位レイヤー デバイスへのルートを宣言します。 systemModules セクション内で mcr.microsoft.com ではなく、$upstream:443 からプルするようにランタイム モジュールが設定されていることを確認できます。 下位レイヤー デバイスは、クラウドから直接イメージをプルすることができないため、ポート 443 で Docker イメージ要求を IoT Edge API プロキシ モジュールに送信します。 下位レイヤー デバイスにデプロイされたもう 1 つのモジュール、Simulated Temperature Sensor モジュールも、そのイメージ要求を
$upstream:443
に対して行います。下位レイヤー デプロイ マニフェストを作成する方法の詳細については、Azure IoT Edge デバイスを接続して階層を作成する方法に関するページを参照してください。
Azure Cloud Shell で、az iot edge devices create Azure CLI コマンドを使用して、IoT Hub 内のデバイスと階層内の各デバイスの構成バンドルを作成します。 以下のプレースホルダーは、適切な値に置き換えてください。
プレースホルダー 説明 <hub-name> IoT Hub の名前。 <config-bundle-output-path> 構成バンドルを保存するフォルダー パス。 <parent-device-name> 最上位レイヤーの親デバイス ID 名。 <parent-deployment-manifest> 親デバイスの配置マニフェスト ファイル。 <parent-fqdn-or-ip> 親デバイスの完全修飾ドメイン名 (FQDN) または IP アドレス。 <child-device-name> 下位レイヤーの子デバイス ID 名。 <child-deployment-manifest> 子デバイスの配置マニフェスト ファイル。 <child-fqdn-or-ip> 子デバイスの完全修飾ドメイン名 (FQDN) または IP アドレス。 az iot edge devices create \ --hub-name <hub-name> \ --output-path <config-bundle-output-path> \ --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \ --device id=<parent-device-name> \ deployment=<parent-deployment-manifest> \ hostname=<parent-fqdn-or-ip> \ --device id=child-1 \ parent=parent-1 \ deployment=<child-deployment-manifest> \ hostname=<child-fqdn-or-ip>
たとえば、次のコマンドは、IoT Hub に 2 つの IoT Edge デバイスの階層を作成します。 parent-1 という名前の最上位レイヤー デバイスと、child-1* という名前の下位レイヤー デバイス。 このコマンドは、output ディレクトリに各デバイスの構成バンドルを保存します。 コマンドでは、自己署名テスト証明書も生成され、構成バンドルに含まれます。 構成バンドルは、インストール スクリプトを使用して各デバイスにインストールされます。
az iot edge devices create \ --hub-name my-iot-hub \ --output-path ./output \ --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \ --device id=parent-1 \ deployment=./deploymentTopLayer.json \ hostname=10.0.0.4 \ --device id=child-1 \ parent=parent-1 \ deployment=./deploymentLowerLayer.json \ hostname=10.1.0.4
コマンドを実行した後に、output ディレクトリにデバイスの構成バンドルが表示されます。 次に例を示します。
PS C:\nested-edge\output> dir
Directory: C:\nested-edge\output
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 4/10/2023 4:12 PM 7192 child-1.tgz
-a--- 4/10/2023 4:12 PM 6851 parent-1.tgz
独自の証明書とキーをコマンドの引数として渡すことも、より複雑なデバイス階層を作成することもできます。 az コマンドを使用した入れ子になったデバイスの作成の詳細については、az iot edge devices create に関するページを参照してください。 ゲートウェイのシナリオにおける証明書の使い方に詳しくない場合は、使用法ガイドの証明書に関するセクションを参照してください。
このチュートリアルでは、インライン引数を使用して、デバイスと構成バンドルを作成します。 YAML 形式または JSON 形式の構成ファイルを使用することもできます。 サンプル構成ファイルについては、sample_devices_config.yaml の例を参照してください。
IoT Edge ランタイムを構成する
構成手順では、デバイスのプロビジョニングに加えて、前に作成した証明書を使用して、階層内のデバイス間に信頼された通信を確立します。 この手順では、階層のネットワーク構造の確立も開始します。 最上位レイヤー デバイスはインターネットに接続することができ、クラウドからランタイム用のイメージをプルできます。一方、下位レイヤー デバイスは、最上位レイヤー デバイス経由でルーティングされて、これらのイメージにアクセスします。
IoT Edge ランタイムを構成するには、構成バンドルをデバイスに適用する必要があります。 最上位レイヤー デバイスと下位レイヤー デバイスでは構成が異なるため、各デバイスに適用する構成ファイルがどのデバイスのものかに注意してください。
各デバイスには、それに対応する構成バンドルが必要です。 構成バンドルを各デバイスに移動するには、USB ドライブまたはセキュア ファイル コピーを使用できます。 構成バンドルを各 EFLOW デバイスの Windows ホスト OS にコピーしてから、EFLOW VM にコピーする必要があります。
警告
必ず、正しい構成バンドルを各デバイスに送信してください。
最上位レイヤーのデバイスの構成
最上位の Windows ホスト デバイスに接続し、parent-1.tzg ファイルをデバイスにコピーします。
[管理者として実行] を使用して、管理者特権の PowerShell セッションを開始します。
parent-1.tzg を EFLOW VM にコピーします。
Copy-EflowVmFile -fromFile parent-1.tzg -toFile ~/ -pushFile
EFLOW 仮想マシンに接続します
Connect-EflowVm
構成バンドル アーカイブを抽出します。 たとえば、tar コマンドを使用して parent-1 アーカイブ ファイルを抽出します。
tar -xzf ./parent-1.tgz
インストール スクリプトの実行アクセス許可を設定します。
chmod +x install.sh
install.sh スクリプトを実行します。
sudo sh ./install.sh
適切な証明書のアクセス許可を適用し、IoT Edge ランタイムを再起動します。
sudo chmod -R 755 /etc/aziot/certificates/ sudo iotedge system restart
すべての IoT Edge サービスが正しく実行されていることを確認します。
sudo iotedge system status
最後に、適切なファイアウォール規則を追加して、下位レイヤー デバイスと最上位レイヤー デバイスの間の接続を有効にします。
sudo iptables -A INPUT -p tcp --dport 5671 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 8883 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT sudo iptables-save | sudo tee /etc/systemd/scripts/ip4save
デバイスで構成および接続チェックを実行します。
sudo iotedge check
最上位レイヤー デバイスでは、出力には複数の合格した評価が表示されることが予想されます。 ログ ポリシーに関する警告のほか、ご利用のネットワークによっては DNS ポリシーに関する警告が表示されることもあります。
デバイスの構成ファイルに対する変更内容の詳細を知りたい場合は、使用法ガイドの「デバイスで IoT Edge を構成する」セクションを参照してください。
下位レイヤーのデバイスの構成
下位レベルの Windows ホスト デバイスに接続し、child-1.tzg ファイルをデバイスにコピーします。
[管理者として実行] を使用して、管理者特権の PowerShell セッションを開始します。
child-1.tzg を EFLOW VM にコピーします。
Copy-EflowVmFile -fromFile child-1.tzg -toFile ~/ -pushFile
EFLOW 仮想マシンに接続します
Connect-EflowVm
構成バンドル アーカイブを抽出します。 たとえば、tar コマンドを使用して child-1 アーカイブ ファイルを抽出します。
tar -xzf ./child-1.tgz
インストール スクリプトの実行アクセス許可を設定します。
chmod +x install.sh
install.sh スクリプトを実行します。
sudo sh ./install.sh
適切な証明書のアクセス許可を適用し、IoT Edge ランタイムを再起動します。
sudo chmod -R 755 /etc/aziot/certificates/ sudo iotedge system restart
すべての IoT Edge サービスが正しく実行されていることを確認します。
sudo iotedge system status
デバイスで構成および接続チェックを実行します。 下位レイヤー デバイスの場合は、診断イメージを手動でコマンドに渡す必要があります。
sudo iotedge check --diagnostics-image-name <parent_device_fqdn_or_ip>:443/azureiotedge-diagnostics:1.2
前の手順を正しく完了した場合は、デバイスが正しく構成されていることを確認できます。 各デバイスの構成が正しいことを確認したら、続行することができます。
デバイス モジュールのデプロイ
デバイスのモジュールのデプロイは、デバイスが IoT Hub で作成されたときに適用されました。 az iot edge devices create コマンドは、上位レイヤーと下位レイヤーのデバイスにデプロイ JSON ファイルを適用しました。 それらのデプロイが完了した後、下位レイヤー デバイスは、IoT Edge API プロキシ モジュールを使用して、その必要なイメージをプルします。
最上位レイヤー デバイスは、ランタイム モジュールである IoT Edge エージェントと IoT Edge ハブに加え、Docker レジストリ モジュールと IoT Edge API プロキシ モジュールを受け取ります。
Docker レジストリ モジュールは、既存の Azure Container Registry を参照します。 この場合、REGISTRY_PROXY_REMOTEURL
の参照先は Microsoft Container Registry です。 既定では、Docker レジストリはポート 5000 でリッスンします。
IoT Edge API プロキシ モジュールは、HTTP 要求を他のモジュールにルーティングします。これによって下位レイヤー デバイスはストレージに対してコンテナー イメージをプルしたり、BLOB をプッシュしたりできるようになります。 このチュートリアルでは、その通信にポート 443 を使用しています。さらに、Docker コンテナー イメージのプル要求を、ポート 5000 で Docker レジストリ モジュールにルーティングするように構成されています。 また、Blob Storage のアップロード要求は、ポート 11002 で AzureBlobStorageonIoTEdge モジュールにルーティングされます。 IoT Edge API プロキシ モジュールとその構成方法の詳細については、モジュールの使用法ガイドを参照してください。
このようなデプロイを Azure portal または Azure Cloud Shell で作成する方法については、使用法ガイドの最上位レイヤー デバイスに関するセクションを参照してください。
モジュールの状態は、次のコマンドを使用して確認できます。
az iot hub module-twin show --device-id <edge-device-id> --module-id '$edgeAgent' --hub-name <iot-hub-name> --query "properties.reported.[systemModules, modules]"
このコマンドは、edgeAgent の報告されるプロパティすべてを出力します。 デバイスの状態を監視する際に役立つものとしては、"runtime status (ランタイムの状態) "、"runtime start time (ランタイムの開始時刻) "、"runtime last exit time (ランタイムの最後の終了時刻) "、"runtime restart count (ランタイムの再起動回数) " が挙げられます。
モジュールの状態は、Azure portal で確認することもできます。 実際の IoT Hub の [デバイス] セクションに移動して、デバイスとモジュールを確認してください。
生成されたデータを表示する
プッシュした Simulated Temperature Sensor モジュールは、サンプル環境データを生成します。 送信されるメッセージには、周囲の温度と湿度、機械の温度と圧力、タイムスタンプが含まれます。
それらのメッセージを Azure Cloud Shell から確認することもできます。
az iot hub monitor-events -n <iot-hub-name> -d <lower-layer-device-name>
次に例を示します。
az iot hub monitor-events -n my-iot-hub -d child-1
{
"event": {
"origin": "child-1",
"module": "simulatedTemperatureSensor",
"interface": "",
"component": "",
"payload": "{\"machine\":{\"temperature\":104.29281270901808,\"pressure\":10.48905461241978},\"ambient\":{\"temperature\":21.086561171611102,\"humidity\":24},\"timeCreated\":\"2023-04-17T21:50:30.1082487Z\"}"
}
}
トラブルシューティング
構成の確認やエラーのトラブルシューティングには、iotedge check
コマンドを実行します。
ダウンストリーム デバイスがインターネットに直接アクセスできなくても、入れ子になった階層で iotedge check
を実行できます。
下位レイヤーから iotedge check
を実行すると、このプログラムは、ポート 443 を使用して親からイメージをプルしようとします。
sudo iotedge check --diagnostics-image-name $upstream:443/azureiotedge-diagnostics:1.2
azureiotedge-diagnostics
の値は、レジストリ モジュールにリンクされたコンテナー レジストリからプルされます。 このチュートリアルでは、既定値の https://mcr.microsoft.com に設定しています。
名前 | 値 |
---|---|
REGISTRY_PROXY_REMOTEURL |
https://mcr.microsoft.com |
プライベート コンテナー レジストリを使用する場合は、コンテナー レジストリにすべてのイメージ (IoTEdgeAPIProxy、edgeAgent、edgeHub、Simulated Temperature Sensor、diagnostics) が存在することを確認してください。
ダウンストリーム デバイスのプロセッサ アーキテクチャが親デバイスとは異なる場合は、適切なアーキテクチャ イメージが必要です。 接続されたレジストリを使用することも、ダウンストリーム デバイスの config.toml ファイル内の edgeAgent モジュールと edgeHub モジュールに適切なイメージを指定することもできます。 たとえば、親デバイスが ARM32v7 アーキテクチャで実行されていて、ダウンストリーム デバイスが AMD64 アーキテクチャで実行されている場合は、ダウンストリーム デバイスの config.toml ファイルで一致するバージョンとアーキテクチャ イメージ タグを指定する必要があります。
[agent.config]
image = "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"
"systemModules": {
"edgeAgent": {
"settings": {
"image": "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"
},
},
"edgeHub": {
"settings": {
"image": "$upstream:443/azureiotedge-hub:1.4.10-linux-amd64",
}
}
}
リソースをクリーンアップする
課金されないようにするために、ローカル構成と、この記事で作成した Azure リソースを削除できます。
リソースを削除するには、次の手順に従います。
Azure portal にサインインし、 [リソース グループ] を選択します。
IoT Edge のテスト リソースを含んだリソース グループの名前を選択します。
リソース グループに含まれるリソースの一覧を確認します。 それらすべてを削除する場合は、[リソース グループの削除] を選択します。 一部だけを削除する場合は、削除する各リソースを選択して個別に削除してください。
次のステップ
このチュートリアルでは、2 つの IoT Edge デバイスをゲートウェイとして構成し、一方をもう一方の親デバイスとして設定しました。 次に、IoT Edge API プロキシ モジュールを使用して、ゲートウェイ経由でコンテナー イメージを子デバイスにプルする方法を示しました。 詳細については、プロキシ モジュールの使用に関する使用法ガイドを参照してください。
ゲートウェイを使用して IoT Edge デバイスの階層レイヤーを作成する方法の詳細については、次の記事を参照してください。