AWS IoT Greengrass
開発者ガイド

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

AWS IoT Greengrass は、Greengrass Lambda 関数のクラウドベースの管理を提供しています。Lambda 関数がグループで実行する場合、その動作の詳細を設定できます。関数のコードと依存関係は AWS Lambda で管理しますが、AWS IoT Greengrass は以下のグループ固有の構成設定をサポートしています。

として実行

各 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 として実行すると、重要なファイルを誤って削除するなど、意図しない変更が行われる恐れがあります。さらに、ルートとして実行すると、悪意のあるユーザーがデータやデバイスにアクセスする危険性が高まります。root として実行する必要がある場合は、それを有効にするように AWS IoT Greengrass 設定を更新する必要があります。詳細については、「root としての Lambda 関数の実行」を参照してください。

UID (数値)

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

GID (数値)

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

コンテナ化

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

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

注記

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

メモリ制限

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

注記

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

タイムアウト

関数あるいはリクエストが終了するまでの時間数。デフォルト値は 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 環境で利用可能です。

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

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

注記

リソースアクセスポリシーが適用されるのは、Lambda 関数が Greengrass コンテナで実行される場合のみです。コンテナ化を使用しないで 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 として実行すると、重要なファイルを誤って削除するなど、意図しない変更が行われる恐れがあります。さらに、ルートとして実行すると、悪意のあるユーザーがデータやデバイスにアクセスする危険性が高まります。

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 関数として実行するときに問題が発生する場合。

コンテナ化の相違点

コンテナ化 コメント

AWS IoT Greengrass コンテナ

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

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

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

コンテナなし

  • コンテナ化を使用しないで Lambda 関数を実行する場合、AWS IoT Greengrass の一部の機能は使用できません。アタッチ済みのローカルリソースとボリュームリソースを使用する代わりに、ファイルシステムに直接アクセスする必要があります。現在、機械学習 (ML) モデルのリソースは、コンテナ化を使用しない場合はサポートされません。

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

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

  • コネクタ、ローカルデバイスとローカルボリュームのリソース、Lambda 関数のメモリ制限、ML モデルのリソースは、Greengrass グループの Lambda 関数のコンテナ化がデフォルトで [No container (コンテナなし)] に設定されている場合にはサポートされません。これらの機能を使用するには、AWS IoT Greengrass でコンテナ化を使用して実行する必要があります。

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

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

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

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

  1. AWS IoT コンソールで、[Greengrass]、[グループ] の順に選択します。

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

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

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

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

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

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

AWS IoT Greengrass API リファレンスCreateFunctionDefinitionCreateFunctionDefinitionVersion を使用することもできます。コンテナ化の設定を変更する場合は、他のパラメータも必ず更新してください。たとえば、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.9.x.zip unzip greengrass-dependency-checker-GGCv1.9.x.zip cd greengrass-dependency-checker-GGCv1.9.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]、[グループ] の順に選択します。

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

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

重要

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

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

  1. AWS IoT コンソールで、[Greengrass]、[グループ] の順に選択します。

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

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

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

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