Azure IoT Edge for Linux on Windows (EFLOW) のご紹介

# 概要

先月、Linux用のAzure IoT EdgeをWindowsマシンで動作するAzure IoT Edge for Linux on Windowsがアナウンスされ、Public previewとしてサービス開始されました。略としてEFLOWと呼ばれ、イフローで発音しているようです。
やっと、時間を作って体験させていただきましたので、ご紹介いたします。
これでAzure IoT Edgeを運用するため、WindowsとLinuxのどちらかの選択について悩む必要がなくなりそうです。

- [Microsoft Tech Community](https://techcommunity.microsoft.com/t5/internet-of-things/enabling-linux-based-azure-iot-edge-modules-on-windows-iot/ba-p/2075882)
- [Internet of Thinks Show](https://channel9.msdn.com/Shows/Internet-of-Things-Show/Run-Linux-based-IoT-Edge-modules-on-Windows-IoT)
- [Azure IoT Edge の EFLOW Docs](https://docs.microsoft.com/en-us/azure/iot-edge/iot-edge-for-linux-on-windows?view=iotedge-2018-06)

## EFLOWの構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/823c0614-5887-3fdd-f8b2-ba11a1eb90b7.png)

Azure IoT EdgeはHypervisorの基盤で[CBL-Mariner](https://github.com/microsoft/CBL-Mariner)というMicrosoftさんが公開したLinuxディストリビューションが仮想マシンとして動作します。
管理はWindows Admin Centerの方で行われてWindowsとCBL Mariner Linux間双方通信しているようです。

## EFLOWのシステム要件 (Preview)

- Windows 10 バージョン 1809 以上 (Pro, Enterprise, Server)
- vCPU : 4 以上
- Memory : 2GB 以上

インストールスクリプトの方で、システム要件をチェックします。
クラウドで仮想マシンで動作確認する場合、TPMサポートを確認してください。インストールスクリプトでTPMを無効化するロジックあり、そこでエラーになるケースがあるようです。私もローカルで動作確認しました。

# EFLOW 環境のセットアップ

## Windows Insider Program 登録とダウンロード

Public Preview版をダウンロードするには[Microsoft Insider Programの登録](https://insider.windows.com/en-us/)が必要です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/e5a9b48e-1c07-14d5-8c8a-c56892287827.png" width="600px">

登録を終えたら、[Windows Server Insider Previewページ](https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewserver)にアクセスします。

Microsoft Server Previewsの選択リストから「Windows Admin Center Preview - Build 2012」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/fda59534-9ed4-bef4-1b11-90ac8d5bd8d9.png)

言語は「English」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/7551ee76-0140-e334-80a4-525ef292a850.png" width="400px">

ダウンロードします。
約70MBなどで、すぐにダウンロードできます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/91b3129c-7daf-4dbb-43a3-6d197cba5007.png" width="500px">

## Windows Admin Center インストール

ダウンロードしたファイルを実行してWindows Admin Center (Preview版)をインストールします。デフォルト設定のままでインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/e878de66-24f0-e2df-9295-b39dcc1f9fea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/c3380798-0f85-63a5-5dc1-284e4faa4d7a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/899c5fa6-100b-cf44-f023-a889a4eeb4e9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/5460af94-35a6-33c3-a0cb-117d894ae1b5.png)

# Azure IoT Edge Extensions インストール

Windows Admin Centerを起動します。
Windows Admin Centerはウェブアプリとして動作します。最初アクセス時は証明書選択画面が現れるので、デフォルトの選択された証明書でOKします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/69111ce7-9a16-4d30-85ac-27da444441c5.png)

右上のギアアイコンをクリックしてSettings画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/30ccae74-d951-d9cc-0cb0-a43cdbf8e4d4.png)

左メニューでGatewayのExtensionsをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/9032bd1e-51c9-47f9-bffc-2e3dc4ee203d.png)

FeedsのタブメニューをクリックしてAddをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/db20784f-8fbf-cdf8-2bd3-56e13256baa9.png)

下記のFeed URLを追加します。

```
https://aka.ms/wac-insiders-feed
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/b3abb78a-642f-a6c9-2603-d697936f1998.png" width="500px">

反映されるまで少し待ちます。（５秒？）
Available extensionsのタブメニューをクリックして「Azure IoT Edge」で検索するとインストール対象の「Azure IoT Edge」が現れます。
インストールをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/03439dba-73f3-b22a-5e16-03b72991cbd6.png)

インストールが完了されたら、Installed extensionsタブメニューから「Azure IoT Edge」を検索するとインストール確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/946f50d6-b0e0-b363-b31c-16176b2f9601.png)

## Azure IoT Edge セットアップ

ここからがAzure IoT Edgeをセットアップする手順となります。方法は二つあります。
Windows Admin Centerで行われる手順とPowerShellで行われる手順です。
両方とも良いどころがありますが、PowerShellの方が手順をまとめやすいのでスクリプトでセットアップします。

PowerShellを管理者モードで実行します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/fbfdacb5-8e30-29c3-3644-ab650a540db9.png" width="400px">

```powershell
# Azure IoT Edgeインストーラーファイルをダウンロードします。
$msiPath = $([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest "https://aka.ms/AzureEdgeForLinuxOnWindowsMSI" -OutFile $msiPath

# インストーラーファイルを実行します。
Start-Process -Wait msiexec -ArgumentList "/i","$([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))","/qn"

# PowerShellの実行ポリシーを確認します。
Get-ExecutionPolicy -List

# PowerShellの実行ポリシーで local machine が AllSigned になってなければ権限を付与します。
Set-ExecutionPolicy -ExecutionPolicy AllSigned -Force

# EFLOW環境を作成します。
Deploy-Eflow
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/e32aec52-5683-68c9-8e63-396662ae8348.png)

Deploy-Eflow実行時に一回再起動が必要なので、再起動されたら、再度Deploy-Eflowを実行してください。

```powershell
# 再起動後、PowerShellプロンプト上で再度、実行します。
Deploy-Eflow
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/ef59c121-c347-8bff-cf2f-e22f41d1ca49.png)

Deployment successfulが見えたら、EFLOW環境作成完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/5e163cf2-6876-9f2f-60ca-ee493256c08b.png)

## デバイスのプロビジョンニング

Azure IoT Hubからデバイスを生成し、作成したEFLOWにプロビジョンニングしますが、方式によってコマンドが異なります。最も簡単なConnection Stringで接続してみます。
ここからは弊社のAzure IoT Edge管理ソリューション [WeDX Server](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/1604376875527.wedx-iot-edge-devices-management?tab=Overview) を並行で使って確認を行います。
Primary Connection Stringの文字列をPowerShellのCONNECTION_STRING_HEREに書き換えて実行します。

```powershell
Provision-EflowVm -provisioningType manual -devConnString "<CONNECTION_STRING_HERE>"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/2971d51b-9934-7f0d-4eb7-677cdad18ffb.png)

プロビジョンニングが完了されたら、SSH接続で初期モジュールを確認してみます。

```powershell
Ssh-EflowVm
```
```bash
sudo iotedge list
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/80208fbe-5ffb-ebd2-1327-0fce3fe8369c.png)

プロビジョンニングまでできました。
これで、Linux用のAzure IoT Edgeモジュールをデプロイして使えば良いです。

# Azure IoT Edgeモジュール確認

モジュールデプロイはDevelopment Manifestをデプロイしなければいけないですが、こちらで触れることは手順が長くなってしまいますので、弊社のAzure IoT Edge管理ソリューション [WeDX Server](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/1604376875527.wedx-iot-edge-devices-management?tab=Overview) でデプロイすることとします。

## SimulatedTemperatureSensor

Azure IoT Edge版のHelloworldである、SimulatedTemperatureSensorをでデプロイしてみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/87a762ff-f1f2-a885-b058-5f221aae5429.png" width="400px">

問題なく、デプロイされてシミュレーションされたテレマトリを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/9a955af6-5ca3-7074-affb-27cd0a947445.png)

## Node-RED

[Node-RED on IoT Edge](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/1604376875527.wedx-iot-edge-nodered?tab=Overview)をデプロイしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/95dcf24e-e7a9-d61f-9928-13dfa49a200f.png)

問題なく、デプロイされてNode-REDフローとUIが動くことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/e360bfbf-4283-b666-6f60-4ffd685688ee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/9cd22132-7acc-5052-6a24-eeaae061bef7.png)

## Live Video Analytics

Live Video Analyticsも現在、Previewですが、デプロイして確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/c92118fc-57c7-19e5-0428-c20b90903038.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/54b397ab-369a-d37f-e429-6303ce6d9b71.png)

Media Graphのトポロジーは下記のように作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/f6a0b445-78e7-df3f-7ebf-e9fda0df262b.png)

# まとめ

Azure IoT Edge for Linux on Windows (EFLOW)はMicrosoftさんのEdgeコンピューティング戦略をある程度、推測できるサービスだと思います。
Windowsの生産性をそのまま活用して数多くあるAMD64のLinux用コンテナーをそのまま使うことができるのでとても魅力的なサービスだと思います。Public Previewですが、早めにGAになってほしいです。