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

2023 年 6 月 30 日に AWS IoT Greengrass Version 1 は延長ライフサイクルフェーズに入りました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日付以降、AWS IoT Greengrass V1 の機能、拡張機能、バグ修正、またはセキュリティパッチを提供するアップデートはリリースされません。AWS IoT Greengrass V1 で稼働中のデバイスは中断されず、引き続き動作し、クラウドに接続できます。重要な新機能新たなプラットフォームのサポートが追加された AWS IoT Greengrass Version 2 への移行を強くお勧めします。

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

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

グループ固有構成設定

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

[System user and group] (システムユーザーとグループ)

各 Lambda 関数を実行するために使用されるアクセス ID。デフォルトでは、Lambda 関数はグループのデフォルトのアクセス ID として実行されます。通常の場合、これはスタンダードの 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=hostUID=EUID=0 で実行されると、コンテナがエスケープするリスク。

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

[System user ID (number)] (システムユーザー ID (数値))

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

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

[System group ID (number)] (システムグループ ID (番号))

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

[Lambda function containerization] (Lambda 関数のコンテナ化)

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

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

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

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

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

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

注記

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

メモリ制限

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

注記

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

タイムアウト

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

[Pinned] (固定)

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

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

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

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

注記

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

[Encoding type] (エンコードタイプ)

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

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

注記

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

[Process arguments] (プロセスの引数)

コマンドライン引数は、Lambda 関数の実行時に渡されます。

環境変数

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

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

Lambda 関数がアクセスを許可される、最大で 10 個までのローカルリソースシークレットリソース、および機械学習リソースと、対応する read-only または read-write アクセス許可のリスト。コンソールで、これらのアフィリエイトリソースは、[Resources] (リソース) タブのグループ設定ページに掲載されています。

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

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

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

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

root としての Lambda 関数の実行

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

1 つ以上の Lambda 関数を root として実行する前に、まず AWS IoT Greengrass 設定を更新してサポートを有効にする必要があります。デフォルトでは、root として Lambda 関数を実行するためのサポートはオフになっています。AWS IoT Greengrass の設定を更新していない場合、 関数をデプロイしようとして 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
重要

やむを得ない場合を除き、Lambda 関数を root として実行することは避けてください。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 ディストリビューションを使用しているか、カーネルバージョンが古すぎるため)。

  • 独自の OverlayFS がある別のコンテナ環境の Lambda 関数を、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 以降が必要です。詳細については、「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 コンソールのナビゲーションペインの [Manage](管理)で、[Greengrass devices](Greengrass デバイス)を展開して、[Group (V1)](グループ (V1))を選択します。

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

  3. [Lambda functions] (Lambda 関数) タブを選択します。

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

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

  6. [Save] (保存) を選択してから [Confirm] (確認) を選択して Lambda 関数への変更を保存します。

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

また、「AWS IoT Greengrass API リファレンス」の「CreateFunctionDefinition」および「CreateFunctionDefinitionVersion」を使用することもできます。コンテナ化の設定を変更する場合は、他のパラメータも必ず更新してください。例えば、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 コンソールのナビゲーションペインの [Manage](管理)で、[Greengrass devices](Greengrass デバイス)を展開して、[Group (V1)](グループ (V1))を選択します。

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

  3. [Lambda functions] (Lambda 関数) タブを選択し、[Default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境)セクションで [Edit] (編集) を選択します。

  4. [Edit default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境の編集) ページの [Default system user and group] (デフォルトシステムユーザーおよびグループ) で、[Another user ID/group ID] (別のユーザー ID とグループ ID) を選択します。

    このオプションを選択すると、[System user ID (number)] (システムユーザー ID (数値)) および [System group ID (number)] (システムグループ ID (数値)) フィールドが表示されます。

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

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

    • [System group ID (number)] (システムグループ ID (数値)) で、グループ内で 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 コンソールのナビゲーションペインの [Manage](管理)で、[Greengrass devices](Greengrass デバイス)を展開して、[Group (V1)](グループ (V1))を選択します。

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

  3. [Lambda functions] (Lambda 関数) タブを選択します。

  4. [Default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境) から、[Edit] (編集) を選択します。

  5. [Edit default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境を編集する) ページの、[Default Lambda function containerization] (デフォルトの Lambda 関数のコンテナ化) でコンテナ化の設定を変更します。

  6. [Save] を選択します。

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