AWS Greengrass (1.3.0) を Ubuntu server (16.04 x86_64) で動かし、とりま開発する環境まで考える

## ゴールは

Ubuntu server 16.04 (x86_64) に AWS Greengrass Core 1.3.0 をセットアップする方法です
最短ゴールだと python 2.7 のみが稼働します。
インストールしたあと、ローカル Lambda の開発環境で必要なログについても記載しています

## セットアップ手順

早ければ15分程度です

### Ubuntu server のインストール

インストールはサクサクすすめていただいてOKです。インストールパッケージのオプションは下記二つを選びました

* standard system utilities
* openssh server

### Ubuntu インストール後

```console
$ sudo apt update ; sudo apt -y upgrade
$ sudo apt install -y sqlite3 python2.7
$ sudo adduser --system ggc_user
$ sudo groupadd --system ggc_group
$ cat << EOT | sudo tee -a /etc/sysctl.d/00-defaults.conf
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
EOT
$ sudo shutdown -r now
```

#### 動作環境のチェック方法

※この手順はスキップしてもOKです

[他のデバイス](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/module1.html#setup-filter.other)での手順通りです

```console
$ git clone https://github.com/aws-samples/aws-greengrass-samples.git
$ cd aws-greengrass-samples/greengrass-dependency-checker-GGCv1.3.0
$ sudo ./check_ggc_dependencies
```

## AWS から Greengrass Core のダウンロード、展開、実行

[AWS IoT での AWS Greengrass の設定](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/gg-config.html)から先に進んでください

### ダウンロード

途中で Greengrass Core のアーカイブをダウンロードする場面にあたりますが、その際は **x86_64_Ubuntu** を選んでください。すると `greengrass-ubuntu-x86-64-1.3.0.tar.gz` がダウンロードできます

### tar.gz の展開

`greengrass-ubuntu-x86-64-1.3.0.tar.gz` と `${GUID}-setup.tar.gz` を Ubuntu server に転送してから、下記を実行します

```console
$ sudo tar -xzvf greengrass-ubuntu-x86-64-1.3.0.tar.gz -C /
$ sudo tar -xzvf ${GUID}-setup.tar.gz -C /greengrass
$ sudo wget -O /greengrass/certs/root.ca.pem http://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem
```

※`config.json` は `${GUID}-setup.tar.gz` に含まれているので、自分で作る必要はありません

### 起動

```console
$ cd /greengrass/ggc/packages/1.3.0
$ sudo ./greengrassd start
```

## Greengrass の運用について

* OSを再起動しても `greengrassd` は自動起動しません。 systemd あたりの設定が必要です
    * [Armadillo-X1, Armadillo-IoT G3/G3LにAWS Greengrass Coreをインストールする](https://armadillo.atmark-techno.com/howto/install-aws-greengrass) に Unit ファイルの書き方が書いてあります
* Greengrass グループのログ設定をしたほうがいいです
    * `logging.warning()` なら設定なしでとりあえず出力されます

### Greengrass グループのログ設定と出力先

* Greengrass グループ > 設定
    * ローカルログ設定
        * ユーザの Lambda ログ: _トレースログ_
        * Greengrass システムログ: _情報ログ_

ログの出力先は Ubuntu server 上の

* `/greengrass/ggc/var/log/user/{AWS-region}/{AWS-account-id}/{Lambda-name}.log`
* `/greengrass/gcc/var/log/system/*.log`

になります (root権限必要)
この設定はデプロイ時に適用されます

Lambda 関数 (Python 2.7) からは `logging.info("log!!")` のようにすれば、上記ログファイルに書き込まれます。
※log levelが warning 以上なら、ローカルログ設定がされていなくてもログ出力されます

### Greengrass 上で動いている「存続期間の長い Lambda 関数」をともかく止めたい

AWS Greengrass では、 Arduino の `loop()` のように、 [Greengrass Core の起動後から動きつづける Lambda 関数](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/long-lived.html)を作ることができるようになりました

これを止める方法は、下記のどちらかです (他にあるのかな?)

* Greengrass が動いている Ubuntu server を停止しちゃう
    * これは物理アクセスができる、OSレベルでリモートアクセスできる場合
* AWS Greengrass の管理コンソールから **デプロイのリセット** をしましょう (強制フラグもつけると確実性が高まります)

## Node.js 6.10 で動かす (WIP)

```console
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ apt install -y nodejs
$ sudo update-alternatives --install /usr/bin/nodejs6.10 node /usr/bin/node 10
```

## あとがき

ごきげんよう。

EoT