5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Azure IoT Edge Runtime 1.2 新機能のご紹介 - Nested Edge

Last updated at Posted at 2020-12-26

概要

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/
image.png
上記の図のようにAzure IoT HubサービスではIoT Edgeゲートウェイという、ネットワーク上の他のデバイスとIoT Hub間でコネクションを提供していました。ダウンストリームデバイス(子デバイス)は直接IoT Hubに接続せずにIoT Edgeゲートウェイに介してIoT Hubと通信できる機能でした。
ただ、条件がありダウンストリームデバイスはEdge Deviceを使えないことがありました。

今回バージョンアップすることで下記の図のように変更できます。
image.png
Edgeデバイスをダウンストリーデバイスとして使えないことが解除され、使えるようになりました。そしてレイヤー構造で5世代まで接続できるようになりました。これはAzure IoT Edge基盤のコンテナーをよく活用したと思います。

最上位レイヤーのエッジデバイスのみクラウドに接続して他の各レイヤーのダウンストリームデバイス(子デバイス)はクラウドに接続せずに上位レイヤーの中継(プロキシ)により、通信できる仕組みです。
このネットワーク環境は産業用ネットワークであるISA-95に準拠しているらしいので、ネットワークレイアにより分離されている現場で活用できそうです。

検証はレイヤーをフルで確認すると手順が複雑なのでレイヤーを二つ用意して親と子関係で説明していきたいと思います。
image.png

前準備

  • 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インストールします。

image.png

親エッジデバイスと子エッジデバイス

# 関連パッケージインストール
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

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デバイスに代わってコンテナーイメージを取得してキャッシュする役割を担います。

image.png

IoT Edge Module Name : registry
Image URI : registry:latest

image.png

REGISTRY_PROXY_REMOTEURL https://mcr.microsoft.com

image.png

{
  "HostConfig": {
    "PortBindings": {
      "5000/tcp": [
        {
          "HostPort": "5000"
        }
      ]
    }
  }
}

Add > Marketplace Module > IoT Edge API Proxyを追加します。
このモジュールはNginxリバースプロキシを使用し、ネットワークレイヤーを介してHTTPデータをルーティングします。

image.png

「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

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

image.png

image.png

「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内で位置しているため、クラウドに接続できない状態です。

image.png

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でモニタリングすると子エッジデバイスからのテレメトリ情報が問題なく流れていることが確認できます。

image.png

完成図

image.png

まとめ

色々手順を実行しなければいけないですが、セイキュリティーで保護された接続でレイヤー構造でダイレクトメッセージのようなIoT Hubプリミティブとやモジュール管理ができるようになったので、期待している機能です。そして弊社のWeDXソリューション(IoT Edge Devices Management)にも簡単に制御できるように機能搭載して更新予定ですので、ご確認いただけますと幸いです。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?