AWS Greengrassのチュートリアルをやってみた

Greengrassのユーザガイドにあるチュートリアルをやってみました。
http://docs.aws.amazon.com/greengrass/latest/userguide/gg-deploy-simple-lambda.html

# 事前に用意するもの
- AWSアカウント
- Raspberry Pi3

# 作業内容
## 1. GreengrassグループとGreengrassコアを作成する
マネジメントコンソールにログイン後、「AWS IoT」-「Greengrass」-「今すぐ始める」を選択します。次に「Greengrassグループを設定する」画面になったら、「簡単な作成の使用」を選択します。

<img width=70% alt="01_welcome.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/ebedfcca-4e2e-47f8-3b75-7933f5adcb89.png">

グループ名とコア名を指定後、「グループとコアの作成」をクリックします。

<img width=70% alt="02_group.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/ddefbf83-717b-a979-09e2-f57003534c01.png">

<img width=70% alt="03_core.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/57a3fda8-3fc3-586c-c6d8-ec0d21012f4e.png">

「コアデバイスへの接続」 の画面になったら、証明書、パブリックキー、プライベートキーとGreengrassコアソフトウェアをダウンロードします。

<img width=70% alt="05_key.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/7d631078-25c2-bcb6-e6d7-19d29a69622d.png">


## 2. Raspberry Piを設定する
Raspberry Piへログインし、下記の設定をします。

- ユーザー・グループの作成
- カーネル4.9へアップデート
- sqlite3のインストール
- セキュリティ設定


```bash

$ sudo adduser --system ggc_user
$ sudo addgroup --system ggc_group

$ sudo apt-get install rpi-update
$ sudo rpi-update

$ sudo apt-get install sqlite3

$ sudo vi /etc/sysctl.d/98-rpi.conf

$ sudo reboot
```
~~~/etc/sysctl.d/98-rpi.conf
・・・
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
~~~

## 3. Raspberry PiにGreengrassソフトウェアパッケージを展開する
ダウンロードしたソフトウェアパッケージをscp等でRaspberry Piにコピー後、展開します。

```
$ sudo tar -zxf greengrass-linux-armv7l-1.0.0.tar.gz -C /
```
## 4. Raspberry Piに証明書をインストールする
シマンテックのサイトからルート証明書をダウンロードします。
http://docs.aws.amazon.com/ja_jp/greengrass/latest/userguide/install-core-certs.html

ダウンロードした証明書、プライベートキーとルート証明書をscp等でRaspberry Piに転送後、配置します。

```bash
$ sudo mv xxxxxxxxxx-certificate.pem.crt /greengrass/configuration/certs/cloud.pem.crt

$ sudo mv xxxxxxxxxx-private.pem.key /greengrass/configuration/certs/cloud.pem.key

$ sudo mv root-ca.pem /greengrass/configuration/certs/
```

## 5. Greengrassコアを設定する
「コア」-「詳細」を選択して、ARNを表示します。

<img width=70% alt="06_core.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/d05298f4-c9d7-6b6c-9436-973fc85a449b.png">

<img width=70% alt="07_core_detail.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/60dfe13c-c2b6-3b5b-fc8e-f3c08439816a.png">

aws cliでIoTのエンドポイントを取得します。

```bash
$ aws iot describe-endpoint
{
    "endpointAddress": "xxxxxxxxxxxx.iot.us-east-1.amazonaws.com"
}
```


上記で取得した値を元に、config.jsonファイルを設定します。

- ルート証明書
- 証明書
- プライベートキー
- ARN
- IoTエンドポイント
- systemdの利用有無

~~~/greengrass/configuration/config.json
{
    "coreThing": {
        "caPath": "root-ca.pem",
        "certPath": "cloud.pem.crt",
        "keyPath": "cloud.pem.key",
        "thingArn": "arn:aws:iot:us-east-1:yyyyyyyyyyyy:thing/MyFirstGroup_Core",
        "iotHost": "xxxxxxxxxxxx.iot.us-east-1.amazonaws.com",
        "ggHost": "greengrass.iot.us-east-1.amazonaws.com"
    },
    "runtime": {
        "cgroup": {
            "useSystemd": "yes"
        }
    }
}
~~~
## 6. Raspberry Pi上のGreengrassコアをAWS IoTに接続する
greengrassデーモンを起動します。

```bash
$ cd /greengrass
$ sudo ./greengrassd start
```

## 7. サンプルのLambdaを作成する
マネジメントコンソールで「Lambda」-「greengrass-hello-world」を選択し、Lambdaを作成します。
<img width=70% alt="08_lambda.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/73d69a5c-d498-9280-b8c2-b88086b23a88.png">

作成後、Lambdaに対し新しいバージョンを発行します。

<img width=70% alt="12_lambda.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/e33b42ad-041a-6cb5-de57-cf46c344acb4.png">


## 8. 作成したLambdaをグループの定義に追加・設定する
「最初のLambdaを追加する」を選択します。

<img width=70% alt="14_lambda_add.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/de3bcbef-2c14-d723-835f-612729cac62d.png">

「既存のLambdaを使用」を選択し、Lambda名とバージョンを指定します。

<img width=70% alt="15_lambda_add.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/e062dff8-6c11-5351-f22d-095725e59784.png">

<img width=70% alt="16_lambda_add.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/d248eaaf-78f8-83a3-3036-fad625b7298f.png">

<img width=70% alt="17_lambda_add.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/6546c051-4f21-a4df-4079-e46db6f1b917.png">

Lambdaを追加したら、ライフサイクルを「存在時間が長く無制限に稼働する関数にする」に変更します。

<img width=70% alt="18_lambda_modify.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/13753e9f-9ee9-0bad-1581-0dd267a2a692.png">

<img width=70% alt="19_lambda_modify.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/fac258ab-7f57-d6f2-ca34-0b401897487c.png">

## 9. subscriptionをグループの定義に追加する

「最初のサブスクリプションの追加」を選択します。

<img width=70% alt="20_subscription.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/8e2518f0-695d-d49d-5be1-7a227fb29586.png">

以下のように指定して、「完了」を選択します。

<img width=70% alt="25_subscription.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/97cd8483-022b-0f19-3b60-787dfb082692.png">

## 10. グループをデプロイする

「デプロイ」を選択します。

<img width=70% alt="26_deploy.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/a13cf66b-cea5-990e-15b1-b39a160b472f.png">

「自動検出」を選択します。

<img width=70% alt="27_deploy.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/1f6c8266-924a-30ea-d6f3-d3c8320f3931.png">

「権限の付与」を選択します。

<img width=70% alt="28_deploy.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/ba453f87-08ad-2ab4-9f74-eb5fb9213c52.png">

「デプロイメントが正常に完了しました」のメッセージが表示されればデプロイ成功です。

<img width=70% alt="30_deploy.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/137f9257-9e93-0ee4-372c-2b7eb9378421.png">

# 動作確認
トピックのサブスクリプションを指定後、「トピックへのサブスクライブ」を選択します。

<img width=70% alt="31_test.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/becd9e63-f15a-7526-fad1-b6871cbf8ac0.png">

Greengrassコアからのメッセージが表示されればOKです。

<img width=70% alt="32_test.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/28e17f47-3565-4e85-354d-622243680dff.png">

# 雑感
Lambdaに続き、AWSは何か破壊的なサービスを出してきたように思えます。
Greengrassが今後どのように発展していくのか、とても楽しみです。