Greengrass Lambda 関数のグループ固有の設定による実行の制御 - 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開発者ガイド

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

Greengrass Lambda 関数のグループ固有の設定による実行の制御

AWS IoT Greengrassは、Greengrass Lambda 関数のクラウドベースの管理を提供しています。Lambda 関数のコードと依存関係はAWS Lambdaでは、Lambda 関数が Greengrass グループで実行される場合、その動作を設定できます。

グループ固有構成設定

AWS IoT Greengrassでは、Greengrass Lambda 関数に関する次のグループ固有の構成設定について説明します。

として実行

Lambda 関数の実行に使用されるアクセス ID。デフォルトでは、Lambda 関数は、グループのデフォルトのアクセスアイデンティティ。通常の場合、これはスタンダードの AWS IoT Greengrass システムアカウント (ggc_user および ggc_group) です。この設定を変更し、Lambda 関数の実行に必要なアクセス許可を持つユーザー ID とグループ ID を選択できます。UID と GID の両方をオーバーライドするか、他方のフィールドを空のままにして一方だけをオーバーライドすることもできます。この設定により、デバイスリソースへのアクセスをより詳細に制御できます。Greengrass ハードウェアの設定では、適切なリソース制限、適切なファイルへのアクセス許可、および Lambda 関数の実行に使用されるアクセス許可を持つユーザーとグループの適切なディスククォータを使用することをお勧めします。

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

重要

やむを得ない場合を除き、Lambda 関数を root として実行することは避けてください。root として実行すると、次のリスクが高くなります。

  • 重要なファイルを誤って削除するなど、意図しない変更が行われる恐れがあります。

  • 悪意のあるユーザーがデータとデバイスにアクセスする危険性。

  • Dockerコンテナが--net=hostおよびUID=EUID=0

root として実行する必要がある場合は、それを有効にするように AWS IoT Greengrass 設定を更新する必要があります。詳細については、「Lambda 関数をルートとして実行する」を参照してください。

UID (数値)

Lambda 関数の実行に必要なアクセス許可を持つユーザーのユーザー ID。この設定を利用できるのは、別のユーザー ID/グループ ID として実行を選択した場合に限ります。「」を使用できます。getent passwdコマンドをAWS IoT Greengrassコアデバイスで Lambda 関数の実行に使用するユーザー ID を検索できます。

同じ UID を使用してプロセスと Lambda 関数を Greengrass コアデバイスで実行する場合、Greengrass グループロールはプロセスに一時的な認証情報を付与できます。プロセスは、Greengrass コアデプロイメント全体にわたって一時的な認証情報を使用できます。

GID (数値)

Lambda 関数の実行に必要なアクセス許可を持つグループのグループ ID。この設定を利用できるのは、別のユーザー ID/グループ ID として実行を選択した場合に限ります。「」を使用できます。getent groupコマンドをAWS IoT Greengrassコアデバイスで Lambda 関数の実行に使用するグループ ID を検索できます。

コンテナ化

Lambda 関数を実行する際に、グループのデフォルトのコンテナ化を使用するかどうかを選択します。または、この Lambda 関数で常に使用するコンテナ化を指定します。

Lambda 関数のコンテナ化モードは、その分離レベルを決定します。

  • コンテナ化された Lambda 関数はGreengrass コンテナモード。Lambda 関数は、分離されたランタイム環境 (または名前空間) でAWS IoT Greengrassコンテナ。

  • 非コンテナー化された Lambda 関数はコンテナなしモード。Lambda 関数は、分離することなく、通常の Linux プロセスとして実行されます。

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

コンテナ化を使用しないで実行する必要があるユースケースを除き、Lambda 関数を Greengrass コンテナで実行することをお勧めします。Greengrass コンテナで Lambda 関数を実行する場合、アタッチされたローカルおよびデバイスリソースを使用することで、分離の利点とセキュリティの向上を得られます。コンテナ化を変更する場合は、事前に「Lambda 関数のコンテナ化を選択する場合の考慮事項」を参照してください。

注記

デバイスカーネル名前空間および cgroup を有効化せずに実行するには、コンテナ化を使用しないですべての Lambda 関数を実行する必要があります。これを簡単に行うには、グループのデフォルトのコンテナ化を設定できます。詳細については、グループ内の Lambda 関数のコンテナ化のデフォルト設定 を参照してください。

メモリ制限

関数のメモリ割り当て。デフォルトでは 16 MB です。

注記

コンテナ化を使用しないで実行するように Lambda 関数を変更すると、メモリ制限の設定が使用できなくなります。コンテナ化を使用しないで実行される Lambda 関数は、メモリ制限がありません。コンテナ化を使用しないで実行するように Lambda 関数またはグループのデフォルトのコンテナ化設定を変更すると、メモリ制限の設定は破棄されます。

タイムアウト

関数あるいはリクエストが終了するまでの時間数。デフォルト値は 3 秒です。

Lifecycle

Lambda 関数のライフサイクルは、オンデまたは存続期間の長い。デフォルトはオンデマンドです。

オンデマンド Lambda 関数は、呼び出されたときに新規または再利用されるコンテナで開始します。関数に対するリクエストは、任意の利用可能なコンテナで処理される可能性があります。存続期間の長い-またはpinned— Lambda 関数は、AWS IoT Greengrassが起動し、独自のコンテナ (またはサンドボックス) で実行し続けます。関数へのすべてのリクエストは、同じコンテナで処理されます。詳細については、「Greengrass Lambda 関数のライフサイクル設定」を参照してください。

/sys ディレクトリへの読み込みアクセス

関数がホストの /sys フォルダにアクセスできるかどうかを設定します。関数が /sys からデバイス情報を読み取る必要があるときに使用します。デフォルト: false。

注記

この設定は、コンテナ化を使用しないで Lambda 関数を実行する場合、使用できません。コンテナ化を使用しないで実行するように Lambda 関数を変更すると、この設定の値は破棄されます。

入力ペイロードのデータ型

関数の入力ペイロードの予期されるエンコードタイプ (JSON あるいは バイナリ)。デフォルトは JSON です。

バイナリエンコードタイプのサポートは、AWS IoT Greengrass Core ソフトウェア v1.5.0 および AWS IoT Greengrass Core SDK v1.1.0 から利用可能となりました。デバイスのハードウェア機能が制限されていているため、JSON データ型を構築することが難しいかできないことが多いので、バイナリ入力データを受け入れることは、関数がデバイスデータとやり取りするために便利です。

注記

Lambda 実行ファイルは、JSON ではなく、バイナリエンコードタイプのみをサポートします。

環境変数

関数コードとライブラリに設定を動的に渡すことができるキー値ペア。ローカル環境変数は AWS Lambda 関数環境変数と同様に動作しますが、Core 環境で利用可能です。

[リソースアクセスポリシー]

最大 10 個のリストローカルリソース,シークレットリソース, および機械学習リソースと、Lambda 関数がアクセスを許可されている対応するread-onlyまたはread-writeアクセス許可。コンソールでは、上記の関連するリソースは、関数の [リソース] ページに一覧表示されます。

-コンテナ化モードは、Lambda 関数がローカルデバイスとボリュームリソース、機械学習リソースにアクセスする方法に影響します。

  • コンテナ化されていない Lambda 関数は、コアデバイス上のファイルシステムを介してローカルデバイスとボリュームリソースに直接アクセスする必要があります。

  • コンテナ化されていない Lambda 関数が Greengrass グループの機械学習リソースにアクセスできるようにするには、機械学習リソースでリソース所有者とアクセス権限のプロパティを設定する必要があります。詳細については、「Lambda 関数から機械学習リソースにアクセスする」を参照してください。

の使用方法の詳細については、AWS IoT GreengrassAPI を使用して、ユーザー定義の Lambda 関数のグループ固有の構成設定を設定できます。CreateFunctionDefinition()AWS IoT Greengrass Version 1API リファレンスまたは関数定義の作成()AWS CLIコマンドリファレンス。Greengrass コアに Lambda 関数をデプロイするには、関数を含む関数定義バージョンを作成し、関数定義バージョンと他のグループコンポーネントを参照するグループバージョンを作成してから、グループをデプロイする

Lambda 関数をルートとして実行する

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

1 つ以上の Lambda 関数を root として実行する前に、最初にAWS IoT Greengrass設定を使用してサポートを有効にします。デフォルトでは、Lambda 関数を root として実行するためのSupport はオフになっています。Lambda 関数をデプロイしようとして root (UID および GID が 0) として実行すると、デプロイが失敗し、AWS IoT Greengrassの設定 ランタイムログ (greengrass_root/ggc/var/log/system/runtime.log) に以下のようなエラーが表示されます。

lambda(s) [list of function arns] are configured to run as root while Greengrass is not configured to run lambdas with root permissions
重要

やむを得ない場合を除き、Lambda 関数を root として実行することは避けてください。root として実行すると、次のリスクが高くなります。

  • 重要なファイルを誤って削除するなど、意図しない変更が行われる恐れがあります。

  • 悪意のあるユーザーがデータとデバイスにアクセスする危険性。

  • Dockerコンテナが--net=hostおよびUID=EUID=0

Lambda 関数を root として実行することを許可するには

  1. AWS IoT Greengrass デバイスで、greengrass-root/config フォルダに移動します。

    注記

    デフォルトでは、greengrass-root は /greengrass ディレクトリです。

  2. config.json ファイルを編集し、"allowFunctionsToRunAsRoot" : "yes"runtime フィールドに追加します。次に例を示します。

    { "coreThing" : { ... }, "runtime" : { ... "allowFunctionsToRunAsRoot" : "yes" }, ... }
  3. 次のコマンドを使用して AWS IoT Greengrass を再起動します。

    cd /greengrass/ggc/core sudo ./greengrassd restart

    これで Lambda 関数のユーザー ID とグループ ID (UID/GID) を 0 に設定し、この Lambda 関数をルートとして実行できるようになりました。

の値は変更できます。"allowFunctionsToRunAsRoot""no"を再起動するにはAWS IoT GreengrassLambda 関数を root として実行することを禁止する場合は、このオプションを使用します。

Lambda 関数のコンテナ化を選択する場合の考慮事項

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

デフォルトでは、Lambda 関数は、AWS IoT Greengrassコンテナ。このコンテナにより、関数とホストが分離され、ホストとコンテナ内の関数の両方でセキュリティが向上します。

コンテナ化を使用しないで実行する必要があるユースケースを除き、Lambda 関数を Greengrass コンテナで実行することをお勧めします。Greengrass コンテナで Lambda 関数を実行することで、リソースへのアクセスを制限する方法をより細かく制御できます。

コンテナ化を使用しないで実行するユースケースの例:

  • コンテナモードをサポートしないデバイスで AWS IoT Greengrass を実行する場合 (たとえば、特殊な Linux ディストリビューションを使用しているか、カーネルバージョンが古すぎるため)。

  • 独自の OverlayFS がある別のコンテナ環境の Lambda 関数を、Greengrass コンテナで実行すると、OverlayFS の競合が発生する場合。

  • アクセス先のローカルリソースのパスがデプロイ時に決定できないか、デプロイ後に変わることがある場合 (プラガブルデバイスなど)。

  • プロセスとして記述されたレガシーアプリケーションがあり、これをコンテナ化された Lambda 関数として実行するときに問題が発生した場合。

コンテナ化の相違点
コンテナ化 コメント

Greengrass コンテナ

  • すべてAWS IoT Greengrass機能は、Greengrass コンテナで Lambda 関数を実行するときに利用できます。

  • Greengrass コンテナで実行する Lambda 関数は、他の Lambda 関数のデプロイ済みコードにアクセスできません (同じグループ ID を使用している場合でも)。つまり、Lambda 関数は、互いに分離されて実行されます。

  • で実行されるLambda 関数は、AWS IoT Greengrassコンテナのすべての子プロセスを Lambda 関数と同じコンテナで実行する場合、Lambda 関数の終了時に子プロセスも終了します。

コンテナなし

  • 以下の機能は、コンテナ化されていない Lambda 関数では使用できません。

  • コンテナ化されていない Lambda 関数が機械学習リソースにアクセスする場合、リソース所有者を指定し、Lambda 関数ではなくリソースにアクセス権限を設定する必要があります。これにはAWS IoT Greengrassコアソフトウェア v1.10 以降。詳細については、「Lambda 関数から機械学習リソースにアクセスする」を参照してください。

  • Lambda 関数は、同じグループ ID で実行されている他の Lambda 関数のデプロイ済みコードに対して読み取り専用アクセス権があります。

  • 別のプロセスセッションに子プロセスをスポーンしたり、上書きされた SIGHUP (シグナルハングアップ) ハンドラ (nohup ユーティリティなど) を使用して子プロセスをスポーンしたりする Lambda 関数は、AWS IoT Greengrass親LLambda 関数が終了したとき。

注記

Greengrass グループの既定のコンテナ化設定は、コネクタには適用されません。

Lambda 関数のコンテナ化を変更すると、デプロイ時に問題が発生する場合があります。ローカルリソースを割り当てた Lambda 関数が新しいコンテナ化の設定で使用できなくなった場合、デプロイは失敗します。

  • Greengrass コンテナでの実行からコンテナ化を使用しない実行へと Lambda 関数を変更すると、関数のメモリ制限は破棄されます。アタッチ済みのローカルリソースを使用する代わりに、ファイルシステムに直接アクセスする必要があります。デプロイする前に、すべてのアタッチ済みリソースを削除する必要があります。

  • コンテナ化を使用しない実行からコンテナでの実行へと Lambda 関数を変更すると、Lambda 関数はファイルシステムに直接アクセスできなくなります。関数ごとにメモリ制限を定義するか、デフォルトの 16 MB を受け入れる必要があります。これらの設定は、デプロイ前に Lambda 関数ごとに構成できます。

Lambda 関数のコンテナ化の設定を変更するには

  1. 左AWS IoTコンソールの [Navigation] ペインで [] を選択します。Greengrass,クラシック (V1),Groups

  2. 設定を変更する Lambda 関数が含まれているグループを選択します。

  3. [Lambda] を選択します。

  4. 変更する Lambda 関数で、省略記号 (...) を選択し、[] を選択します。設定の編集

  5. コンテナ化の設定を変更します。Lambda 関数を Greengrass コンテナで実行するように設定する場合は、メモリ制限および/sys ディレクトリへの読み込みアクセス

  6. 選択更新Lambda 関数への変更を保存します。

変更は、グループのデプロイ時に反映されます。

また、 を使用することもできますCreateFunctionDefinitionおよびCreateFunctionDefinitionVersion()AWS IoT GreengrassAPI リファレンス。コンテナ化の設定を変更する場合は、他のパラメータも必ず更新してください。たとえば、Greengrass コンテナで Lambda 関数を実行からコンテナ化を使用しない実行へと変更する場合は、MemorySizeパラメータ。

Greengrass デバイスでサポートされている分離モードの確認

AWS IoT Greengrass 依存関係チェッカーを使用して、Greengrass デバイスでサポートされている分離モード (Greengrass コンテナ/コンテナなし) を確認できます。

AWS IoT Greengrass 依存関係チェッカーを実行するには

  1. AWS IoT Greengrass 依存関係チェッカーを GitHub リポジトリからダウンロードして実行します。

    wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.11.x.zip unzip greengrass-dependency-checker-GGCv1.11.x.zip cd greengrass-dependency-checker-GGCv1.11.x sudo modprobe configs sudo ./check_ggc_dependencies | more
  2. more」と表示された場合は、Spacebar キーを押して別のページのテキストを表示します。

modprobe コマンドの詳細については、ターミナルで man modprobe を実行してください。

グループ内の Lambda 関数のデフォルトアクセス ID の設定

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

デバイスリソースへのアクセスをより細かく制御するために、グループ内で Lambda 関数の実行に使用されるデフォルトのアクセス ID を設定できます。この設定は、コアデバイスで実行される Lambda 関数に付与されるデフォルトのアクセス許可を決定します。グループ内の個々の関数の設定を上書きするには、その関数の [Run as (として実行)] プロパティを使用できます。詳細については、「Run as」を参照してください。

また、このグループレベルの設定は、基盤となる AWS IoT Greengrass Core ソフトウェアの実行にも使用されます。これは、メッセージルーティング、ローカルシャドウ同期、および自動 IP アドレス検出などのオペレーションを管理するシステム Lambda 関数で構成されます。

デフォルトのアクセス ID は、スタンダード AWS IoT Greengrass システムアカウント (ggc_user と ggc_group) として実行するか、他のユーザーまたはグループのアクセス許可を使用するように設定できます。Greengrass ハードウェアの設定では、適切なリソース制限、適切なファイルへのアクセス許可、およびユーザー定義またはシステム Lambda 関数の実行に使用されるアクセス許可を持つユーザーとグループの適切なディスククォータを使用することをお勧めします。

AWS IoT Greengrass グループのデフォルトのアクセス ID を変更するには

  1. 左AWS IoTコンソールの [Navigation] ペインで [] を選択します。Greengrass,クラシック (V1),Groups

  2. 設定を変更するグループを選択します。

  3. [設定] を選択します。

  4. []Lambda ランタイム環境, 用デフォルトの Lambda 関数のユーザー ID /グループ ID] で、別のユーザー ID /グループ ID

    このオプションを選択すると、[UID (数値)] および [GID (数値)] フィールドが表示されます。

  5. ユーザー ID、グループ ID、またはその両方を入力します。フィールドを空白のままにすると、それぞれの Greengrass システムアカウント (ggc_user または ggc_group) が使用されます。

    • を使用する場合UID (数値)で、グループ内で Lambda 関数を実行するためにデフォルトで使用するアクセス許可を持つユーザーのユーザー ID を入力します。AWS IoT Greengrass デバイスで getent passwd コマンドを使用して、ユーザー ID を検索できます。

    • を使用する場合GID (数値)で、グループ内で Lambda 関数を実行するためにデフォルトで使用するアクセス許可を持つグループのグループ ID を入力します。AWS IoT Greengrass デバイスで getent group コマンドを使用して、グループ ID を検索できます。

    重要

    root ユーザーとして実行すると、データとデバイスに対するリスクが増大します。ビジネスケースで要求されている場合を除き、root (UID/GID=0) として実行しないでください。詳細については、「Lambda 関数をルートとして実行する」を参照してください。

変更は、グループのデプロイ時に反映されます。

グループ内の Lambda 関数のコンテナ化のデフォルト設定

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

Greengrass グループのコンテナ化設定によって、グループ内の Lambda 関数のデフォルトのコンテナ化が決定されます。

  • EclipseGreengrass コンテナモードでは、Lambda 関数は、AWS IoT Greengrassコンテナのデフォルト設定です。

  • Eclipseコンテナなしモードでは、Lambda 関数はデフォルトで通常の Linux プロセスとして実行されます。

グループ設定を変更して、グループ内の Lambda 関数のデフォルトのコンテナ化を指定できます。グループのデフォルトとは異なるコンテナ化を使用して Lambda 関数を実行する場合、グループ内の 1 つ以上の Lambda 関数のこの設定を上書きできます。コンテナ化の設定を変更する場合は、事前に「Lambda 関数のコンテナ化を選択する場合の考慮事項」を参照してください。

重要

グループのデフォルトのコンテナ化を変更する際に、別のコンテナ化を使用する 1 つ以上の関数がある場合は、グループの設定を変更する前に Lambda 関数の設定を変更します。グループのコンテナ化の設定を最初に変更すると、[メモリ制限] と [/sys ディレクトリへの読み込みアクセス] に設定した値は破棄されます。

AWS IoT Greengrass グループのコンテナ化の設定を変更するには

  1. 左AWS IoTコンソールの [Navigation] ペインで [] を選択します。Greengrass,クラシック (V1),Groups

  2. 設定を変更するグループを選択します。

  3. [設定] を選択します。

  4. []Lambda ランタイム環境でコンテナ化の設定を変更します。

変更は、グループのデプロイ時に反映されます。