対象:
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 標準に準拠しています。
このチュートリアルでは、IoT Edge デバイスの階層を作成し、IoT Edgeランタイム コンテナーをデバイスに展開し、デバイスをローカルで構成する方法について説明します。 このチュートリアルでは、次のタスクを実行します。
- IoT Edge デバイスの階層内のリレーションシップを作成して定義します。
- 階層内のデバイスでIoT Edge ランタイムを構成します。
- デバイス階層全体で一貫した証明書をインストールします。
- 階層内のデバイスにワークロードを追加します。
- IoT Edge API プロキシ モジュールを使用して、下位レイヤー デバイスから 1 つのポート経由で HTTP トラフィックを安全にルーティングします。
ヒント
このチュートリアルには、入れ子になったIoT Edge機能のショーケースを提供するための手動手順と自動化された手順の組み合わせが含まれています。
IoT Edge デバイスの階層の設定を完全に自動化する場合は、Industrial IoT サンプルのスクリプト化された Azure IoT Edge に従ってください。 このスクリプト化されたシナリオでは、Azure仮想マシンを事前構成済みデバイスとしてデプロイし、ファクトリ環境をシミュレートします。
IoT Edge デバイスの階層を作成して管理する手動手順の詳細を知りたい場合は、「IoT Edge デバイス ゲートウェイ階層に関するハウツーガイド」を参照してください。
このチュートリアルでは、以下のネットワーク レイヤーを定義します。
Top レイヤー: このレイヤー IoT Edgeデバイスはクラウドに直接接続できます。
レイヤー: 最上位レイヤーの下のレイヤーにあるIoT Edgeデバイスはクラウドに直接接続できません。 データを送受信するには、1 つ以上の中間IoT Edgeデバイスを経由する必要があります。
このチュートリアルでは、わかりやすくするために 2 つのデバイスから成る階層を採用しています。 最上位レイヤー デバイスは、階層の最上位レイヤーにあるデバイスを表します。これは、クラウドに直接接続できます。 このデバイスは 親デバイスと呼ばれます。 下位レイヤー デバイスは、階層の下位レイヤーにあるデバイスを表します。これは、クラウドに直接接続できません。 必要に応じて、運用環境を表すデバイスを追加します。 下位レイヤーのデバイスは 、子デバイスと呼ばれます。
2 つのデバイス (最上位レイヤー デバイスと下位レイヤー デバイス) が含まれるチュートリアルの階層の構造
Note
子デバイスには、入れ子になったトポロジ内のダウンストリーム デバイスまたはゲートウェイ デバイスを使用できます。
前提条件
IoT Edge デバイスの階層を作成するには、次のものが必要です。
インターネットに接続されているコンピューター (Windowsまたは Linux)。
有効なサブスクリプションを持つAzure アカウント。 Azure サブスクリプションがない場合は、開始する前に free アカウントを作成します。
無料レベルまたは標準レベルのIoT Hub(Azure)。
Azure Cloud Shell で Azure CLI と Azure IoT 拡張機能がインストールされた Bash シェルを使用する。 このチュートリアルでは、Azure Cloud Shellを使用します。 Azure CLIモジュールと拡張機能の現在のバージョンを確認するには、az バージョンを実行します。
階層を構成する 2 つの Linux デバイス。 使用できるデバイスがない場合は、IoT Edge Azure Resource Manager テンプレートを使用して、階層内の各デバイスにAzure仮想マシンを作成できます。 バージョン 1.5 IoT Edge、このResource Manager テンプレートにプレインストールされています。 独自のデバイスにIoT Edgeをインストールする場合は、「 Linux 用Azure IoT EdgeのインストールまたはUpdate IoT Edgeを参照してください。
デバイス間のネットワーク通信を簡略化するには、仮想マシンが同じ仮想ネットワーク上にあるか、仮想ネットワーク ピアリングを使用する必要があります。
最下位レイヤー デバイスを除くすべてのデバイスで、443、5671、8883 の各ポートが受信用に開放されていることを確認します。
- 443: REST API の呼び出しと Docker コンテナー イメージのプルのために、親と子のエッジ ハブの間で使用されます。
- 5671、8883: AMQP と MQTT に使用されます。
詳細については、「Azure ポータルを使用して仮想マシンへのポートを開く方法を参照してください。
ヒント
各仮想マシンの SSH ハンドルと FQDN (または IP アドレス) は、この後の手順の構成で使用するため、この情報を記録しておいてください。 IP アドレスと FQDN は、Azure ポータルで確認できます。 IP アドレスについては、仮想マシンの一覧に移動し、[パブリック IP アドレス] フィールドに注目します。 FQDN については、各仮想マシンの概要ページに移動し、[DNS 名] フィールドを探します。 SSH ハンドルについては、各仮想マシンの 接続ページに移動します。
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 レイヤー デバイスは、クラウドからイメージを直接プルできないため、ポート 443 の IoT Edge API Proxy モジュールに Docker イメージ要求を送信します。 下位レイヤー デバイスにデプロイされたもう 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 名。 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.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
コマンドを実行した後、出力ディレクトリでデバイス構成バンドルを見つけます。 次に例を示します。
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 ドライブ、Azure Key Vault などのサービス、または セキュア・ファイル・コピー などの関数を使用できます。 シナリオに最も適したいずれかの方法を選択してください。
たとえば、 parent-1 構成バンドルを parent-1 VM 上のホーム ディレクトリに送信するには、次の例のようなコマンドを使用できます。
scp ./output/parent-1.tgz admin@parent-1-vm.westus.cloudapp.azure.com:~各デバイスで、構成バンドル アーカイブを抽出します。 たとえば、tar コマンドを使用して parent-1 アーカイブ ファイルを抽出します。
tar -xzf ./parent-1.tgzインストール スクリプトの実行アクセス許可を設定します。
chmod +x install.sh各デバイスで、ルート アクセス許可を持つインストール スクリプトを実行して、構成バンドルを適用します。
sudo ./install.sh
デバイスの構成ファイルに対する変更の詳細については、「Azure IoT Edge デバイスを接続して階層を作成するを参照してください。
デバイスが正しく構成されていることを確認するには、デバイスで構成と接続チェックを実行します。
sudo iotedge check
admin@child-1-vm:~$ sudo iotedge check
Configuration checks (aziot-identity-service)
---------------------------------------------
√ keyd configuration is well-formed - OK
√ certd configuration is well-formed - OK
√ tpmd configuration is well-formed - OK
√ identityd configuration is well-formed - OK
√ daemon configurations up-to-date with config.toml - OK
√ identityd config toml file specifies a valid hostname - OK
√ host time is close to reference time - OK
√ preloaded certificates are valid - OK
√ keyd is running - OK
√ certd is running - OK
√ identityd is running - OK
√ read all preloaded certificates from the Certificates Service - OK
√ read all preloaded key pairs from the Keys Service - OK
√ check all EST server URLs utilize HTTPS - OK
√ ensure all preloaded certificates match preloaded private keys with the same ID - OK
Connectivity checks (aziot-identity-service)
--------------------------------------------
√ host can connect to and perform TLS handshake with iothub AMQP port - OK
√ host can connect to and perform TLS handshake with iothub HTTPS / WebSockets port - OK
√ host can connect to and perform TLS handshake with iothub MQTT port - OK
Configuration checks
--------------------
√ aziot-edged configuration is well-formed - OK
√ configuration up-to-date with config.toml - OK
√ container engine is installed and functional - OK
√ configuration has correct parent_hostname - OK
√ configuration has correct URIs for daemon mgmt endpoint - OK
√ container time is close to host time - OK
‼ DNS server - Warning
Container engine is not configured with DNS server setting, which may impact connectivity to IoT Hub.
Please see https://aka.ms/iotedge-prod-checklist-dns for best practices.
You can ignore this warning if you are setting DNS server per module in the Edge deployment.
‼ production readiness: logs policy - Warning
Container engine is not configured to rotate module logs which may cause it run out of disk space.
Please see https://aka.ms/iotedge-prod-checklist-logs for best practices.
You can ignore this warning if you are setting log policy per module in the Edge deployment.
‼ production readiness: Edge Agent's storage directory is persisted on the host filesystem - Warning
The edgeAgent module is not configured to persist its /tmp/edgeAgent directory on the host filesystem.
Data might be lost if the module is deleted or updated.
Please see https://aka.ms/iotedge-storage-host for best practices.
‼ production readiness: Edge Hub's storage directory is persisted on the host filesystem - Warning
The edgeHub module is not configured to persist its /tmp/edgeHub directory on the host filesystem.
Data might be lost if the module is deleted or updated.
Please see https://aka.ms/iotedge-storage-host for best practices.
√ Agent image is valid and can be pulled from upstream - OK
√ proxy settings are consistent in aziot-edged, aziot-identityd, moby daemon and config.toml - OK
Connectivity checks
-------------------
√ container on the default network can connect to upstream AMQP port - OK
√ container on the default network can connect to upstream HTTPS / WebSockets port - OK
√ container on the IoT Edge module network can connect to upstream AMQP port - OK
√ container on the IoT Edge module network can connect to upstream HTTPS / WebSockets port - OK
30 check(s) succeeded.
4 check(s) raised warnings. Re-run with --verbose for more details.
2 check(s) were skipped due to errors from other checks. Re-run with --verbose for more details.
最上位レイヤー デバイスに、いくつかの合格チェックを含む出力が表示されます。 ログ ポリシーと、ネットワークによっては DNS ポリシーに関するいくつかの警告が表示される場合があります。
デバイス モジュールのデプロイ
デバイスのモジュール展開は、IoT Hubでデバイスを作成するときに適用されます。 az iot edge devices create コマンドは、上位層と下位層のデバイスのデプロイ JSON ファイルを適用します。 デプロイが完了すると、lower レイヤー デバイスは、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 セクションに移動して、デバイスとモジュールを確認します。
生成されたデータを表示する
シミュレートされた温度センサー モジュールは、サンプル環境データを生成します。 送信されるメッセージには、周囲の温度と湿度、機械の温度と圧力、タイムスタンプが含まれます。
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 を介してイメージをプルします。
値は、レジストリ モジュールにリンクされているコンテナー レジストリから取得されます。 このチュートリアルでは、既定で に設定されます。
| 名前 | 値 |
|---|---|
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.0-linux-amd64"
"systemModules": {
"edgeAgent": {
"settings": {
"image": "$upstream:443/azureiotedge-agent:1.5.0-linux-amd64"
},
},
"edgeHub": {
"settings": {
"image": "$upstream:443/azureiotedge-hub:1.5.0-linux-amd64",
}
}
}
リソースをクリーンアップする
課金を回避するために、この記事で作成したローカル構成とAzure リソースを削除できます。
リソースを削除するには、次の手順に従います。
Azure ポータル にサインインし、Resource グループ を選択します。
IoT Edgeテスト リソースを含むリソース グループの名前を選択します。
リソース グループに含まれるリソースの一覧を確認します。 それらすべてを削除する場合は、[リソース グループの削除] を選択します。 一部だけを削除する場合は、削除する各リソースを選択して個別に削除してください。
次のステップ
このチュートリアルでは、ゲートウェイとして 2 つのIoT Edge デバイスを構成し、一方を他方の親デバイスとして設定しました。 次に、IoT Edge API プロキシ モジュールを使用して、ゲートウェイを介してダウンストリーム デバイスにコンテナー イメージをプルしました。 詳細については、プロキシ モジュールの使用に関する使用法ガイドを参照してください。
ゲートウェイを使用して IoT Edge デバイスの階層レイヤーを作成する方法の詳細については、次の記事を参照してください。