【備忘録】Greengrassのストリームマネージャーでできること

#はじめに
エッジ側でのデータストリームの管理機能として、Greengrassではストリームマネージャーが用意されています。
この「データストリームの管理」としてどのようなことができるか調べた結果を備忘録として残しておきます。

なお、公式ドキュメントのサンプル通りに動かしてみた記事も以前書いているのでご参考までに。
参考：[Greengrass(V1)でストリームマネージャーを利用してみる](https://qiita.com/kt-yt/items/04e16f6e9d5fc5f11e4b)
#1　概要（何ができるか）
ストリームマネージャーは、エッジ側の高頻度なデータ、容量の大きいデータをローカルでストリーミング処理し、クラウドへとエクスポートする機能を提供してくれます。
>ストリームマネージャーは、アプリケーション開発を簡素化します。IoT アプリケーションは、カスタムストリーム管理機能を構築する代わりに、標準化されたメカニズムを使用して大量のストリームを処理し、ローカルデータ保持ポリシーを管理できます。IoT アプリケーションは、ストリームの読み書きが可能です。ストレージタイプ、サイズ、データ保持に関するポリシーをストリームごとに定義して、ストリームマネージャーがストリームを処理およびエクスポートする方法を制御できます。
参考：[AWS IoT Greengrass コアでのデータストリームの管理](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/stream-manager.html)

##1-1　ワークフロー
ストリームマネージャーとの対話は、Greengrass SDKを使ったエッジLambdaで行います。
Lambdaによって、ストリームへのデータ格納、処理、エクスポート方法を制御します。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/r4Ss595bBaahQJ?startSlide=39" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/AmazonWebServicesJapan/20201215-aws-black-belt-online-seminar-aws-iot-greengrass" title="20201215 AWS Black Belt Online Seminar AWS IoT Greengrass" target="_blank">20201215 AWS Black Belt Online Seminar AWS IoT Greengrass</a> </strong> from <strong><a href="//www.slideshare.net/AmazonWebServicesJapan" target="_blank">Amazon Web Services Japan</a></strong> </div><br>

上図の通り、ストリームマネージャーでエクスポート先として対応しているのは以下のサービスです。

* AWS IoT SiteWise
* AWS IoT Analytics
* Amazon S3
* Amazon Kinesis Data Streams

##1-2　可能な設定（いくつか）
ストリームマネージャーはエッジ側でストリームデータの処理をするうえで役に立つ設定が用意されています。
公式ドキュメント以外から引いてきた内容は、以下を参照しています。
参考：[Greengrass Core Python SDK - Docs >> greengrasssdk.stream_manager.data package](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html)

**最大帯域幅**
データのエクスポートに使用できる平均最大帯域幅を指定できます。
クラウドとの通信が切断から回復したあと、ストリームに溜まった大量のデータを一気に放出して帯域幅を圧迫する…といったことを回避できます。

デフォルトでは使用可能な帯域幅を無制限に使用します。

**スレッドプールサイズ**
データのエクスポートに使用できるアクティブなスレッド数を指定できます。
Greengrass Coreデバイスのスペックを考慮して指定します・

デフォルトは5です。

**マルチパートアップロードの最小サイズ**
S3へのエクスポートでマルチアップロードを指定する場合は（シングルアップロードとどちらにするか指定可能）、パートの最小サイズを指定できます。

デフォルトおよび最小値は5242880バイト（5MB）です。

**エクスポートの優先度**
エクスポートの優先度を指定することができます。
指定がない場合は、優先度は最低の扱いになります。

**ストリームのサイズ指定**
ストリームへ溜めるデータの最大値を指定することができます。
デフォルトは256MB、最小は1KB、最大は8192PBです。

最大値を超えた場合の振る舞いも指定できます。
新規データの追加をしない、あるいは、古いデータから上書きのいずれかを指定します。

**ストリームデータのTTL設定**
ストリームデータのTTL（time to live）を60000ミリ秒から9223372036854ミリ秒の間で指定できます。
ただし、TTLを過ぎてただちにデータが消去されることは保証されていません。

**ストリームデータの保存先**
保存先としてメモリかローカルストレージを選ぶことができます。
メモリに保存していた場合、デバイスの再起動で保持していたデータが消えてしまう点は注意です。
##1-3　利用のメリット
利用のメリットとしては以下のようなことが挙げられます。

* クラウドとの通信が切断した際も（設定にしたがう形で）データをストリームとして保持できる
 * 接続再開後のエクスポートも混乱減らす仕組み（優先度、帯域幅設定など）がある
* 高頻度データを都度処理ではなく、まとめて処理することができる
 * クラウドへの通信頻度を抑えることができる
 * 一定期間のデータを対象として処理を実行できる

#2　要件
Greengrassでストリームマネージャーを利用する際の要件は以下の通りです。
##2-1　利用要件
ストリームマネージャーを利用するGreengrass Coreデバイスでは以下を満たしている必要があります。

|   | 要件 |
|:-|:-|
| Coreのバージョン | v1.10以降 ※Greengrass V2についてはバージョン要件なし|
| ランタイム | Java 8 ランタイム（JDK 8）をCoreデバイスにインストール |
| メモリ | 最低70MBのRAMが必要 |

なお、Greengrass V2はそもそもの利用にJava 8 ランタイム（JDK 8）のインストールが必要なため、公式ドキュメントの該当箇所からはランタイム要件の記述が抜けています。

また、Greengrassグループでストリームマネージャーを利用するにはグループの設定でストリームマネージャーを有効にする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/25fc6977-10bc-0655-a7fe-80efb5e2f1ab.png)

##2-2　ストリーム操作の前提
ストリームマネージャーの操作は、SDKのうち以下のバージョンのみサポートされています。

* Java SDk（v1.4.0 以降）
* Python SDK（v1.5.0 以降）
* Node.js SDK（v1.6.0 以降）

また、Pythonについては以下の注記があります。
>AWS IoT GreengrassPython 用の Core SDK には Python 3.7 以降が必要で、他のパッケージの依存関係があります。

以下の公式ドキュメント手順の通り、Python用のGreengrass SDKを使う場合は、依存関係のインストールが必要です。
参考：[ステップ 1: Lambda 関数のデプロイパッケージを作成する:](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/stream-manager-console.html#stream-manager-console-create-deployment-package)
#おわりに
Greengrassのストリームマネージャーについて簡単に整理しました。
データをストリームへ格納・エクスポートする方式を提供するもの、と理解しています。

いわゆるエッジ環境でETL処理をする、という際には、ストリームマネージャーが提供するストリームとのやり取りに加えて、Lambdaのなかでデータ処理用のコードを書いていく必要があるかと思います。

その点では、以下のソリューションアクセラレーターは参考になりそうです。
この図ではデータをRedisに溜めていますが、ここにストリームマネージャーを登場させることができそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/1ff9a707-4db8-eb16-995f-ef48f310ffe2.png)
引用元：[Extract, Transform, Load with AWS IoT Greengrass Solution Accelerator](https://aws.amazon.com/jp/iot/solutions/etl-accelerator/)

#参考文献

* [AWS IoT Greengrass コアでのデータストリームの管理](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/stream-manager.html)
 * 公式ドキュメントのストリームマネージャー箇所
* [Greengrass Core Python SDK - Docs >> greengrasssdk.stream_manager.data package](https://aws.github.io/aws-greengrass-core-sdk-python/_apidoc/greengrasssdk.stream_manager.data.html)
 * ストリームマネージャーのSDKドキュメント 
* [【AWS Black Belt Online Seminar】AWS IoT Greengrass](https://www.youtube.com/watch?v=z7a7_xI9fy8)
 * 動画32分頃からStreamManagerへの言及あり 
* [Getting Started with AWS IoT Greengrass Solution Accelerators for Edge Computing](https://www.youtube.com/watch?v=8crR0RZqqlk)
* [Extract, Transform, Load with AWS IoT Greengrass Solution Accelerator](https://aws.amazon.com/jp/iot/solutions/etl-accelerator/)
* [awslabs
/
aws-iot-greengrass-accelerators](https://github.com/awslabs/aws-iot-greengrass-accelerators/tree/master/accelerators/extract_transform_load)
* [ストリーム処理とは何か？＋2016年の出来事](https://qiita.com/kimutansk/items/60e48ec15e954fa95e1c)