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

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

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

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

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

グループ固有構成設定

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

として実行

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

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

重要

どうしても必要でない限りは、root として Lambda 関数を実行しないようにすることをお勧めします。root として実行すると、以下のリスクが高まります。

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

  • 悪意のあるユーザーからのデータやデバイスのリスク。

  • Docker コンテナを --net=hostUID=EUID=0 で実行すると、コンテナがエスケープされるリスク。

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

UID (数値)

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

同じ UID を使用して Greengrass コアデバイスでプロセスおよび Lambda 関数を実行する場合、Greengrass グループロールはプロセスの一時的な認証情報を付与できます。このプロセスでは、Greengrass コアのデプロイ全体で一時的な認証情報を使用できます。

GID (数値)

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

コンテナ化

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

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

  • コンテナ化された Lambda 関数は、Greengrass コンテナモードで実行されます。この Lambda 関数は、AWS IoT Greengrass コンテナ内の独立したランタイム環境 (または名前空間) で実行されます。

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

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

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

注記

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

メモリ制限

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

注記

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

Timeout

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

ライフサイクル

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

オンデマンド Lambda 関数は、呼び出されたときに新規または再利用されるコンテナで開始します。関数に対するリクエストは、任意の利用可能なコンテナで処理される可能性があります。存続期間の長い — 関数または固定された —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 関数から機械学習リソースにアクセスする」を参照してください。

API を使用してユーザー定義 AWS IoT Greengrass 関数のグループ固有の構成を設定する方法については、Lambda の「CreateFunctionDefinition」または コマンドリファレンスAWS IoT Greengrass API リファレンスの「create-function-definition」を参照してください。AWS CLIGreengrass コアに Lambda 関数をデプロイするには、関数を含む関数定義バージョンを作成し、関数定義バージョンと他のグループコンポーネントを参照するグループバージョンを作成してから、グループをデプロイします。

root としての Lambda 関数の実行

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

1 つ以上の Lambda 関数を root として実行する前に、まず AWS IoT Greengrass 設定を更新してサポートを有効にする必要があります。デフォルトでは、root として Lambda 関数を実行するためのサポートはオフになっています。AWS IoT Greengrass の設定を更新していない場合、Lambda 関数をデプロイしようとして root (UID および GID が 0) として実行すると、デプロイが失敗します。ランタイムログに次のようなエラーが表示されます (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
重要

どうしても必要でない限りは、root として Lambda 関数を実行しないようにすることをお勧めします。root として実行すると、以下のリスクが高まります。

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

  • 悪意のあるユーザーからのデータやデバイスのリスク。

  • Docker コンテナを --net=hostUID=EUID=0 で実行すると、コンテナがエスケープされるリスク。

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

  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 に設定し、root として Lambda 関数を実行できます。

Lambda 関数を root として実行することを禁止する場合は、"allowFunctionsToRunAsRoot" の値を "no" に変更して AWS IoT Greengrass を再起動します。

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

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

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

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

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

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

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

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

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

コンテナ化の相違点
コンテナ化 注意

Greengrass コンテナ

  • Lambda 関数を Greengrass コンテナで実行する場合、すべての AWS IoT Greengrass 機能が使用可能です。

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

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

コンテナなし

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

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

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

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

注記

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

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

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

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

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

  1. AWS IoT コンソール のナビゲーションペインで、[Greengrass]、[Classic (V1)]、[グループ] の順に選択します。

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

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

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

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

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

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

API リファレンスの「CreateFunctionDefinition」および「CreateFunctionDefinitionVersion」を使用することもできます。AWS IoT Greengrassコンテナ化の設定を変更する場合は、他のパラメータも必ず更新してください。たとえば、Lambda 関数を Greengrass コンテナでの実行からコンテナ化を使用しない実行へと変更する場合は、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 Greengrass Core 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 コンソール のナビゲーションペインで、[Greengrass]、[Classic (V1)]、[グループ] の順に選択します。

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

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

  4. [Lambda ランタイム環境] の [Default Lambda function user ID/ group ID (デフォルト Lambda 関数ユーザー ID/グループ ID)] で、[Another user ID/group 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) として実行しないでください。詳細については、「root としての Lambda 関数の実行」を参照してください。

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

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

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

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

  • Greengrass コンテナモードでは、Lambda 関数はデフォルトで AWS IoT Greengrass コンテナ内の独立したランタイム環境で実行されます。

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

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

重要

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

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

  1. AWS IoT コンソール のナビゲーションペインで、[Greengrass]、[Classic (V1)]、[グループ] の順に選択します。

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

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

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

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