Lambda 関数をAWS IoT Greengrasscore - AWS IoT Greengrass

のドキュメントを表示していますAWS IoT Greengrass Version 1。AWS IoT Greengrass Version 2の最新のメジャーバージョンです。AWS IoT Greengrass。の使用方法の詳細については、「」を参照してください。AWS IoT Greengrass V2の詳細については、AWS IoT Greengrass Version 2開発者ガイド

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Lambda 関数をAWS IoT Greengrasscore

AWS IoT Greengrassは、コンテナ化された Lambda ランタイム環境をユーザー定義のコアに提供します。AWS Lambda。にデプロイされた Lambda 関数AWS IoT Greengrassコアは、コアのローカル Lambda ランタイムで実行されます。ローカル Lambda 関数は、ローカルイベント、クラウドからのメッセージやその他のリソースによってトリガーされ、接続されたデバイスにローカルコンピューターの機能性をもたらします。たとえば、データをクラウドに送信する前にデバイスデータをフィルタリングするために、Greengrass Lambda 関数を使用できます。

Lambda 関数をコアにデプロイするには、この機能を Greengrass グループに追加し (既存の Lambda 機能を参照して行います)、この関数でグループ固有の設定を行い、このグループをデプロイします。関数がアクセスした場合AWSサービスでは、必要なアクセス許可をGreengrass グループのロール

Lambda 関数の実行方法 (アクセス許可、分離、メモリ制限など) を指定するパラメータを設定できます。詳細については、「Greengrass Lambda 関数のグループ固有の設定による実行の制御」を参照してください。

注記

これらの設定により、Docker コンテナで AWS IoT Greengrass を実行することもできます。詳細については、「Docker コンテナでの AWS IoT Greengrass の実行」を参照してください。

以下の表は、サポートされる AWS Lambda ランタイムおよび実行できる AWS IoT Greengrass Core ソフトウェアのバージョンを一覧表示しています。

言語あるいはプラットフォーム GGC のバージョン
Python 3.8 1.11
Python 3.7 1.9 以降
Python 2.7 * 1.0 以降
Java 8 1.1 以降
Node.js 12.x 1.10 以降
Node.js 8.10 * 1.9 以降
Node.js 6.10 * 1.1 以降
C、C++ 1.6 以降

* サポートされているバージョンのでは、これらのランタイムを使用する Lambda 関数を実行できます。AWS IoT Greengrassにそれらを作成することはできません。AWS Lambda。詳細については、「」を参照してください。ランタイムサポートポリシー()AWS Lambda開発者ガイド

Greengrass Lambda 関数用の SDK

AWSは、で実行中の Greengrass Lambda 関数で使用できる 3 つの SDK を提供しています。AWS IoT Greengrassコア。これらの SDK は別々のパッケージに含まれているため、関数で同時に使用できます。Greengrass Lambda 関数で SDK を使用するには、にアップロードする Lambda 関数デプロイパッケージに SDK を含めます。AWS Lambda。

AWS IoT Greengrass Core SDK

ローカル Lambda 関数がコアを操作できるようにします。

  • AWS IoT Core で MQTT メッセージを交換します。

  • Greengrass グループのコネクタ、デバイス、その他 Lambda 関数で MQTT メッセージを交換します。

  • ローカル車道サービスとやり取りを行います。

  • 他のローカル Lambda 関数を呼び出します。

  • シークレットリソースにアクセスします。

  • ストリームマネージャーと対話します。

AWS IoT GreengrassにはAWS IoT GreengrassCore SDK には、GitHub の次の言語とプラットフォームがあります。

インクルードするにはAWS IoT GreengrassLambda 関数デプロイパッケージにおける Core SDK 依存関係

  1. 言語またはプラットフォームをダウンロードするAWS IoT GreengrassLambda 関数のランタイムに一致するコア SDK パッケージ。

  2. ダウンロードしたパッケージを解凍し、SDK を取得します。SDK は greengrasssdk フォルダです。

  3. Includegreengrasssdk関数コードを含む Lambda 関数デプロイパッケージにを含めます。これは、アップロードするパッケージです。AWS LambdaLambda 関数を作成するときに。

 

StreamManagerClient

次のもののみAWS IoT GreengrassコアSDKは、ストリームマネージャー操作:

  • Java SDK (v1.4.0 以降)

  • Python SDK (v1.5.0 以降)

  • Node.js SDK (v1.6.0 以降)

を使用するにはAWS IoT GreengrassPython の Core SDK for Python は、Python 3.7 以降をインストールする必要があります。また、Python Lambda 関数のデプロイパッケージに含める依存関係もインストールする必要があります。

  1. requirements.txt ファイルが格納されている SDK ディレクトリに移動します。このファイルには、依存関係が一覧表示されます。

  2. SDK の依存関係をインストールします。たとえば、次の pip コマンドを実行して、現在のディレクトリにインストールします。

    pip install --target . -r requirements.txt

 

のインストールAWS IoT Greengrassコアデバイスでの Python のコアSDK

Python Lambda 関数を実行している場合は、pipをインストールするにはAWS IoT GreengrassCore デバイスで Python 用の Core SDK。次に、Lambda 関数デプロイパッケージに SDK を含めずに関数をデプロイできます。詳細については、「greengrasssdk」を参照してください。

このサポートは、サイズ制限のあるコアを対象としています。可能な場合は、Lambda 関数のデプロイパッケージに SDK を含めることをお勧めします。

 

AWS IoT Greengrass Machine Learning SDK

ローカル Lambda 関数を有効にして、MLリソースとして Greengrass コアにデプロイされる機械学習 (ML) モデルを使用します。Lambda 関数は、この SDK を使用してコネクタとしてコアにデプロイされているローカル推論サービスを呼び出し、このサービスとやり取りできます。また、Lambda 関数および ML コネクタは、アップロードおよび発行のために、データを ML Feedback コネクタに送信するために、この SDK を使用できます。SDK を使用するコード例などの詳細については、「ML イメージ分類コネクタ」、「ML オブジェクト検出コネクタ」、および「ML フィードバックコネクタ」を参照してください。

次の表は、SDK バージョンのサポートされている言語またはプラットフォームと、実行できる AWS IoT Greengrass Core ソフトウェアのバージョンの一覧です。

SDK のバージョン 言語あるいはプラットフォーム 必要な GGC バージョン Changelog
1.1.0 Python 3.7 または 2.7 1.9.3 以降 Python 3.7 のサポートと新しい feedback クライアントを追加しました。
1.0.0 Python 2.7 1.7 以降 初回リリース。

ダウンロード情報については、「AWS IoT Greengrass ML SDK ソフトウェア」を参照してください。

AWS SDK

ローカル Lambda 関数で、AWSサービス (Amazon S3、DynamoDB、など)AWS IoT, およびAWS IoT Greengrass。を使用するにはAWSSDK を Greengrass Lambda 関数で使用するには、それをデプロイパッケージに含める必要があります。使用すると、AWSSDKと同じパッケージにAWS IoT GreengrassCore SDK で、Lambda 関数が正しい名前空間を使用していることを確認します。Greengrass Lambda 関数は、このコアがオフラインの場合にクラウドサービスと通信できません。

のダウンロードAWSSDKは、リソースセンターのご利用開始にあたって

デプロイパッケージの作成の詳細については、」Lambda 関数の作成とパッケージ化入門チュートリアルまたは [はじめに] で、デプロイパッケージを作成する()AWS Lambda開発者ガイド

クラウドベースの Lambda 関数の移行

-AWS IoT GreengrassCore SDK にはAWSSDK プログラミングモデルにより、クラウド向けに開発された Lambda 関数を上で実行する Lambda 関数に簡単に移植します。AWS IoT Greengrassコア。

たとえば、次の Python Lambda 関数は、AWS SDK for Python (Boto3)トピックにメッセージを発行するにはsome/topicクラウドでをデプロイする:

import boto3 iot_client = boto3.client('iot-data') response = iot_client.publish( topic='some/topic', qos=0, payload='Some payload'.encode() )

関数を移植するにはAWS IoT Greengrassコアのimportステートメントおよびclient初期化、boto3モジュール名をgreengrasssdk次の例に示すように、次のようにします。

import greengrasssdk iot_client = greengrasssdk.client('iot-data') iot_client.publish( topic='some/topic', qos=0, payload='Some payload'.encode() )
注記

AWS IoT Greengrass コア SDK では、QoS = 0 のみの MQTT メッセージを送信できます。詳細については、「サービスのメッセージの品質」を参照してください。

また、プログラミングモデル間の類似性により、クラウド上で Lambda 関数を開発し、それらをAWS IoT Greengrass最小限の労力で。Lambda 実行ファイルはクラウド上で実行されないため、AWSSDK を使用して、デプロイ前にクラウドで開発できます。

エイリアスまたはバージョンによる Lambda 関数のリファレンス

Greengrass グループは、Lambda 関数をエイリアス (推奨) またはバージョン別に参照できます。エイリアスを使用すると、関数コードの更新時にサブスクリプションテーブルまたはグループ定義を変更する必要がないため、コード更新を簡単に管理できます。代わりに、新しい関数バージョンにエイリアスを指定するだけです。エイリアスは、グループデプロイ中にバージョン番号を解決します。エイリアスを使用すると、解決されたバージョンはデプロイ時にエイリアスが示すバージョンに更新されます。

AWS IoT Greengrassは Lambda エイリアスをサポートしていません。$LATESTバージョン。$LATESTバージョンは、変更不可で発行された関数バージョンにバインドされず、いつでも変更できます。これはAWS IoT Greengrassバージョン不変の原理。

Greengrass Lambda 関数がコード変更によって常に更新されるようにするための一般的な方法は、PRODUCTIONをGreengrass グループに登録し、サブスクリプションに登録します。Lambda 関数の新しいバージョンを本稼働環境に移行すると、エイリアスが最新の安定バージョンを指定し、グループを再デプロイします。また、このメソッドを使用して以前のバージョンにロールバックすることもできます。

Greengrass Lambda 関数の通信フロー

Greengrass Lambda 関数は、の他のメンバーと通信するためのいくつかの方法をサポートしていますAWS IoT Greengrassグループ、ローカルサービス、およびクラウドサービス (AWSのサービス)。

MQTT メッセージを使用した通信

Lambda 関数は、サブスクリプションによって制御される発行-サブスクリプションパターンを使用して MQTT メッセージを送受信できます。

このミュニケーションフローにより、Lambda 関数は以下のエンティティとメッセージを交換することができる。

  • グループ内のデバイス。

  • グループのコネクタ。

  • グループ内の他の Lambda 関数。

  • AWS IoT.

  • ローカルデバイスシャドウサービス。

サブスクリプションは、メッセージ送信元、メッセージターゲット、および送信元からターゲットへのメッセージのルーティングに使用されるトピック (または件名) を定義します。Lambda 関数に発行されるメッセージは、関数に登録されたハンドラーに渡されます。サブスクリプションはより高度なセキュリティを可能にし、予測可能なやり取りを提供します。詳細については、「MQTT メッセージングワークフローにおけるマネージドサブスクリプション」を参照してください。

注記

Greengrass Lambda 関数は、デバイス、コネクタ、他の関数、およびコアがオフラインのときにローカルシャドウとメッセージを交換できますが、AWS IoTキューに格納されます。詳細については、「クラウドターゲットの MQTT メッセージキュー」を参照してください。

他の通信フロー

  • コアデバイスでローカルデバイスおよびボリュームリソース、機械学習モデルとやり取りするため、Greengrass Lambda 関数はプラットフォーム固有のオペレーティングシステムインターフェイスを使用します。たとえば、を使用できます。openメソッドでosモジュールを Python 関数で使用します。関数がリソースにアクセスすることを許可するには、この関数がリソースに関連し、read-only あるいは read-write アクセス許可を付与されていることが必要です。詳細情報については、以下を参照してください。AWS IoT Greengrassコアバージョンの可用性の詳細については、Lambda 関数とコネクタを使ってローカルリソースにアクセスするおよびLambda 関数コードから機械学習リソースにアクセスする

    注記

    コンテナ化せずに Lambda 関数を実行する場合、アタッチされたローカルデバイスおよびボリュームリソースを使用することはできず、直接それらのリソースにアクセスする必要があります。

  • Lambda 関数は、LambdaクライアントでAWS IoT GreengrassGreengrass グループ内の他の Lambda 関数を呼び出すコア SDK。

  • Lambda 関数は、AWSSDK を使用してとやり取りする SDKAWSのサービス。詳細については、「」を参照してください。AWSSDK

  • Lambda 関数は、クラウドベースの Lambda 関数と同様に、サードパーティーのインターフェイスを使用して外部のクラウドサービスと通信できます。

注記

Greengrass スのLambda 関数はAWSまたは他のクラウドサービスで、コアがオフラインの場合に発生します。

入力 MQTT トピック (または件名) の取得

AWS IoT Greengrassは、サブスクリプションを使用して、グループ内のデバイス、Lambda 関数、およびコネクタ間の MQTT メッセージの交換を制御し、さらにAWS IoTローカルシャドウサービス。サブスクリプションは、メッセージソース、メッセージターゲット、およびメッセージのルーティングに使用される MQTT トピックを定義します。ターゲットが Lambda 関数の場合、ソースがメッセージをパブリッシュすると、関数のハンドラーが呼び出されます。詳細については、「MQTT メッセージを使用した通信」を参照してください。

次の例では、Lambda 関数から入力トピックを取得する方法を示していますcontextハンドラに渡されます。これを行うには、コンテキスト階層から subject キーにアクセスします (context.client_context.custom['subject'])。この例では、入力 JSON メッセージも解析してから、解析したトピックとメッセージを発行します。

注記

AWS IoT Greengrass API では、サブスクリプションのトピックは subject プロパティで表されます。

import greengrasssdk import logging client = greengrasssdk.client('iot-data') OUTPUT_TOPIC = 'test/topic_results' def get_input_topic(context): try: topic = context.client_context.custom['subject'] except Exception as e: logging.error('Topic could not be parsed. ' + repr(e)) return topic def get_input_message(event): try: message = event['test-key'] except Exception as e: logging.error('Message could not be parsed. ' + repr(e)) return message def function_handler(event, context): try: input_topic = get_input_topic(context) input_message = get_input_message(event) response = 'Invoked on topic "%s" with message "%s"' % (input_topic, input_message) logging.info(response) except Exception as e: logging.error(e) client.publish(topic=OUTPUT_TOPIC, payload=response) return

関数をテストするには、デフォルトの設定を使用してグループに追加します。次に、以下のサブスクリプションを追加し、グループをデプロイします。手順については、「モジュール 3 (パート 1): Lambda 関数AWS IoT Greengrass」を参照してください。

送信元 ターゲット トピックのフィルター
IoT クラウド この関数 test/input_message
この関数 IoT クラウド test/topic_results

デプロイが完了したら、関数を呼び出します。

  1. 左AWS IoTコンソールで、Testページで.

  2. test/topic_results トピックにサブスクライブします。

  3. test/input_message トピックにメッセージを発行します。この例では、JSON メッセージに test-key プロパティを含める必要があります。

    { "test-key": "Some string value" }

    成功した場合、関数は入力トピックとメッセージ文字列を test/topic_results トピックに発行します。

Greengrass Lambda 関数のライフサイクル設定

Greengrass Lambda 関数のライフサイクルは、関数が開始する時期とどのようにコンテナを作成して使用するかを定義します。また、ライフサイクルは関数ハンドラの外部にある変数および処理中のロジックが保持されるかを定義します。

AWS IoT Greengrass は、オンデマンド (デフォルト) または 長い存続期間のライフサイクルをサポートしています。

  • オンデマンド 関数は、呼び出されたときに起動し、実行するタスクが残っていないときに停止します。関数の呼び出しは、再使用できる既存のコンテナが利用可能な場合を除き、呼び出し処理に別のコンテナ (またはサンドボックス) を作成します。関数に送信されたデータは、いずれかのコンテナによってプルされる可能性があります。

    関数の複数の呼び出しは、同時に実行できます。

    関数ハンドラの外部で定義される変数や前処理ロジックは、新しいコンテナが作成されるときに保持されません。

  • 長寿命(またはpinned) 関数は、AWS IoT Greengrassコアが単一のコンテナで起動して実行されます。関数に送信されたすべてのデータは、同じコンテナによってプルされます。

    複数の呼び出しは、前の呼び出しが実行されるまでキュー状態になります。

    関数ハンドラの外部で定義される変数と事前処理ロジックは、このハンドラの毎回の呼び出しのために保持されます。

    長い存続期間の Lambda 関数は、初期の入力が全くない実行を開始する必要がある場合に便利です。たとえば、存続期間が長い関数は、関数がデバイスデータの受信を開始するときに備えて、ML モデルをロードして処理を開始できます。

    注記

    長い存続期間の関数には、そのハンドラの呼び出しに関連付けられたタイムアウトがあることに注意してください。実行中のコードを無期限で実行する場合には、ハンドラ外でこれを開始する必要があります。関数の初期化の完了を妨害するようなハンドラ外のブロックコードがないことを確認します。

    これらの関数は、コアが停止する(グループのデプロイ中やデバイスの再起動中など)か、関数がエラー状態(ハンドラのタイムアウト、キャッチされない例外、またはメモリ制限を超えたときなど)にならない限り実行されます。

コンテナの再使用の詳細については、」でのコンテナの再利用についてAWS Lambda()AWSブログを計算。

Lambda 実行ファイル

この機能は、で使用できます。AWS IoT GreengrassCore v1.6 以降。

Lambda 実行可能ファイルは、コア環境でバイナリコードを実行するために使用できる Greengrass Lambda 関数です。これにより、デバイス固有の機能を実行することができ、コンパイルされたコードの小さなフットプリントの利点を活用できます。Lambda 実行可能ファイルは、イベントによって呼び出し、他の関数の呼び出し、そしてローカルリソースにアクセスができます。

Lambda 実行可能ファイルは、バイナリエンコードタイプのみ (JSON ではなく) をサポートします。それ以外では、Greengrass グループで管理し、他の Greengrass Lambda 関数のようにデプロイすることもできます。ただし、Lambda 実行可能ファイルの作成プロセスは、Python、Java、および Node.js の Lambda 関数の作成とは異なります。

  • 使用することはできません。AWS Lambdaコンソールを使用して Lambda 実行可能ファイルを作成(または管理)します。Lambda 実行可能ファイルは、AWS LambdaAPI。

  • 関数をにアップロードします。AWS Lambdaコンパイルされた実行可能ファイルとして、AWS IoT GreengrassCore SDK for C

  • 実行可能ファイル名を関数のハンドラとして指定します。

Lambda 実行可能ファイルは、その関数コードに特定の呼び出しおよびプログラミングパターンが実装されている必要があります。たとえば、main メソッドは次を満たす必要があります。

  • Greengrass 内部グローバル変数を初期化する gg_global_init 呼び出し。この関数は、スレッドの作成前、およびその他すべての AWS IoT Greengrass Core SDK 関数の呼び出し前に呼び出される必要があります。

  • 電話gg_runtime_startGreengrass Lambda ランタイムに関数ハンドラを登録します。この関数は初期化中に呼び出す必要があります。この関数を呼び出すと、現在のスレッドはランタイムで使用されます。オプションの GG_RT_OPT_ASYNC パラメータはこの関数をブロックしませんが、代わりにランタイムに新規のスレッドを作成します。この関数は SIGTERM ハンドラを使用します。

次のスニペットは、GitHub の mainsimple_handler.c コード例の メソッドです。

int main() { gg_error err = GGE_SUCCESS; err = gg_global_init(0); if(err) { gg_log(GG_LOG_ERROR, "gg_global_init failed %d", err); goto cleanup; } gg_runtime_start(handler, 0); cleanup: return -1; }

実装の要件や制限などの詳細については、AWS IoT GreengrassCore SDK for C

Lambda 実行可能ファイルの作成

SDK でコードをコンパイルしたら、AWS LambdaAPI を使用して Lambda 関数を作成し、コンパイルした実行可能ファイルをアップロードします。

注記

関数は、C89 互換性のあるコンパイラーでコンパイルする必要があります。

次の例では、を使用します。関数の作成CLI コマンドを使用して Lambda 実行可能ファイルを作成します。このコマンドは以下を指定します。

  • ハンドラの実行可能ファイルの名前。これは、コンパイルされた実行可能ファイルの正確な名前である必要があります。

  • コンパイルされた実行可能ファイルを含む .zip ファイルへのパス。

  • ランタイムの arn:aws:greengrass:::runtime/function/executable。これは、すべての Lambda 実行可能ファイルのランタイムです。

注記

を使用する場合roleで、すべての Lambda 実行ロールの ARN を指定します。AWS IoT Greengrassはこのロールを使用しませんが、このパラメータは関数を作成するために必要となります。Lambda 実行ロールの詳細については、「」を参照してください。AWS Lambdaアクセス権限モデル()AWS Lambda開発者ガイド

aws lambda create-function \ --region aws-region \ --function-name function-name \ --handler executable-name \ --role role-arn \ --zip-file fileb://file-name.zip \ --runtime arn:aws:greengrass:::runtime/function/executable

次に、AWS Lambda API を使用してバージョンを発行し、エイリアスを作成します。

  • publish-version を使用して、関数バージョンを発行します。

    aws lambda publish-version \ --function-name function-name \ --region aws-region
  • create-alias を使用して、先ほど発行したバージョンを指すエイリアスを作成します。Greengrass グループに Lambda 関数を追加する場合、この関数をエイリアスで参照することが推奨されます。

    aws lambda create-alias \ --function-name function-name \ --name alias-name \ --function-version version-number \ --region aws-region
注記

-AWS Lambdaコンソールには、Lambda 実行可能ファイルは表示されません。関数コードを更新するには、AWS Lambda API を使用する必要があります。

次に、Lambda 実行可能ファイルを Greengrass グループに追加し、このグループ固有の設定でバイナリ入力データを受け入れるように設定して、グループをデプロイします。これは AWS IoT Greengrass コンソールまたは AWS IoT Greengrass API を使用して実行できます。