概要
rc3
バージョンが出たので更新しました。
弊社のWeDXソリューション(IoT Edge Devices Management)の機能アップグレードしているどころでAzure IoT Edge Runtime v1.2の新機能、Nested Edgeを紹介したいと思います。
現在、Public Previewであるため、GAになる時点で仕様が変わるかもしれないので、ご注意してください。
Private Preview時のブログです。
https://azure.microsoft.com/en-us/updates/iot-edge-nested-edge/
上記の図のようにAzure IoT HubサービスではIoT Edgeゲートウェイという、ネットワーク上の他のデバイスとIoT Hub間でコネクションを提供していました。ダウンストリームデバイス(子デバイス)は直接IoT Hubに接続せずにIoT Edgeゲートウェイに介してIoT Hubと通信できる機能でした。
ただ、条件がありダウンストリームデバイスはEdge Deviceを使えないことがありました。
今回バージョンアップすることで下記の図のように変更できます。
Edgeデバイスをダウンストリーデバイスとして使えないことが解除され、使えるようになりました。そしてレイヤー構造で5世代まで接続できるようになりました。これはAzure IoT Edge基盤のコンテナーをよく活用したと思います。
最上位レイヤーのエッジデバイスのみクラウドに接続して他の各レイヤーのダウンストリームデバイス(子デバイス)はクラウドに接続せずに上位レイヤーの中継(プロキシ)により、通信できる仕組みです。
このネットワーク環境は産業用ネットワークであるISA-95に準拠しているらしいので、ネットワークレイアにより分離されている現場で活用できそうです。
検証はレイヤーをフルで確認すると手順が複雑なのでレイヤーを二つ用意して親と子関係で説明していきたいと思います。
前準備
- VM 2台 (ParallelsのVMで2台作成します)
- Azure IoT Hub
Edge Device 2台 作成
Azure IoT HubにアクセスしてEdge Deviceを2台作成します。
親エッジデバイス
「edge-test-parent」名でデフォルトで作成します。
子エッジデバイス
「edge-test-child」名のデフォルトで作成しますが、Parent device項目で親エッジデバイスを指定します。
VM作成とOSインストール
Parallelsで共有ネットワークベースでVMを二つ作成します。
Ubuntu 18.04 LTSをOSインストールします。
親エッジデバイスと子エッジデバイス
# 関連パッケージインストール
sudo apt-get update
sudo apt install git curl net-tools
# IP確認
ip addr show | grep inet
証明書作成とコピー
ゲートウェイとダウンストリームデバイス間はセキュリティで保護された公開キー基盤(PKI)が使用されるので、X.509証明書が必要ですが、テスト向け証明書を作成します。
親エッジデバイス
# IoT Edgeリポジトリクローンと作業用ディレクトリ作成
cd $HOME
mkdir -p WORK && cd WORK
git clone https://github.com/Azure/iotedge.git
# 構成ファイルとスクリプトファイルコピー
cp ./iotedge/tools/CACertificates/*.cnf .
cp ./iotedge/tools/CACertificates/certGen.sh .
# ルートCA証明書作成
./certGen.sh create_root_and_intermediate
# ルートCA証明書確認
ls -l ./certs/azure-iot-test-only.root.ca.cert.pem
# エッジデバイスCA証明書作成
./certGen.sh create_edge_device_ca_certificate "parent-device"
./certGen.sh create_edge_device_ca_certificate "child-device"
# エッジデバイスCA証明書確認
ls -l ./certs/iot-edge-device-*-full-chain.cert.pem
ls -l ./private/iot-edge-device-*.key.pem
# 証明書コピー(親エッジ向け)
cp ./certs/azure-iot-test-only.root.ca.cert.pem $HOME
cp ./certs/iot-edge-device-ca-parent-device-full-chain.cert.pem $HOME
cp ./private/iot-edge-device-ca-parent-device.key.pem $HOME
# 証明書コピー(子エッジ向け)
scp ./certs/azure-iot-test-only.root.ca.cert.pem <子エッジデバイスのユーザー名>@<子エッジデバイスのIP>:/home/<子エッジデバイスのユーザー名>
scp ./certs/iot-edge-device-ca-child-device-full-chain.cert.pem <子エッジデバイスのユーザー名>@<子エッジデバイスのIP>:/home/<子エッジデバイスのユーザー名>
scp ./private/iot-edge-device-ca-child-device.key.pem <子エッジデバイスのユーザー名>@<子エッジデバイスのIP>:/home/<子エッジデバイスのユーザー名>
# ルートCA証明書インストール
sudo cp $HOME/azure-iot-test-only.root.ca.cert.pem /usr/local/share/ca-certificates/azure-iot-test-only.root.ca.cert.pem.crt
sudo update-ca-certificates
子エッジデバイス
# ルートCA証明書インストール
sudo cp $HOME/azure-iot-test-only.root.ca.cert.pem /usr/local/share/ca-certificates/azure-iot-test-only.root.ca.cert.pem.crt
sudo update-ca-certificates
IoT Edge Runtimeインストール
親エッジデバイスと子エッジデバイス
# リポジトリ構成をインストール
curl https://packages.microsoft.com/config/ubuntu/18.04/multiarch/prod.list > ./microsoft-prod.list
sudo mv ./microsoft-prod.list /etc/apt/sources.list.d/
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv ./microsoft.gpg /etc/apt/trusted.gpg.d/
# コンテナーエンジンインストール
sudo apt-get update
sudo apt-get install moby-engine
# Azure IoT Runtimeインストール
curl -L https://github.com/Azure/azure-iotedge/releases/download/1.2.0-rc1/libiothsm-std_1.2.0_rc1-1_ubuntu16.04_amd64.deb -o libiothsm-std.deb
sudo dpkg -i ./libiothsm-std.deb
curl -L https://github.com/Azure/azure-iotedge/releases/download/1.2.0-rc1/iotedge_1.2.0_rc1-1_ubuntu16.04_amd64.deb -o iotedge.deb
sudo dpkg -i ./iotedge.deb
IoT Edge Runtime 構成
親エッジデバイス
sudo vi /etc/iotedge/config.yaml
「provisioning」のdevice_connection_stringをAzure IoT Hubで作成した親エッジデバイスのConnection Stringで書き換えします。
# Manual provisioning configuration using a connection string
provisioning:
source: "manual"
device_connection_string: "HostName=********.azure-devices.net;DeviceId=edge-test-parent;SharedAccessKey=***************************"
dynamic_reprovisioning: false
「certificates」の証明書セッションにホームディレクトリにコピーした証明書のパス情報で書き換えます。
certificates:
device_ca_cert: "/home/<親エッジデバイスのユーザー名>/iot-edge-device-ca-parent-device-full-chain.cert.pem"
device_ca_pk: "/home/<親エッジデバイスのユーザー名>/iot-edge-device-ca-parent-device.key.pem"
trusted_ca_certs: "/home/<親エッジデバイスのユーザー名>/azure-iot-test-only.root.ca.cert.pem"
「hostname」セッションは親エッジデバイスのIPで書き換えます。
hostname: "<親エッジデバイスのIP>"
「agent」セッションのimage項目をIoT Edge エージェントイメージのPublic Previewバージョンを指定します。
agent:
name: "edgeAgent"
type: "docker"
env: {}
config:
image: "mcr.microsoft.com/azureiotedge-agent:1.2.0-rc3"
auth: {}
デーモンを再起動します。
sudo systemctl restart iotedge
しばらく待ってからiotedge list
のコマンドで確認すると$edgeAgent
のシステムモジュールが動いていることを確認できます。
子エッジデバイス
sudo vi /etc/iotedge/config.yaml
「provisioning」のdevice_connection_stringをAzure IoT Hubで作成した子エッジデバイスのConnection Stringで書き換えします。
# Manual provisioning configuration using a connection string
provisioning:
source: "manual"
device_connection_string: "HostName=********.azure-devices.net;DeviceId=edge-test-child;SharedAccessKey=***************************"
dynamic_reprovisioning: false
「certificates」の証明書セッションにホームディレクトリにコピーした証明書のパス情報で書き換えます。
certificates:
device_ca_cert: "/home/<子エッジデバイスのユーザー名>/iot-edge-device-ca-child-device-full-chain.cert.pem"
device_ca_pk: "/home/<子エッジデバイスのユーザー名>/iot-edge-device-ca-child-device.key.pem"
trusted_ca_certs: "/home/<子エッジデバイスのユーザー名>/azure-iot-test-only.root.ca.cert.pem"
「hostname」セッションは子エッジデバイスのIPで書き換えます。
hostname: "<子エッジデバイスのIP>"
「parent_hostname」セッションは親エッジデバイスのIPで書き換えます。
parent_hostname: "<親エッジデバイスのIP>"
「agent」セッションのimage項目を親エッジデバイスに対してIoT Edge エージェントイメージのPublic Previewバージョンを指定します。
agent:
name: "edgeAgent"
type: "docker"
env: {}
config:
image: "<親エッジデバイスのIP>:8000/azureiotedge-agent:1.2.0-rc3"
auth: {}
デーモンを再起動します。
sudo systemctl restart iotedge
デーモンを再起動してもまだ何も変わらないです。親デバイスのプロキシモジュールがデプロイされたら動き始めます。
親エッジデバイスへモジュールデプロイ
Azureポータル > IoT Hub > Automatic Device Management > IoT Edge > 親エッジデバイス > Set modules 順でクリックします。
Runtime Settings
Edge Hub の Image項目を下記のイメージで修正します。
mcr.microsoft.com/azureiotedge-hub:1.2.0-rc3
Edge Hub の Environment Variables項目で環境変数二つを追加します。
experimentalFeatures__enabled
experimentalFeatures__nestedEdgeEnabled
Edge Agent の Image項目を下記のイメージで修正します。
mcr.microsoft.com/azureiotedge-agent:1.2.0-rc3
Saveします。
IoT Edge モジュール 追加
Add > IoT Edge Module して下記の図のように追加します。
下位レイヤーにあるすべてのIoT Edgeデバイスに代わってコンテナーイメージを取得してキャッシュする役割を担います。
IoT Edge Module Name : registry
Image URI : registry:latest
REGISTRY_PROXY_REMOTEURL https://mcr.microsoft.com
{
"HostConfig": {
"PortBindings": {
"5000/tcp": [
{
"HostPort": "5000"
}
]
}
}
}
Add > Marketplace Module > IoT Edge API Proxyを追加します。
このモジュールはNginxリバースプロキシを使用し、ネットワークレイヤーを介してHTTPデータをルーティングします。
「Review + Create」して親エッジデバイスにデプロイします。
デプロイ後、親エッジデバイスでモジュールを確認してみます。
user@edge-test-parent:~$ iotedge list
NAME STATUS DESCRIPTION CONFIG
IoTEdgeAPIProxy running Up a minute mcr.microsoft.com/azureiotedge-api-proxy:latest
edgeAgent running Up 11 minutes mcr.microsoft.com/azureiotedge-agent:1.2.0-rc3
edgeHub running Up a minute mcr.microsoft.com/azureiotedge-hub:1.2.0-rc3
registry running Up a minute registry:latest
子デバイスでiotedge list
で確認してみると$edgeAgent
のシステムモジュールが動いていることを確認できます。
子エッジデバイスへモジュールデプロイ
Azureポータル > IoT Hub > Automatic Device Management > IoT Edge > 親エッジデバイス > Set modules 順でクリックします。
Runtime Settings
Edge Hub の Image項目を下記のイメージで修正します。
$upstream:8000/azureiotedge-hub:1.2.0-rc3
Edge Hub の Environment Variables項目で環境変数二つを追加します。
experimentalFeatures__enabled
experimentalFeatures__nestedEdgeEnabled
Edge Agent の Image項目を下記のイメージで修正します。
$upstream:8000/azureiotedge-agent:1.2.0-rc3
Saveします。
IoT Edge モジュール 追加
Add > Marketplace Module > Simulated Temperature Sensorを追加し、イメージURLを変更します。
$upstream:8000/azureiotedge-simulated-temperature-sensor:1.0
「Review + Create」して親エッジデバイスにデプロイします。
デプロイ後、子エッジデバイスでモジュールを確認してみます。
user@edge-test-child:~$ iotedge list
NAME STATUS DESCRIPTION CONFIG
SimulatedTemperatureSensor running Up 2 hours 10.211.55.2:8000/azureiotedge-simulated-temperature-sensor:1.0
edgeAgent running Up 2 hours 10.211.55.2:8000/azureiotedge-agent:1.2.0-rc3
edgeHub running Up 2 hours 10.211.55.2:8000/azureiotedge-hub:1.2.0-rc3
ここまですると、子エッジデバイスのテレメトリ情報が親エッジデバイスを経由してAzure IoT Hubに流れていることが確認できます。
ネットワーク構造変更
親エッジデバイスの既存NICをホストオンリーネットワーク(Private Network)に変更してブリッジネットワーク(Public Network)向けNICを追加します。
子エッジデバイスの既存NICをホストオンリーネットワーク(Private Network)に変更します。
この構成で子エッジデバイスはPrivate Netowork内で位置しているため、クラウドに接続できない状態です。
IoT Edge Runtime 構成修正
親エッジデバイス
sudo vi /etc/iotedge/config.yaml
「hostname」セッションは親エッジデバイスのIP(PrivateNetwork)で書き換えます。
hostname: "<親エッジデバイスのIP>"
デーモンを再起動します。
sudo systemctl restart iotedge
子エッジデバイス
sudo vi /etc/iotedge/config.yaml
「hostname」セッションは子エッジデバイスのIP(PrivateNetwork)で書き換えます。
hostname: "<子エッジデバイスのIP>"
「parent_hostname」セッションは親エッジデバイスのIP(PrivateNetwork)で書き換えます。
parent_hostname: "<親エッジデバイスのIP>"
「agent」セッションのimage項目を親エッジデバイスに対してIoT Edge エージェントイメージのPublic Previewバージョンを指定します。
agent:
name: "edgeAgent"
type: "docker"
env: {}
config:
image: "<親エッジデバイスのIP(PrivateNetwork)>/azureiotedge-agent:1.2.0-rc3"
auth: {}
デーモンを再起動します。
sudo systemctl restart iotedge
Visual Studio Codeでモニタリングすると子エッジデバイスからのテレメトリ情報が問題なく流れていることが確認できます。
完成図
まとめ
色々手順を実行しなければいけないですが、セイキュリティーで保護された接続でレイヤー構造でダイレクトメッセージのようなIoT Hubプリミティブとやモジュール管理ができるようになったので、期待している機能です。そして弊社のWeDXソリューション(IoT Edge Devices Management)にも簡単に制御できるように機能搭載して更新予定ですので、ご確認いただけますと幸いです。