GreengrassでIoT入門

# はじめに
この記事は、趣味で宇宙開発を行う団体「[リーマンサット・プロジェクト](https://www.rymansat.com/)」がお送りする[新春アドベントカレンダー](https://qiita.com/rsp-dgkz/items/a6ff573c07dbe2c6166f)の 1/26 分の投稿になります。
リーマンサットでは人工衛星の開発を行っていますが、地球と軌道上を周回する衛星とで通信を行う、今の地球上で最もスケールの大きいIoTプロジェクトだと言っても良いと思います。
今回はIoT関連ということで、AWSさんが開発されているGreengrassというソフトウェアについて簡単な解説記事を書こうと思います。特にV2に関しては、re:Invent2020で発表されたばかりであまり情報がないため、そちらを中心に書いていきます。

# Greengrassについて
ざっくりいうと、AWSの機能を一部エッジデバイスで実行可能にし、エッジデバイス向けの機能を足したソフトウェアになります。
例えば、
- Lambdaをエッジデバイスで実行する
- ECRに登録してあるコンテナイメージを実行する
- SageMakerで作成したMLModelをデプロイする 
などになります。

またMQTT BrokerであるAWS IoT Coreと通信し、あるトピックにメッセージがpublishされた際にエッジデバイス上で特定のLambdaを起動する、といった使い方もできます。機能全般については[Blackbelt](https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-iot-greengrass-2020/)の記事が詳しいです。

ユースケースとしては、主に工場などがあるそうです。おそらく一台マシンパワーが強めのマシンをエッジに置いておいて、他のデバイスを制御・管理する、といった使い方になるのだと思います。

# GreengrassV1とV2について
Greengrassは長らくV1で改良が続けられていましたが、re:Invent2020の時期にGreengrass V2が[発表](https://aws.amazon.com/jp/blogs/news/announcing-aws-iot-greengrass-2-0-with-an-open-source-edge-runtime-and-new-developer-capabilities/)されました。
実行できる機能については大きな違いはありませんが、[公式の解説](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-v2-whats-new.html)によると、大きな違いは
1. Apache2.0のOSS公開をしているため、直接ソースコードをカスタマイズ可能
2. ランタイム構成がモジュール化されており、ユースケースやHWによって組み合わせの変更が可能
3. ローカル開発ツールの充実化
4. フリートマネジメント機能の改良
になります。
実際に動かしてみたい方は、[getting-started](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html)を見られると良いと思います。手順自体はそれほど難しくないので、一時間あれば充分にできると思います。筆者は、AWS EC2 Ubuntu20 aarch64で試しました。

フリートマネジメント機能以外を１つずつ簡単に見ていくと

## Apache2.0のOSS公開をしているため、直接ソースコードをカスタマイズ可能
[Githubのレポジトリ](https://github.com/aws-greengrass)でソースコードが公開されていました。

おそらくランタイムのコア機能を司る[nucleusレポジトリ](https://github.com/aws-greengrass/aws-greengrass-nucleus)を見てみると、javaで構成されたソースコードが確認できます。
たしかにIoTの環境に応じてソースコードから改変可能、というのは強みかもしれません。

## ランタイム構成がモジュール化されており、ユースケースやHWによって組み合わせの変更が可能
GreengrassV1は高機能ではありますが、それをモジュール化し分割して必要な分だけデプロイが可能になっているようです。

公式より[複数のコンポーネント](https://docs.aws.amazon.com/greengrass/v2/developerguide/public-components.html)が提供されており、これを必要な分だけ選択してデプロイが可能になります。


## ローカル開発ツールの充実化
greengrass-cliやlocal debug consoleが開発用のデバイスで使用可能になっています。
greengrass-cliでは今現在デプロイされているコンポーネントの確認などが行なえます。
このgreengrass-cli自体も、プロダクション用のデバイスにはデプロイしない、といった選択も可能になっています。

```bash 
$ sudo /greengrass/v2/bin/greengrass-cli component list
Components currently running in Greengrass:
Component Name: DeploymentService
Version: 0.0.0
State: RUNNING
Configuration: null
Component Name: UpdateSystemPolicyService
Version: 0.0.0
State: RUNNING
Configuration: null
**省略**
Component Name: aws.greengrass.Cli
Version: 2.0.3
State: RUNNING
Configuration: {"AuthorizedPosixGroups":null}
Component Name: aws.greengrass.LocalDebugConsole
Version: 2.0.3
State: RUNNING
Configuration: {"bindHostname":"localhost","port":"1441","websocketPort":"1442"}
```

local debug consoleでは、greengrass-cliで参照可能な情報がGUIで表示されるようになっています。

![greengrass_debugconsole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289777/ed0a117b-f491-c1cd-c9ec-e86d810b254b.png)



## その他
GreengrassV1では、pre-builtされたバイナリを実行する形式ですが、今回からはモジュール化に伴いjavaが必須になっているようです。
自動スクリプトでsystemdへの登録まで実施してくれるので、実際見てみるとjavaで起動していることがわかります。

```bash
$ sudo systemctl status greengrass.service 
● greengrass.service - Greengrass Core
     Loaded: loaded (/etc/systemd/system/greengrass.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-01-04 01:24:07 UTC; 3h 22min ago
   Main PID: 5459 (loader)
      Tasks: 56 (limit: 4600)
     Memory: 493.3M
     CGroup: /system.slice/greengrass.service
             ├─5459 /bin/sh -x /greengrass/v2/alts/current/distro/bin/loader
             └─5649 java -Dlog.store=FILE -Droot=/greengrass/v2 -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar --setup-system-service false

```

# 動かしてみる
[getting started](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html)の手順で動かしてみました。
環境：AWS EC2 Ubuntu20 arm64
手順通りやれば基本的にできますが、注意点としてはデバイスに
- aws cli のインストール
- jre v8以上のインストール
が必要になります。

最終的に成功しているかどうかは、AWS IoTのGUIコンソールより確認できます。下記の感じになると思います。
![IoTCore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289777/1362fe6a-c6a5-e89e-a5eb-cffa7f55fd72.png)

Lambda関数などをデプロイするサンプルはまだ無いようなので、[ここ](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html)のリンクより必要な設定値等を抜き出しつつ、作成していく必要がありそうです。

# おわりに
AWSと宇宙といえば、[Groud Station](https://aws.amazon.com/jp/ground-station/)がありますが、これを使用して「人工衛星にLambda関数をデプロイし、地上からMQTTメッセージをpublishするとIoTCoreとGroundStationを経由して、人工衛星にデプロイ済みのLambda関数を動的に起動する」みたいなことができると、わくわくするIoTシステムができそうですね！

次は @ishikawa-takumi  の記事になります。お楽しみに！