Coreデバイスのテレメトリデータ収集が簡単に!Greengrass Core 1.11.0がリリースされました

個人的にPython3.8対応がうれしいです
2020.09.19

はじめに

CX事業本部@大阪の岩田です。

2020/9/18付けでGreengrass Core 1.11.0がリリースされました。

このブログではGreengrass Core 1.11.0から追加された新機能について紹介させて頂きます。

Greengrass core 1.11.0の新機能

以下の機能が追加されています。

  • テレメトリデータを収集し、クラウドに送信する機能の追加
  • Coreデバイス上で実行可能なローカルHTTP APIの追加
  • ストリームマネージャーのデータ出力先としてS3とIoT SiteWiseのサポートを追加
  • ローカルLambdaのランタイムとしてPython3.8のサポートを追加
  • 設定ファイル(config.json)にパラメータ追加
  • Greengrass Groupごとに設定可能なデバイス数とサブスクリプション数の上限が増加

それぞれ詳細を見ていきましょう。

テレメトリデータの収集

Coreデバイス上でメモリ使用量やCPU使用率といったテレメトリデータを定期的に収集し、クラウドに送信する機能が追加されました。収集されるメトリクスの一覧は以下のドキュメントを参考にして下さい。

https://docs.aws.amazon.com/greengrass/latest/developerguide/telemetry.html

テレメトリデータは1時間ごとに収集され、予約済みのMQTTトピックを介して24時間ごとにクラウドに送信されます。クラウド側ではEventBridgeのルールを定義することで受け取ったテレメトリデータをもとに諸々の処理を実行することができます。

24時間ごとの送信ということなので、まだ実際の動作は確認できていないのですが、マネコンを見ると色々と設定可能になっていることが分かります。

Coreデバイス上で実行可能なローカルHTTP API

Coreデバイス上のhttp://localhost:<ポート番号>/2016-11-01/health/workersというエンドポイントで、Greengrassの各種ワーカープロセスのヘルスチェックが可能なローカルのHTTP APIが提供されるようになりました。※ポート番号は後述のggDaemonPortで設定されたポートになります。

このエンドポイントに対してGETリクエストを発行することで全ワーカーのヘルス情報が取得可能です。試しに実行してみます。

$ curl http://localhost:8000/2016-11-01/health/workers

以下のレスポンスが返却されました。

[
	{
		"FuncArn": "arn:aws:lambda:::function:GGSecretManager:1",
		"WorkerId": "04fa110b-5478-4f1c-71c8-f830b7e15d7b",
		"ProcessId": 4960,
		"WorkerState": "Waiting"
	},
	{
		"FuncArn": "arn:aws:lambda:::function:GGCloudSpooler:1",
		"WorkerId": "9d08489c-9b37-49dc-6dcf-d205c20cc63f",
		"ProcessId": 5005,
		"WorkerState": "Waiting"
	},
	{
		"FuncArn": "arn:aws:lambda:::function:GGShadowSyncManager",
		"WorkerId": "0be5126e-1b89-4c71-7d30-ee319dc4dbfe",
		"ProcessId": 5233,
		"WorkerState": "Waiting"
	},
	{
		"FuncArn": "arn:aws:lambda:::function:GGIPDetector:1",
		"WorkerId": "40045de7-3e32-45f3-7a28-2ad3b928b062",
		"ProcessId": 5251,
		"WorkerState": "Waiting"
	},
	{
		"FuncArn": "arn:aws:lambda:::function:GGStreamManager:1",
		"WorkerId": "4b4e993a-9464-4a43-68fe-31113d0c4d21",
		"ProcessId": 5155,
		"WorkerState": "Initialized"
	},
	{
		"FuncArn": "arn:aws:lambda:::function:GGDeviceCertificateManager",
		"WorkerId": "616346ac-f018-4295-5944-124caaea79c5",
		"ProcessId": 5042,
		"WorkerState": "Waiting"
	},
	{
		"FuncArn": "arn:aws:lambda:::function:GGConnManager",
		"WorkerId": "a1d487e4-d3c8-47de-7989-c4b4154931f3",
		"ProcessId": 5066,
		"WorkerState": "Waiting"
	},
	{
		"FuncArn": "arn:aws:lambda:::function:GGShadowService",
		"WorkerId": "57be8acc-a220-4689-419e-9f6b0e7e6bad",
		"ProcessId": 5201,
		"WorkerState": "Waiting"
	},
	{
		"FuncArn": "arn:aws:lambda:::function:GGTES",
		"WorkerId": "d57c9af3-4d54-41ee-664c-3c2a28630109",
		"ProcessId": 5124,
		"WorkerState": "Waiting"
	}
]

また、リクエストボディにチェック対象となるワーカー(Lambda)のARNを指定してPOSTすることで、特定のワーカーのヘルス情報を取得することが可能です。Greengrassのデフォルトで稼働するワーカーのARNは以下の通りです。

ワーカー名 ARN 役割
GGCloudSpooler arn:aws:lambda:::function:GGCloudSpooler:1 IoT Core<->コアデバイス間のMQTTメッセージの送受信を管理するワーカー
GGConnManager arn:aws:lambda:::function:GGConnManager コアデバイス<->デバイス間のMQTTメッセージをルーティングするワーカー
GGDeviceCertificateManager arn:aws:lambda:::function:GGDeviceCertificateManager GGConnManagerが利用するサーバー証明書を生成するワーカー
GGIPDetector arn:aws:lambda:::function:GGIPDetector:1 Greengrass GroupのデバイスがコアデバイスのIPアドレスを検出するために利用するサービスを管理する
GGSecretManager arn:aws:lambda:::function:GGSecretManager:1 ローカルのシークレット管理を行うワーカー
GGShadowService arn:aws:lambda:::function:GGShadowService ローカルシャドウを管理するワーカー
GGShadowSyncManager arn:aws:lambda:::function:GGShadowSyncManager ローカルシャドウとクラウド上のデバイスシャドウを動悸するためのワーカー
GGStreamManager arn:aws:lambda:::function:GGStreamManager:1 ストリームマネージャーのワーカー
GGTES arn:aws:lambda:::function:GGTES Greengrass用IAMロールのクレデンシャルを取得するトークン交換サービス

これらのワーカーに加えて、対象のCoreデバイスにデプロイしたローカルLambdaのARNも指定可能です。

試しにGGConnManagerGGCloudSpoolerだけに限定してヘルスチェックを実行してみましょう

$ curl -XPOST http://localhost:8000/2016-11-01/health/workers --data '{"FuncArns": ["arn:aws:lambda:::function:GGConnManager","arn:aws:lambda:::function:GGCloudSpooler:1"]}'

以下のようなレスポンスが返却されます。

{
	"Workers": [
		{
			"FuncArn": "arn:aws:lambda:::function:GGCloudSpooler:1",
			"WorkerId": "9d08489c-9b37-49dc-6dcf-d205c20cc63f",
			"ProcessId": 5005,
			"WorkerState": "Waiting"
		},
		{
			"FuncArn": "arn:aws:lambda:::function:GGConnManager",
			"WorkerId": "a1d487e4-d3c8-47de-7989-c4b4154931f3",
			"ProcessId": 5066,
			"WorkerState": "Waiting"
		}
	],
	"InvalidArns": null
}

(参考) https://docs.aws.amazon.com/greengrass/latest/developerguide/health-check.html

ストリームマネージャーのデータ出力先追加

Greengrass Core1.10からストリームマネージャーという機能が追加されています。

これまでストリームマネージャーのデータ出力先としては

  • IoT Analytics
  • Kinesis Data Streams

の2つがサポートされていましたが、さらに

  • S3
  • IoT SiteWise

が指定できるようになりました。

このアップデートに伴い、ストリームマネージャーのパラメータに以下のパラメータが追加されています。

  • STREAM_MANAGER_READ_ONLY_DIRS

    S3にアップロードするファイルを格納するディレクトリを指定するパラメータで、カンマ区切りで複数のディレクトリが指定可能です。ルートファイルシステム以外のパーティションもしくはルートファイルシステムの/tmp以下が指定可能です。

  • STREAM_MANAGER_EXPORTER_S3_DESTINATION_MULTIPART_UPLOAD_MIN_PART_SIZE_BYTES

    S3へのマルチパートアップロードにおけるパートの最小サイズをバイト単位で指定するパラメータです。デフォルトおよび最小値は5Mとなります。

(参考)https://docs.aws.amazon.com/greengrass/latest/developerguide/configure-stream-manager.html

ローカルLambdaのランタイムとしてPython3.8のサポートを追加

そのままな内容ですが、ローカルLambdaのランタイムとしてPython3.8が選択可能になりました

設定ファイルのパラメータ追加

Greengrass Coreの設定ファイルconfig.jsonに以下の設定値が追加されました

  • ggDaemonPort

    Greengrass Coreが稼働するポート番号を指定できる設定値です。1024 ~ 65535の範囲で指定可能で、デフォルトは8000です。別のプログラムが8000ポートを使用しているようなユースケースにも対応できるようになりました。

  • systemComponentAuthTimeout

    Greengrass Coreの認証完了までのタイムアウト値をミリ秒単位で指定できる設定値です。500 ~ 5000の範囲で指定可能で、デフォルトは5000です。

(参考)https://docs.aws.amazon.com/greengrass/latest/developerguide/gg-core.html#config-json

設定可能なデバイス数とサブスクリプション数の上限が増加

以下の項目についてGrenngrass Groupごとに設定可能な上限値が増加しています。

  • デバイス数の上限が200から2,500に増加
  • サブスクリプション数の上限が1,000から10,000に増加

1台のコアデバイスでより多くのデバイスが管理できるようになったと言えます。

まとめ

前回リリース(1.10.0)から少し間が空いたこともあり、なかなか盛りだくさんなアップデートですね。これらの新機能を是非積極的に活用していきましょう!