UbuntuにAWS IoT Greengrassをインストールする

# はじめに
会社の業務でAWS IoT Greengrassについて勉強したので、今回から数回に分けてUbuntu搭載デバイスとAWS IoTを利用したアプリケーションを紹介していきたいと思います。
初回はクラウド上でのGreengrass Groupの作成と、エッジデバイスへのGreengrass Coreのインストール方法を紹介します。

[Azure IoT Edgeを使った記事](https://qiita.com/Yokogawa_Mita/items/f7996d539b29618d7159)もあるので興味のある方は是非ご覧ください。
また、新バージョンGreengrassV2のインストールについては[こちらの記事](https://qiita.com/Yokogawa_Ishino/items/0b28cbd543812b73bd92)をご覧ください。

# 環境
動作確認済デバイス（OS）

- e-RT3 Plus F3RP70-2L[^ert3]（Ubuntu 18.04 32bit）
    横河電機のエッジコントローラです。AWS IoT Greengrassの認定デバイス[^certificate]に登録されています(e-RT3のページは[こちら](https://devices.amazonaws.com/detail/a3G0h000007dE0NEAU/e-RT3-Plus-(F3RP70-2L)))。

- Raspberry Pi 4 Model B （Ubuntu Server 20.04 32bit）

これらのデバイスでは armhf アーキテクチャのパッケージが動作します。
また、Windows 10 搭載のPCでデバイスを操作しています。

# AWS IoT Greengrassとは
AWS IoT GreengrassとはAWSが提供しているエッジコンピューティングのためのソフトウェアです。
Greengrassをエッジデバイスにインストールすることにより、クラウドとの接続やクラウドからのアプリケーションのデプロイなどを容易に行うことができます。
また、クラウドの一部の機能をエッジデバイスに拡張することにより、データソースに近い場所でのデータ収集や分析、ローカルイベントに対するアクション、ローカルデバイス同士の通信などを行うことができます。
詳しくは[AWS IoT Greengrassの公式サイト](https://aws.amazon.com/jp/greengrass/)をご覧ください。

# 準備
## AWSアカウントの作成
AWSのアカウントを所持していない場合は作成します。
https://aws.amazon.com/jp/
制限付きの無料利用枠もあります。
今回使用するAWS IoTの無料利用枠は[ここ](https://aws.amazon.com/jp/free/?nc2=h_ql_pr_ft&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Categories=categories%23iot)で確認できます。

## WinSCPのインストール
PCからデバイスにファイルを転送するために、PCにWinSCPをインストールします。
インストール方法や使い方については公式サイトをご覧ください。
https://winscp.net/eng/index.php

## Python3.8のインストール
この設定は**e-RT3を使用している場合のみ**必要です。
>**Note**
>e-RT3の場合、一般ユーザーでsudoコマンドを実行するには[sudoers設定](https://qiita.com/Yokogawa_Mita/items/f7996d539b29618d7159#sudoers%E8%A8%AD%E5%AE%9A)が必要です。

GreengrassのLambdaで使用するPython3.8をインストールします。

```bash
sudo apt update
sudo apt install python3.8
```
インストールの成功を確認します。

```bash
username@ubuntu:~$ python3.8 --version
Python 3.8.0
```

## Java8のインストール
Greengrassのストリームマネージャーで使用するJava8をインストールします。

```bash
sudo apt update
sudo apt install openjdk-8-jdk
```
インストールしたJavaにリンクを張ります。

```bash
sudo ln /etc/alternatives/java /usr/bin/java8
```
インストールの成功を確認します。

```bash
username@ubuntu:~$ java8 -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~18.04-b01)
OpenJDK Client VM (build 25.275-b01, mixed mode)
```

## cgroupの有効化
この設定は**Raspberry Piを使用している場合のみ**必要です。

コンテナでLambdaを実行するためにcgroupを有効にします。

`/boot/firmware/cmdline.txt`を開きます。

```bash
sudo vi /boot/firmware/cmdline.txt
```
 __既存の行の末尾に__以下の値を追加します。

```
cgroup_enable=memory cgroup_memory=1
```
デバイスを再起動します。

```bash
sudo reboot
```

# Greengrass Groupの作成
AWSの公式ガイドの手順[^ggconfig]に従って、AWSマネジメントコンソールでGreengrass Groupを作成します。

1. 右上のメニューで東京リージョンを選択します。
![gg0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/06fbde89-a244-b2af-275f-79981033c766.png)

2. 左上の「サービス」メニューを開いて検索窓に「iot greengrass」と入力し、「IoT Greengrass」をクリックします。
![gg1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/69262fef-f8a0-9e70-d81e-1dd8826e02fc.png)

3. 左側のナビゲーションペインから「Greengrass」→「イントロダクション」と進み、グループの作成をクリックします。
![gg2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/aa18a150-be89-41d8-0a31-a34c32152940.png)

4. 「デフォルト作成を使用」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/074eab98-933a-49ad-34be-56acba5da874.png" width=70%>

5. グループに名前を付けて「次へ」をクリックします。今回は「eRT3Group」とします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/ebea85de-efce-b2c5-5dcd-640ebe325737.png" width=70%>

6. Greengrass Coreの名前を指定します。デフォルトのまま「次へ」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/45bd9b14-1cb2-112a-7f2a-8a2128fad63b.png" width=70%>

7. 確認画面が表示されます。確認して「グループとCoreの作成」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/ec7846d8-0633-412d-9eca-effdad4621fc.png" width=70%>

8.「これらのリソースはtar.gzとしてダウンロードしてください」をクリックして、デバイスをクラウドに接続するためのセキュリティリソースをダウンロードします。
このファイルは後からダウンロードすることができないので、必ずここでダウンロードしておきましょう。
ダウンロードできたら「完了」をクリックして設定を終了します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/4a98016f-599d-4e15-6617-b3df23a77a2d.png" width=70%>

# Greengrass Coreのデバイスへのインストール
デバイスにGreengrass Coreソフトウェアをインストールして起動します。
Greengrass Coreソフトウェアのインストール方法は複数ありますが、ここではAPTリポジトリからインストールします[^apt]。
>**Note**
>APTリポジトリからのインストールではOTA更新がサポートされていません。OTA更新を利用したい方は他の方法でインストールしてください。

## セキュリティリソースとルートCA証明書のセットアップ
デバイスをクラウドに接続するために必要なセキュリティリソースとルートCA証明書をセットアップします。

### セキュリティリソースのインストール
1. WinSCPを起動してデバイスと接続し、ユーザーのホームディレクトリに[Greengrass Groupの作成](#greengrass-groupの作成)の手順8でダウンロードしたセキュリティリソース（tar.gzファイル）を置きます。
![gg8-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/ff18f69a-a5b3-9249-f3b6-559c0487a50a.png)

2. 以下のコマンドを実行してセキュリティリソースをインストールします。
    `<hash>`の部分はセキュリティリソースのファイル名に合わせて置き換えてください。

    ```bash
    sudo mkdir -p /greengrass
    sudo tar -xzvf ~/<hash>-setup.tar.gz -C /greengrass
    ```

### ルートCA証明書のダウンロード
1. `/greengrass/certs`へ移動します。

    ```bash
    cd /greengrass/certs/
    ```

1. `root.ca.pem`という名前でAmazon Root CA 1証明書をダウンロードします。

    ```bash
    sudo wget -O root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
    ```
    ダウンロードした`root.ca.pem`が空でない（正しくダウンロードされた）ことを確認します。ファイルが空の場合はもう一度ダウンロードを試してみてください。

    ```bash
    cat root.ca.pem
    ```

## Greengrass Coreソフトウェアのインストール
1. Greengrassのシステムアカウントを作成します。

    ```bash
    sudo adduser --system ggc_user
    sudo addgroup --system ggc_group
    ```

2. AWS IoT Greengrass キーリングパッケージをインストールして、リポジトリを追加します。

    ```bash
    cd ~
    sudo wget -O aws-iot-greengrass-keyring.deb https://d1onfpft10uf5o.cloudfront.net/greengrass-apt/downloads/aws-iot-greengrass-keyring.deb
    sudo dpkg -i aws-iot-greengrass-keyring.deb
    ```
    ```bash
    username@ubuntu:~$ echo "deb https://dnw9lb6lzp2d8.cloudfront.net stable main" | sudo tee /etc/apt/sources.list.d/greengrass.list
    deb https://dnw9lb6lzp2d8.cloudfront.net stable main
    ```


3. パッケージのリストを更新し、Greengrass Coreソフトウェアをインストールします。

    ```bash
    sudo apt update
    sudo apt install aws-iot-greengrass-core
    ```

4. Greengrassデーモンを開始します。

    ```bash
    sudo systemctl start greengrass.service
     ```
    以下のコマンドを実行し、表示された`Active`の状態が`active(running)`であればデーモンは正常に動作しています。

    ```bash
username@ubuntu:~$ systemctl status greengrass.service
* greengrass.service - Greengrass Daemon
   Loaded: loaded (/lib/systemd/system/greengrass.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-11-06 06:31:07 UTC; 14min ago
  Process: 2159 ExecStart=/greengrass/ggc/core/greengrassd start (code=exited, status=0/SUCCESS)
 Main PID: 2163 (5)
    Tasks: 10 (limit: 2366)
   CGroup: /system.slice/greengrass.service
    ```
    デバイス起動時に自動的に起動するには以下のコマンドを実行してください。

    ```bash
    sudo systemctl enable greengrass.service
    ```

>**Note**
>デバイスがproxy環境下にある場合は追加で[proxy設定](#proxy設定)が必要になります。

# 動作確認
空のデプロイを行ってデバイスがクラウドと接続できるか確認します。

1. 左側のメニューから「グループ」へ進み、作成したグループをクリックします。
![gg11-a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/81cbe89e-83bb-5e13-d01c-0081ae9ffc9f.png)

2. 「アクション」メニューから「デプロイ」をクリックし、デプロイを開始します。
![gg9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/5634b6c8-f769-b17d-866e-a5cbaf2081ec.png)

3. 「自動検出」をクリックします。
![gg28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/0e95578b-1d95-690d-65c0-338925f4b84b.png)

4. デプロイが完了するまで数分間待ちます。デプロイが正常に完了すれば成功です。
![gg10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682603/272d6846-5b2b-9509-cc67-f0611a110ad2.png)

# まとめ
クラウド上でのGreengrass Groupの作成と、デバイスへのGreengrass Coreのインストールを行いました。
次回はLambdaの作成とデプロイを行う予定ですのでお楽しみに！

次回：[GreengrassのLambdaを作成してエッジデバイスにデプロイする](https://qiita.com/Yokogawa_Ishino/items/3ceb9029afcc7a58f2f9)

# 補足
## proxy設定
デバイスがproxy環境下にある場合はproxy設定が必要になります。
環境により設定は異なりますが、参考までに今回私が行った設定を紹介します。
### 環境変数の設定
[こちらの記事](https://qiita.com/Yokogawa_Mita/items/f7996d539b29618d7159#proxy%E8%A8%AD%E5%AE%9A)をご覧ください。

### Greengrass Coreの設定
AWSの公式ドキュメント[^proxy]に従ってGreengrass Coreの設定を行います。

1. Greengrassが起動中の場合は停止します。
    
    ```bash
sudo systemctl stop greengrass.service
    ```
2. `/greengrass/config/config.json`に書き込み権限を追加して開きます。

    ```bash
sudo chmod +w /greengrass/config/config.json
sudo vi /greengrass/config/config.json
    ```
coreThingオブジェクト内にiotMqttPortオブジェクトとnetworkProxyオブジェクトを追加します。
追加した後のファイルは以下のようになります。

    ```/greengrass/config/config.json
{
    "coreThing" : {
        "caPath" : "root.ca.pem",
        "certPath" : "3283c6f04d.cert.pem",
        "keyPath" : "3283c6f04d.private.key",
        "thingArn" : "arn:aws:iot:ap-northeast-1:xxxxxxxxxxxx:thing/eRT3Group_Core",
        "iotHost" : "xxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com",
        "iotMqttPort" : 443,
        "ggHost" : "greengrass-ats.iot.ap-northeast-1.amazonaws.com",
        "keepAlive" : 600,
        "networkProxy":{
            "proxy":{
                "url" : "http://username:password@example.com:port/"
            }
        }
  },
...
    ```
3. ファイルから書き込み権限を削除し、Greengrassを再度起動します。

    ```bash
sudo chmod -w /greengrass/config/config.json
sudo systemctl start greengrass.service
    ```
    
# 参考
[^ert3]: [リアルタイムOSコントローラ　e-RT3 Plus F3RP70-2L](https://www.yokogawa.co.jp/solutions/products-platforms/control-system/real-time-os-controller/ert3-ai-platform/)
[^certificate]: [AWS Partner Device Catalog](https://devices.amazonaws.com/)
[^ggconfig]: [AWS IoT の AWS IoT Greengrass の設定](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/gg-config.html)
[^apt]: [APT リポジトリからの AWS IoT Greengrass Core ソフトウェアのインストール](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/install-ggc.html#ggc-package-manager)
[^proxy]: [ポート 443 での接続またはネットワークプロキシを通じた接続](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/gg-core.html#alpn-network-proxy)