対象:
IoT Edge 1.5
重要
IoT Edge 1.5 LTS は、サポートされているリリースです。 IoT Edge 1.4 LTS は 2024 年 11 月 12 日に終了しました。 以前のリリースを使用している場合は、「Update IoT Edgeを参照してください。
階層レイヤーに編成されたネットワーク間でAzure IoT Edgeノードをデプロイします。 階層内の各レイヤーは、その下のレイヤーにあるデバイスからのメッセージと要求を処理するゲートウェイ デバイスです。 この構成は、入れ子になったエッジとも呼ばれます。
最上位レイヤーのみがクラウドに接続できるようにデバイスの階層を構成し、下位レイヤーは隣接する北と南のレイヤーとのみ通信できるようにします。 このネットワーク レイヤー化は、ほとんどの産業用ネットワークの基礎であり、ISA-95 標準に準拠しています。
このチュートリアルでは、Windows 上の Linux 用IoT Edgeを使用してIoT Edge デバイスの階層を作成し、IoT Edgeランタイム コンテナーをデバイスに展開し、デバイスをローカルで構成する方法について説明します。 このチュートリアルでは、次のタスクを実行します。
- IoT Edge デバイスの階層内のリレーションシップを作成して定義します。
- 階層内のデバイスでIoT Edge ランタイムを構成します。
- デバイス階層全体で一貫した証明書をインストールします。
- 階層内のデバイスにワークロードを追加します。
- IoT Edge API プロキシ モジュールを使用して、下位レイヤー デバイスから 1 つのポート経由で HTTP トラフィックを安全にルーティングします。
ヒント
このチュートリアルには、入れ子になったIoT Edge機能のショーケースを提供するための手動手順と自動化された手順の組み合わせが含まれています。
IoT Edge デバイスの階層設定を完全に自動化された手順で行いたい場合は、Azure IoT Edge for Industrial IoT サンプルのスクリプトを参考にして独自のスクリプトを作成して指示します。 このスクリプト化されたシナリオでは、Azure仮想マシンを事前構成済みデバイスとしてデプロイし、ファクトリ環境をシミュレートします。
IoT Edge デバイスの階層を作成および管理するための手動手順の詳細については、「デバイス ゲートウェイ階層のハウツー ガイドIoT Edgeを参照してください。
このチュートリアルでは、以下のネットワーク レイヤーを定義します。
Top レイヤー: このレイヤー IoT Edgeデバイスはクラウドに直接接続できます。
レイヤー: 最上位レイヤーの下のレイヤーにあるIoT Edgeデバイスはクラウドに直接接続できません。 データを送受信するには、1 つ以上の中間IoT Edgeデバイスを経由する必要があります。
このチュートリアルでは、わかりやすくするために 2 デバイス階層を使用します。 最上位レイヤー デバイスは、階層の最上位レイヤーにあるデバイスを表します。これは、クラウドに直接接続できます。 このデバイスは 親デバイスと呼ばれます。 下位レイヤー デバイスは、階層の下位レイヤーにあるデバイスを表します。これは、クラウドに直接接続できません。 必要に応じて、運用環境を表すデバイスを追加します。 下位レイヤーのデバイスは 、子デバイスと呼ばれます。
2 つのデバイス (最上位レイヤー デバイスと下位レイヤー デバイス) が含まれるチュートリアルの階層の構造
Note
子デバイスには、入れ子になったトポロジ内のダウンストリーム デバイスまたはゲートウェイ デバイスを使用できます。
前提条件
IoT Edge デバイスの階層を作成するには、次のものが必要です。
- Azure IoT拡張機能 v0.10.6 以降がインストールされた Azure CLI v2.3.1 を使用するAzure Cloud Shellの Bash シェル。 このチュートリアルでは、Azure Cloud Shellを使用します。 Azure CLIモジュールと拡張機能の現在のバージョンを確認するには、az バージョンを実行します。
- Windows で Linux 用のAzure IoT Edgeを実行している 2 つのWindows デバイス。 外部仮想スイッチを使用して両方のデバイスをデプロイします。
ヒント
Windows ホスト OS でポート フォワーディングが設定されている場合は、internal または default 仮想スイッチを使用できます。 ただし、このチュートリアルをシンプルにするには、両方のデバイスに 外部 仮想スイッチを使用し、同じ外部ネットワークに接続します。
ネットワークの詳細については、「Windows ネットワーク上の Linux の Azure IoT Edge および linux on Windows のAzure IoT Edgeのネットワーク構成」を参照してください。
DMZ 内に EFLOW デバイスを設定する必要がある場合は、Windows 上の Linux 用 Azure IoT Edge および DMZ 構成を設定する方法 を参照してください。
- 有効なサブスクリプションを持つAzure アカウント。 Azure サブスクリプションがない場合は、開始する前に free アカウントを作成します。
- Azure の「フリー」または「スタンダード」レベルのIoT Hub。
- 最下位レイヤー デバイスを除くすべてのデバイスで、次のポートが受信用に開いていることを確認します:443、5671、8883:
- 443: REST API の呼び出しと Docker コンテナー イメージのプルのために、親と子のエッジ ハブの間で使用されます。
- 5671、8883: AMQP と MQTT に使用されます。
ヒント
EFLOW 仮想マシン ファイアウォールの詳細については、「Windows セキュリティ上の Linux のIoT Edgeを参照してください。
IoT Edge デバイス階層を作成する
IoT Edgeデバイスは階層のレイヤーを構成します。 このチュートリアルでは、top layer device と lower layer device の 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にrouteを宣言します。
deploymentLowerLayer.json サンプル ファイルをローカル コンピューターにダウンロードします。
下位レイヤー デバイスの配置マニフェストには、シミュレートされた温度センサー モジュールが含まれており、最上位レイヤー デバイスへのルートを宣言します。 systemModules セクション内で mcr.microsoft.com ではなく、$upstream:443 からプルするようにランタイム モジュールが設定されていることを確認できます。 lower レイヤー デバイスは、クラウドからイメージを直接プルできないため、Docker イメージ要求をポート 443 の IoT Edge API Proxy モジュールに送信します。 下位レイヤー デバイスにデプロイされたもう 1 つのモジュール、Simulated Temperature Sensor モジュールも、そのイメージ要求を に対して行います。
下位レイヤー配置マニフェストを作成する方法の詳細については、「階層を作成するデバイスAzure IoT Edgeを接続するを参照してください。
Azure Cloud Shellで、az iot edge devices create Azure CLI コマンドを使用して、階層内の各デバイスのIoT Hubおよび構成バンドルにデバイスを作成します。 以下のプレースホルダーは、適切な値に置き換えてください。
プレースホルダー 説明 ハブ名 IoT Hubの名前。 config-bundle-output-path 構成バンドルを保存するフォルダー パス。 親デバイス名 最上位レイヤーの親デバイス ID 名。 ペアレントデプロイメントマニフェスト 親デバイスの配置マニフェスト ファイル。 親-FQDNまたはIP 親デバイスの完全修飾ドメイン名 (FQDN) または IP アドレス。 子デバイス名 下位レイヤーの子デバイス ID 名。 子デプロイメントマニフェスト 子デバイスの配置マニフェスト ファイル。 子-fqdnまたは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.5" \ --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.5" \ --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.tgzファイルをそのデバイスにコピーします。
[管理者として実行] を使用して、管理者特権の PowerShell セッションを開始します。
parent-1.tgz を EFLOW VM にコピーします。
Copy-EflowVmFile -fromFile parent-1.tgz -toFile ~/ -pushFileEFLOW 仮想マシンに接続します
Connect-EflowVm構成バンドル アーカイブを抽出します。 たとえば、tar コマンドを使用して parent-1 アーカイブ ファイルを抽出します。
tar -xzf ./parent-1.tgzインストール スクリプトの実行アクセス許可を設定します。
chmod +x install.shinstall.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.tgz ファイルをデバイスにコピーします。
[管理者として実行] を使用して、管理者特権の PowerShell セッションを開始します。
child-1.tgz を EFLOW VM にコピーします。
Copy-EflowVmFile -fromFile child-1.tgz -toFile ~/ -pushFileEFLOW 仮想マシンに接続します
Connect-EflowVm構成バンドル アーカイブを抽出します。 たとえば、tar コマンドを使用して child-1 アーカイブ ファイルを抽出します。
tar -xzf ./child-1.tgzインストール スクリプトの実行アクセス許可を設定します。
chmod +x install.shinstall.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.5
前の手順を正しく完了した場合は、デバイスが正しく構成されていることを確認できます。 各デバイスの構成が正しいことを確認したら、続行することができます。
デバイス モジュールのデプロイ
デバイスのモジュール展開は、IoT Hubでデバイスが作成されたときに適用されました。 az iot edge devices create コマンドは、上位レイヤーと下位レイヤーのデバイスにデプロイ JSON ファイルを適用しました。 これらのデプロイが完了すると、lower レイヤー デバイスは、IoT Edge API Proxy モジュールを使用して、必要なイメージをプルします。
さらに、ランタイム モジュールIoT Edge Agent および IoT Edge Hubtop layer device は、Docker レジストリ モジュールと IoT Edge API Proxy モジュールを受け取ります。
Docker レジストリ モジュールは、既存のAzure Container Registryを指します。 この場合、 の参照先は Microsoft Container Registry です。 既定では、Docker レジストリはポート 5000 でリッスンします。
IoT Edge API Proxy モジュールは、HTTP 要求を他のモジュールにルーティングし、下位レイヤー デバイスがコンテナー イメージをプルしたり、BLOB をストレージにプッシュしたりできます。 このチュートリアルでは、その通信にポート 443 を使用しています。さらに、Docker コンテナー イメージのプル要求を、ポート 5000 で Docker レジストリ モジュールにルーティングするように構成されています。 また、Blob Storage のアップロード要求は、ポート 11002 で AzureBlobStorageonIoTEdge モジュールにルーティングされます。 IoT Edge API Proxy モジュールとその構成方法の詳細については、モジュールのハウツー ガイドを参照してください。
Azure ポータルまたはAzure Cloud Shellでこのようなデプロイを作成する方法については、ハウツー ガイドの「top layer device」セクションを参照してください。
次のコマンドを使用して、モジュールの状態を表示します。
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 で報告されたすべてのプロパティを表示します。 デバイスの状態を監視するための便利なプロパティには、 ランタイムの状態、 ランタイムの開始時刻、 ランタイムの最後の終了時刻、 ランタイムの再起動回数などがあります。
モジュールの状態は、Azure ポータルにも表示されます。 IoT Hubの Devices セクションに移動して、デバイスとモジュールを表示します。
生成されたデータを表示する
プッシュした Simulated Temperature Sensor モジュールは、サンプル環境データを生成します。 送信されるメッセージには、周囲の温度と湿度、機械の温度と圧力、タイムスタンプが含まれます。
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\"}"
}
}
トラブルシューティング
構成の確認やエラーのトラブルシューティングには、 コマンドを実行します。
ダウンストリーム デバイスがインターネットに直接アクセスできなくても、入れ子になった階層で を実行できます。
下位レイヤーから を実行すると、このプログラムは、ポート 443 を使用して親からイメージをプルしようとします。
sudo iotedge check --diagnostics-image-name $upstream:443/azureiotedge-diagnostics:1.5
の値は、レジストリ モジュールにリンクされたコンテナー レジストリからプルされます。 このチュートリアルでは、既定で に設定されます。
| 名前 | 値 |
|---|---|
REGISTRY_PROXY_REMOTEURL |
https://mcr.microsoft.com |
プライベート コンテナー レジストリを使用する場合は、すべてのイメージ (IoTEdgeAPIProxy、edgeAgent、edgeHub、Simulated Temperature Sensor、および診断) がコンテナー レジストリにあることを確認します。
ダウンストリーム デバイスに親デバイスとは異なるプロセッサ アーキテクチャがある場合は、適切なアーキテクチャ イメージを使用します。 接続されているレジストリを使用するか、ダウンストリーム デバイス config.toml ファイル内の edgeAgent モジュールと edgeHub モジュールの正しいイメージを指定します。 たとえば、親デバイスが ARM32v7 アーキテクチャで実行され、ダウンストリーム デバイスが AMD64 アーキテクチャで実行されている場合は、ダウンストリーム デバイス config.toml ファイルで一致するバージョンとアーキテクチャ イメージ タグを指定します。
[agent.config]
image = "$upstream:443/azureiotedge-agent:1.5.15-linux-amd64"
"systemModules": {
"edgeAgent": {
"settings": {
"image": "$upstream:443/azureiotedge-agent:1.5.15-linux-amd64"
},
},
"edgeHub": {
"settings": {
"image": "$upstream:443/azureiotedge-hub:1.5.15-linux-amd64",
}
}
}
リソースをクリーンアップする
課金を回避するために、この記事で作成したローカル構成とAzure リソースを削除できます。
リソースを削除するには、次の手順に従います。
Azure ポータル にサインインし、Resource グループ を選択します。
IoT Edgeテスト リソースを含むリソース グループの名前を選択します。
リソース グループに含まれるリソースの一覧を確認します。 それらすべてを削除する場合は、[ リソース グループの削除] を選択できます。 一部だけを削除する場合は、削除する各リソースを選択して個別に削除してください。
次のステップ
このチュートリアルでは、ゲートウェイとして 2 つのIoT Edge デバイスを構成し、一方を他方の親デバイスとして設定しました。 次に、IoT Edge API プロキシ モジュールを使用して、ゲートウェイを介してコンテナー イメージを子デバイスにプルする方法について説明しました。 詳細については、プロキシ モジュールの使用に関する使用法ガイドを参照してください。
ゲートウェイを使用して IoT Edge デバイスの階層レイヤーを作成する方法の詳細については、次の記事を参照してください。