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

AWS IoT Greengrass バージョン 1 のドキュメントを表示しています。AWS IoT Greengrass バージョン 2 は、AWS IoT Greengrass 最新のメジャーバージョンです。AWS IoT Greengrass V2 の使用方法の詳細については、AWS IoT Greengrass バージョン 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 Greengrass Core v1.7 以降で使用できます。

重要

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

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

  • 悪意のあるユーザーがデータやデバイスにアクセスするリスク。

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

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

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 Greengrass Core v1.7 以降で使用できます。

コンテナ化を使用せずに Lambda 関数を実行する必要があるユースケースを除き、Greengrass コンテナで Lambda 関数を実行することをお勧めします。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 です。

バイナリエンコードタイプのSupport は、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 Greengrass API を使用してユーザー定義の Lambda 関数のグループ固有の設定を設定する方法については、CreateFunctionDefinition()AWS IoT Greengrass バージョン 1 API リファレンスまたは関数定義の作成()AWS CLI コマンドリファレンス。Greengrass コアに Lambda 関数をデプロイするには、関数を含む関数定義バージョンを作成し、関数定義バージョンと他のグループコンポーネントを参照するグループバージョンを作成してから、グループをデプロイする

Lambda 関数を root として実行する

この機能は AWS IoT Greengrass Core 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 関数を root として実行できるようになりました。

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

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

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

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

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

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

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

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

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

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

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

Greengrass コンテナ

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

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

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

コンテナなし

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

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

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

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

注記

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

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

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

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

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

  1. AWS IoT コンソールのナビゲーションペインで、[Greengrassクラシック (V1)グループ

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

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

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

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

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

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

また、 を使用することもできますCreateFunctionDefinitionおよびCreateFunctionDefinitionVersion()AWS IoT Greengrass API リファレンス。コンテナ化の設定を変更する場合は、他のパラメータも必ず更新してください。たとえば、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 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クラシック (V1)グループ

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

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

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

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

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

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

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

    重要

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

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

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

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

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

  • EclipseGreengrass コンテナモードでは、Lambda 関数は、AWS IoT Greengrass コンテナ内の分離したランタイム環境で実行されます。

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

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

重要

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

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

  1. AWS IoT コンソールのナビゲーションペインで、[Greengrassクラシック (V1)グループ

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

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

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

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