Ubuntu 18.04にAzure IoT Edgeランタイムをインストールする

# はじめに

横河電機のエッジコントローラe-RT3 Plus F3RP70-2L[^e-RT3]をAzure IoT認定デバイス[^azure]に登録する担当者として、Azure IoT Edgeについて勉強しました。
その内容を数回に分けてご紹介します。


# 環境

動作確認したデバイス（OS）

- e-RT3 Plus F3RP70-2L（Ubuntu 18.04 32bit）
- Raspberry Pi 4 Model B （Ubuntu Server 18.04 32bit）
   
これらのデバイスでは `armhf` アーキテクチャのパッケージが動作します。 
また、Windows 10 搭載のPCでデバイスを操作してIoT Edgeをインストールしています。


# Azure IoT Edgeとは
Azure IoT Edgeとは、エッジ機器に向けたIoT環境の構築が簡単に実現できるサービスです。Azure IoT Edgeを使用することでエッジ機器を簡単にクラウドに接続でき、データのやり取りやモジュール（エッジ機器で実行させるプログラム）のデプロイが遠隔でできるようになります。
詳しくは[Azure IoT Edge](https://azure.microsoft.com/ja-jp/services/iot-edge/)のウェブサイトをご覧ください。



# 準備


## Azureアカウントの作成
まだアカウントを所持していない場合は作成します。
初めの期間は一部サービスが無料で使用できたりクレジットが付いてくるので、お試し感覚で始められます。

[Microsoft Azure](https://azure.microsoft.com/ja-jp/)

## IoT Hubの作成
Azureへサインアップしたら、Azure PortalからIoT Hubを作成します。

1. Azure Portalの左上にある＋マークの「リソースを作成」をクリックします。

2. 左のカテゴリから「モノのインターネット（IoT）」をクリックし、右側に表示されるサービスから「IoT Hub」をクリックします。
![iothub_001_p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682605/26182348-a5ce-0ca7-a332-c05065a6bbf6.png)




1. 基本の情報を入力します。
サブスクリプション、リソースグループ、領域を選択し、任意のIoT Hub名を入力します。
リソースグループをまだ作成していない場合は「新規作成」をクリックして作成します。
入力出来たら上部の「ネットワーク」タブか下部の「次へ：ネットワーク」ボタンをクリックし次へ進みます。
![iothub_002_p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682605/75b226eb-a469-503a-fd75-37c8267a8104.png)

1. ネットワークの情報を入力します。
任意の内容を選択してください。
今回はあらかじめ選択されている「パブリック エンドポイント (すべてのネットワーク)」を選択します。
その後、上部の「サイズとスケール」タブか下部の「次へ：サイズとスケール」ボタンをクリックし次へ進みます。


1. サイズとスケールの情報を入力します。
「価格とスケールティア」ではIoT Edgeが使用可能なFreeレベルかStandardレベルから任意のレベルを選択します。
Freeレベルは無料で使用することが可能で、Standardレベルは課金が必要です。
その他の項目は今回は特に変更せずに次の「タグ」へ進みます。
![iothub_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682605/24ccdaf3-d6d6-a341-cb57-96bc919ce773.png)



1. タグの情報を入力します。
今回はタグは使用しないので、何も入力せずに次の「確認および作成」へ進みます。


1. 確認および作成
入力した情報に問題がなければ左下の青い「作成」ボタンをクリックします。

これでIoT Hubの作成は完了です。
次回の作業でIoT Hubへ接続します。



# インストール
基本的にはMicrosoft公式のドキュメント[^doc]に従いますが、こちらではARM 32bitデバイスでの手順に絞って説明します。
作業するディレクトリは特に問いません。

## リポジトリの登録
下記のコマンドでリポジトリを登録します。


```bash
curl https://packages.microsoft.com/config/ubuntu/18.04/multiarch/prod.list > ./microsoft-prod.list
``` 


次に、`apt` コマンド使用時に参照できるように `sources.list.d` へコピーします。



```bash
sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
```

※[Proxy設定](#proxy設定)や[sudoers設定](#sudoers設定)が必要な場合の説明が補足セクションにあります。


## GPG公開キーの登録
下記のコマンドでGPG公開キーを登録します。

```bash
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/
```


## コンテナーランタイムのインストール
パッケージリストを更新し、コンテナーランタイムのMobyエンジンと、Mobyコマンドラインインターフェイスをインストールします。
Mobyエンジンのインストール時にMobyコマンドラインインターフェイス（moby-cli）も一緒にインストールされます。


```bash
sudo apt update
sudo apt install moby-engine
```

## Azure IoT Edgeセキュリティデーモンのインストール
公式ドキュメント[^doc]では `apt` コマンドでのインストール手順が初めに紹介されていますが、`armhf` アーキテクチャのパッケージはこちらの手順では取得できませんでした。


```bash
$ sudo apt search iotedge
Sorting... Done
Full Text Search... Done
iotedge/bionic 1.0.9.4-1 amd64     # amd64しかない
  Azure IoT Edge Security Daemon
```


なので、[Azure IoT Edgeリリース](https://github.com/Azure/azure-iotedge/releases)から `armhf` アーキテクチャのセキュリティデーモンをインストールします。

リリース一覧からインストールしたいバージョンのAssetsを展開し、`libiothsm` と `iotedge` のUbuntu用 `armhf` アーキテクチャのリンクを探します。
一覧にはUbuntu 16.04のファイルしかありませんが、Ubuntu 18.04でも問題なく動作します。
2020/9/1現在は1.0.9.4が最新の安定版のため、本バージョンを例にして説明します。
※ `libiothsm` から先にインストールしてください。

![iotedge_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682605/b9c0bc35-3778-9279-5243-d85c50e426e6.png)


###  libiothsm
上記の画像の `libiothsm-std_1.0.9.4-1_ubuntu16.04_armhf.deb`　を右クリックし、リンクのアドレスをコピーします。
コピーしたリンクを下記のコマンドの `<libiothsm-std link>` に置き換えて実行します。
`curl -L <libiothsm-std link> -o libiothsm-std.deb && sudo dpkg -i ./libiothsm-std.deb`
実際のコマンドは以下の通りです。


```bash
curl -L https://github.com/Azure/azure-iotedge/releases/download/1.0.9.4/libiothsm-std_1.0.9.4-1_ubuntu16.04_armhf.deb -o libiothsm-std.deb && sudo dpkg -i ./libiothsm-std.deb
```


### iotedge
上記の画像の `iotedge_1.0.9.4-1_ubuntu16.04_armhf.deb` を右クリックし、リンクのアドレスをコピーします。
コピーしたリンクを下記のコマンドの `<iotedge link>` に置き換えて実行します。
`curl -L <iotedge link> -o iotedge.deb && sudo dpkg -i ./iotedge.deb`
実際のコマンドは以下の通りです。


```bash
curl -L https://github.com/Azure/azure-iotedge/releases/download/1.0.9.4/iotedge_1.0.9.4-1_ubuntu16.04_armhf.deb -o iotedge.deb && sudo dpkg -i ./iotedge.deb
```



## インストールの確認
コンテナーランタイムとAzure IoT Edgeセキュリティデーモンがインストールできていることを確認します。

* コンテナーランタイム
以下のコマンドで確認します。

```bash
$ docker --version
Docker version 19.03.12+azure, build 0ed913b885c8919944a2e4c8d0b80a318a8dd48b
```

* Azure IoT Edgeセキュリティデーモン
以下のコマンドで確認します。

```bash
$ iotedge --version
iotedge 1.0.9.4
```



# 補足

## Proxy設定
社内での作業にはProxy設定が必要でした。
個人的に最も苦労したことの一つがProxyに関することなので、それぞれ環境は異なると思いますが私の設定した内容をご紹介します。

`apt`、`curl`コマンドを使用するため環境変数にProxy URLを設定します。
Proxy URLは例えば `http://username:password@example.com:port/` です。
ご自身の環境によって変わりますので、詳しくは管理者の方へお問い合わせください。

今回は `http_proxy`、`https_proxy`それぞれに設定して作業しました。


```bash
export http_proxy="http://username:password@xxx.com:port/"
export https_proxy="http://username:password@xxx.com:port/"
```


環境変数は `env` コマンドで確認できます。
こちらの手順で設定する場合、ログオフやシャットダウンを行うと設定内容が消去されます。

また、Proxy設定を行った場合は環境変数を引き継ぐ `-E` オプションを `sudo` 使用時に付与して実行してください。


```bash
# aptコマンドの例
sudo -E apt update
sudo -E apt install moby-engine
```


設定した環境変数の消去は以下のコマンドで行います。

```bash
unset http_proxy https_proxy
```


## sudoers設定
一般ユーザでの作業時にroot権限が必要なコマンドを使用する場合は通常 `sudo` を先頭に加えますが、以下のように拒否されてしまうことがあります。

```bash
# 一般ユーザusernameでの作業
$ sudo apt update
[sudo] password for username:     # パスワードを入力
username is not in the sudoers file.  This incident will be reported.
```

このような場合に設定を行います。
設定はroot権限で行うので、一旦 `su` コマンドで `root` ユーザに切り替えます。

```bash
$ su
Password:     # rootのパスワードを入力
root@ubuntu:/home/username# 
```

`visudo` コマンドで設定ファイルを編集します。


```bash
visudo
```

設定ファイルに以下の行を書き加えて保存します。
`username` はご自身のユーザ名に置き換えてください。

```bash
username ALL=(ALL) ALL     # 一般ユーザusernameの場合
```

`root` からログアウトし、`sudo` コマンドが通るか確認します。

```bash
root@ubuntu:/home/username# exit
exit
username@ubuntu:~$ sudo apt update
[sudo] password for username:     # パスワードを入力
Get:1 http://ports.ubuntu.com/ubuntu-ports bionic InRelease [242 kB]
...

username@ubuntu:~$
```



# 次回
IoT Edgeランタイムのインストールができました。
次回はセキュリティデーモンを設定し、IoT Hubへ接続する手順を書いていきます。

→[次回](https://qiita.com/Yokogawa_Mita/items/d6525ebd57af03b67cf9)

# 参考

[^e-RT3]: [リアルタイムOSコントローラ　e-RT3 Plus F3RP70-2L](https://www.yokogawa.co.jp/solutions/products-platforms/control-system/real-time-os-controller/ert3-ai-platform/)
[^azure]: [Azure Certified Device catalog](https://devicecatalog.azure.com/)
[^doc]: [Debian ベースの Linux システムに Azure IoT Edge ランタイムをインストールする](https://docs.microsoft.com/ja-jp/azure/iot-edge/how-to-install-iot-edge-linux)
[^upgrade]: [IoT Edge セキュリティ デーモンおよびランタイムの更新](https://docs.microsoft.com/ja-jp/azure/iot-edge/how-to-update-iot-edge)