OpenBlocks VX1にAzure IoT Edgeをインストールした件

# Azure IoT Edgeについて
MicrosoftはIoTをはじめとするハードウェアについても、最近様々なソリューションを出していて、しかもそれがクラウドファーストかつ世の中のベストプラクティスを取り込んだ合理的なソリューションになっていて凄いと感じます。

Azure IoT Edgeは，近年のエッジデバイスの高性能化を背景としたソリューションと認識しており、コンテナによるモジュール化が，IoT Edgeランタイム上のデータバスを利用して疎結合に構成できるようになっており、当然そのデータバスからAzure IoT Hubとの連携が容易に実現できるようになっています。

合理的と呼ぶのは、アーキテクチャだけではなく、関連するセキュリティの技術などもしっかり作りこまれている点です。例えば証明書のマネジメントなど。きちんと証明書のライフサイクルやその管理までサポートしています。IT的には一般的ではあるのですが、これをフレームワークで規定しているのが好印象です。

近年では、沖電気の[AE2100](https://www.oki.com/jp/AIedge/ae2100/)のようなIoT Edgeを組み込んだ、AIエッジデバイスが出てきています。これは、深層学習等で学習済みモデルがエッジデバイスにコンテナでデプロイされ、その結果がIoT Hubに送られる、といった一連のユースケースを考慮しています。

ただ間違いなく、これらが技術的障壁を上げているのは確かだと思いますし、一般的なクラウドサービスよりもとっつきにくいです。

私は基本的にはソフトウェア側の人間なので、本当はやりたくないのですが、手元にPlatform OpenBlocks VX1があったのでインストールして、実践しました。デバイスにIoT Edgeをインストールした後は、[公式サイト](https://docs.microsoft.com/ja-jp/azure/iot-edge/)をよく読んで実践すれば大丈夫です。そこは割愛します。

# Platform OpenBlocks VX1
このデバイスは、2017年にでたIoT向けのゲートウェイデバイスで、WebUIやNodeREDが予め組み込まれている大変有用なデバイスです。しかも安い。

OSはDebian系で、私の持っているものはファームウェアがバージョン2（FW2）のものです。ここで重要な指摘は、このバージョンだと、IoT EdgeというかコンテナエンジンであるMobyがうまく動きません。

従って、サポートされていないFW3を無理やりインストールして環境構築をします。なお、FW4からはIoT Edgeがデフォルトでサポートされるようです。

## ファームウェアのアップデート
[このURL](https://openblocks.plathome.co.jp/support/software/vx1/#20180219)にある手順をそのまま行います。サポートされないと書いてありますが、致し方ありません。実際、最初は挙動がおかしかったです。

```shell
wget http://ftp.plathome.co.jp/pub/OBSVX2/debian/stretch/obsvx-fw3-updater-3.0.0-30-amd64.deb
dpkg -i obsvx-fw3-updater-3.0.0-30-amd64.deb
```

再起動が行われ、ファームウェアがアップデートしています。
初期化されるので、一般的なOpenBlocksのセットアップの手順に従って、ネットワークへの接続設定などを行います。SSHを有効にするとよいでしょう。

## Mobyのインストール
エッジデバイスでIoT Edgeを動かすための要件としてコンテナエンジンがあります。
マニュアルでは、[Moby Engine](https://github.com/moby/moby)が必要とのことです。正確な理解はしていませんが、Dockerのオープンソースプロジェクトという感じでしょうか。マイクロソフトがビルドしたバージョンをインストールするために、以下の手順を踏みます。ファームのアップデートによって、Debian 9(Streach)となったので、[Raspbian Streachの手順](https://docs.microsoft.com/ja-jp/azure/iot-edge/how-to-install-iot-edge-linux)を辿ればよいです。

```shell
curl https://packages.microsoft.com/config/debian/stretch/multiarch/prod.list > ./microsoft-prod.list
sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
sudo apt-get install moby-engine
sudo apt-get install moby-cli
```

この後に、IoT Edgeをインストールすればいいのですが、`apt-get`ではバージョンが異なるとはじかれてしまいます。そのため、手動でビルドします。この時点の最新版のインストール手順は以下です。[このURL](https://github.com/Azure/azure-iotedge/releases)を見て、適当なバージョンを選びましょう。

```shell
curl -L https://github.com/Azure/azure-iotedge/releases/download/1.0.9.3/libiothsm-std_1.0.9.3-1-1_debian9_amd64.deb -o libiothsm-std.deb && sudo dpkg -i ./libiothsm-std.deb
curl -L https://github.com/Azure/azure-iotedge/releases/download/1.0.9.3/iotedge_1.0.9.3-1_debian9_amd64.deb -o iotedge.deb && sudo dpkg -i ./iotedge.deb
```

インストールが終わると`iotdege`コマンドが使えるようになります。
最初はコンフィグが適切でないので修正が必要です。Azure PortalなどでIoT Edgeの設定を行い、接続文字列を取得したのち、`/etc/iotedge/config.yaml`を修正します。デバイスの登録の仕方は[ここ](https://docs.microsoft.com/ja-jp/azure/iot-edge/quickstart-linux)を参考にすればよいです。

```config.yaml
# Manual provisioning configuration
provisioning:
  source: "manual"
  device_connection_string: "デバイス接続文字列を入力"
```

設定が成功して再起動すると、ステータス確認によって状態が確認できます。
`iotedge list`は、デバイスにモジュールがデプロイされた後、うまくいっていればインストールされているモジュールが並びます。

```bash
sudo systemctl restart iotedge
systemctl status iotedge
sudo iotedge check
sudo iotedge list
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51703/deb3aff6-60ee-c59e-8586-c7f02f5807e3.png)


# 参考
- [Azure IoT Edgeドキュメント](https://docs.microsoft.com/ja-jp/azure/iot-edge/)