Azure IoT Edge バージョン 1.x から 1.2 へ更新


# 概要

IoT Edge バージョン 1.2 が GA となり、色々変わりましたので、既存のデバイスに対して更新手順をまとめてみます。

https://azure.microsoft.com/en-us/updates/iot-edge1-2-0/

IoT Edge デバイスを更新するには2つのコンポーネント、セキュリティデーモンとランタイムを更新する必要があります。
セキュリティデーモンのコンポーネントはデバイスで実行され、デバイスの起動時にランタイムモジュールを起動する役割です。ランタイムのコンポーネントは IoT Edge ハブと IoT Edge エージェントモジュールに構成されます。

# 前提条件 : バージョン 1.x 構築

以下の手順で構築されていることを前提とします。

### ARM32

Qiitaに投稿した記事がないので、ARM64手順を参考してください。

### ARM64

https://qiita.com/motoJinC25/items/eae26690fe09a0b26e18

### x64(Linux)

https://qiita.com/motoJinC25/items/5696e25e7d445a7d7817

### Window-x64

1.2バージョンにサポートしてないため、更新できません。

# 更新前のバージョン確認

### セキュリティデーモンのバージョン確認

```bash
$ iotedge version
iotedge 1.1.0
```

### ランタイムモジュールのバージョン確認

```bash
$ iotedge list | grep -E '^edgeAgent|^edgeHub'
edgeAgent        running          Up 18 minutes    mcr.microsoft.com/azureiotedge-agent:1.1
edgeHub          running          Up 18 minutes    mcr.microsoft.com/azureiotedge-hub:1.1
```

# バージョン 1.x アンインストール

```bash
$ sudo systemctl stop iotedge
$ sudo apt remove iotedge
$ sudo apt remove libiothsm-std
```

# バージョン 1.2 インストール

### セキュリティデーモンのインストール

```bash
$ sudo apt-get update
$ apt list -a aziot-edge
...
aziot-edge/bionic 1.2.0-1 arm64
aziot-edge/bionic 1.2.0~rc4-1 arm64
...
$ sudo apt-get install -y aziot-edge
```

> ARM64で更新作業を行っているため、ARM64のみ見えてます。

### 構成ファイルの更新

構成ファイルが`/etc/iotedge/config.yaml`から`/etc/aziot/config.toml`に名前と場所が新しくなってため、 インポートしておきます。

```bash
$ sudo iotedge config import
Azure IoT Edge has been configured successfully!
The configuration has been written to /etc/aziot/config.toml
To apply the new configuration to services, run:

    sudo iotedge config apply -c '/etc/aziot/config.toml'
$ sudo iotedge config apply -c '/etc/aziot/config.toml'
Note: Symmetric key will be written to /var/secrets/aziot/keyd/device-id
Note: Imported master encryption key will be written to /var/secrets/aziot/keyd/imported-master-encryption-key
Azure IoT Edge has been configured successfully!

Restarting service for configuration to take effect...
Stopping aziot-edged.service...Stopped!
Stopping aziot-identityd.service...Stopped!
Stopping aziot-keyd.service...Stopped!
Stopping aziot-certd.service...Stopped!
Stopping aziot-tpmd.service...Stopped!
Starting aziot-edged.mgmt.socket...Started!
Starting aziot-edged.workload.socket...Started!
Starting aziot-identityd.socket...Started!
Starting aziot-keyd.socket...Started!
Starting aziot-certd.socket...Started!
Starting aziot-tpmd.socket...Started!
Starting aziot-edged.service...Started!
Done.
```

更新完了時は下記のようにedgeAgentモジュールしか見えないですが、しばらくすると既存のDeployment Manifestの通り、モジュールが構成されます。

```bash
$ iotedge list
NAME             STATUS           DESCRIPTION      CONFIG
edgeAgent        running          Up 13 seconds    mcr.microsoft.com/azureiotedge-agent:1.0
```

### ランタイムモジュールの更新

ランタイムモジュールはリモートで「Deployment Manifest」を作成して更新できます。
下記のベース「Deployment Manifest」を参考し、Visual Studio Codeなどでデプロイしてください。

```json
{
  "$schema-template": "2.0.0",
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {}
          }
        },
        "systemModules": {
          "edgeAgent": {
            "type": "docker",
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-agent:1.2",
              "createOptions": "{}"
            }
          },
          "edgeHub": {
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-hub:1.2",
              "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
          }
        },
        "modules": {
        }
      }
    },
    "$edgeHub": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "routes": {},
        "storeAndForwardConfiguration": {
          "timeToLiveSecs": 7200
        }
      }
    }
  }
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/2d0c3718-93b0-9261-4e09-cb959a3f5092.png" width="300" />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/661b2bb6-42df-e73a-744e-91604caf42e1.png" width="300" />

```bash
$ iotedge list
NAME             STATUS           DESCRIPTION      CONFIG
edgeAgent        running          Up 3 minutes    mcr.microsoft.com/azureiotedge-agent:1.2
edgeHub          running          Up 3 minutes    mcr.microsoft.com/azureiotedge-hub:1.2
```

# 注意点

Azure IoT Edge 1.2 では Linuxデバイスのみ使用できることや様々な機能を追加され、内部仕組みも変わりましたが、LTSサポートではないことを認識する必要があります。

# One more thing

IoT EdgeデバイスにDeployment Manifestを作成するには下記のウェブサイトで作成することをお勧めします。
まだ、1.2対応ができてないですが、ダウンロードしたDeployment Manifestから簡単に修正できます。

https://wedx-edgeflow.motojin.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287622/1514fbc2-977d-600c-a1ec-94cd15571da4.png)