はじめに
EFLOW(Azure IoT Edge for Linux on Windows) が 2021 年 6 月に一般公開(GA)されました。
Azure IoT Edge for Linux now generally available
EFLOW では、Windows マシン上で Linux 仮想マシンを実行します。
これにより、Linux コンテナの Azure IoT Edge モジュールを Windows の IoT デバイスで動作させられるため、IoT デバイスの選択肢が広がります。
今回は Windows マシンとして Azure VM を選択し、EFLOW 環境を構築してみました。
想定読者
- Azure IoT Edge を利用し、Windows IoT デバイス上で分析やビジネスロジックを実行したい方
- Hyper-V による仮想化に興味がある方
Azure VM の準備
今回は Azure 仮想マシンの作成については割愛します。
Azure Portal から Windows 仮想マシンを作成する手順については、下記のリンクを参照ください。
クイック スタート:Azure Portal で Windows 仮想マシンを作成する
システム要件
EFLOW に必要な Windows デバイスの最小要件はこちらで参照できます。
- 共通の要件
- Windows 10 バージョン 1809 以降、ビルド 17763 以降
- Professional、Enterprise、または Server エディション
- 最小空きメモリ容量:1 GB
- 最小空きディスク領域:10 GB
上記のほかに、Windows10/Windows Server/VM の中からどれを採用するかによって、個別のシステム要件を満たす必要があります。
- 個別の要件
- Windows 10:有効化された Hyper-V
- Windows Server:Hyper-V ロールのインストールとネットワークスイッチ
- VM:入れ子になった仮想化の構成
今回は VM を採用するため、入れ子になった仮想化と呼ばれる構成が必要となります。
入れ子になった仮想化
入れ子になった仮想化とは、Hyper-V 上で動作している VM で、さらに Hyper-V を利用して VM を起動する構成のことです。
Hyper-V は CPU の拡張機能に依存して仮想マシンを実行しています。
Intel VT-x や AMD-V などが代表的です。
一般的に、この仮想化のための拡張機能は、Hyper-V で使用している間は他のプロセスで使用できません。
そこで、その制限を解消して VM 上でも Hyper-V を利用できるようになった構成が「入れ子になった仮想化」というわけです。
出典:Azure IoT Edge for Linux on Windows (EFLOW)
Azure VM は Hyper-V で仮想化されたインスタンスであるため、今回のケースのように Azure VM の中で Hyper-V を利用するには、入れ子になった仮想化をサポートするインスタンスを選択する必要があります。
入れ子になった仮想化がサポートされる Azure VM のサイズは、Azure コンピューティング ユニット (ACU)で確認できます。
今回は Standard_D4s_v4 のインスタンスを選択しました。
詳細は以下のリンクをご参照ください。
EFLOW 環境の構築
MS Docs のチュートリアルに従って、Azure VM に EFLOW 環境を構築します。
システム要件を満たすインスタンスを選択していれば、特に問題なくデプロイできるかと思いますが、前述した入れ子になった仮想化がサポートされていないインスタンスを選択した場合、EFLOW のデプロイを作成する際に以下のエラーが検出されます。
Hyper-V core services not running (vmms, vmcompute, hvhost). Please ensure Hyper-V is configured properly and capable of starting virtual machines. As you are deploying inside a virtual machine, please ensure nested virtualization is enabled. (L4573)
詳細な作業手順はこちらの記事が非常にわかりやすいです。
Azure IoT Edge モジュールのデプロイ
無事に EFLOW 環境を構築できたら、実際に IoT Edge モジュールをデプロイして動作を確認してみます。
今回は、Azure Marketplace からデプロイできる Simulated Temperature Sensor と MS Docs で公開されている Python カスタムコードモジュールの 2 つを IoT Edge デバイスにデプロイしました。
Simulated Temperature Sensor
架空の機械温度/湿度/気圧の測定値を生成するモジュールです。
時間経過で気温が上昇するようになっており、異常検出のチュートリアルでよく利用されています。
Azure Portal からデプロイする場合、IoT Hub から IoT Edge デバイスを選択し、IoT Edge モジュールの設定から追加します。
検索バーに Simulated...と入力していくとサジェストされるので、選択して追加します。
Python カスタムコードモジュール
IoT Edge では、任意の処理を実行するモジュールを作成し、デバイスにデプロイすることが可能です。
今回は、上述の Simulated Temperature Sensor で生成される温度が 25℃ を超えた場合に、そのデータを IoT Hub に送信するモジュールをデプロイしました。
こちらのチュートリアル通りに進めることで、モジュールの作成、コンテナの build & push、IoT Edge デバイスへのデプロイを VS Code 上で完結できます。
モジュール名はなんでもいいのですが、今回は PythonModule としました。
動作確認
EFLOW 環境に入り、iotedge list
で 2 つの IoT Edge モジュールがデプロイされているか確認します。
iotedge logs モジュール名
を実行し、各モジュールからのログを確認します。
最後に、IoT Hub に到達するメッセージを確認します。
Simulated Temperature Sensor で生成されたデータが PythonModule でフィルタリングされ、25℃ 以上のデータが送信されています。
まとめ
今回は一般公開された EFLOW 環境を Azure VM 上に構築し、一般のシステム要件に加えて入れ子になった仮想化のサポートが必要であることを確認しました。
今後は EFLOW 環境の強みである、Windows アプリケーションとの連携や Linux ディストリビューションでの開発を中心に調査を進めていきます。