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=host
やUID=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=host
やUID=EUID=0
で実行されると、コンテナがエスケープするリスク。
root として実行することを Lambda 関数に許可するには
AWS IoT Greengrass デバイスで、
greengrass-root
/config フォルダに移動します。注記
デフォルトでは、
greengrass-root
は /greengrass ディレクトリです。config.json ファイルを編集し、
"allowFunctionsToRunAsRoot" : "yes"
をruntime
フィールドに追加します。例:{ "coreThing" : { ... }, "runtime" : { ... "allowFunctionsToRunAsRoot" : "yes" }, ... }
次のコマンドを使用して 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 コンテナ |
|
コンテナなし |
|
注記
Greengrass グループの既定のコンテナ化設定は、コネクタには適用されません。
Lambda 関数のコンテナ化を変更すると、デプロイ時に問題が発生する場合があります。ローカルリソースを割り当てた Lambda 関数が新しいコンテナ化の設定で使用できなくなった場合、デプロイは失敗します。
Greengrass コンテナでの実行からコンテナ化を使用しない実行へと Lambda 関数を変更すると、関数のメモリ制限は破棄されます。アタッチ済みのローカルリソースを使用する代わりに、ファイルシステムに直接アクセスする必要があります。デプロイする前に、すべてのアタッチ済みリソースを削除する必要があります。
コンテナ化を使用しない実行からコンテナでの実行へと Lambda 関数を変更すると、Lambda 関数はファイルシステムに直接アクセスできなくなります。関数ごとにメモリ制限を定義するか、デフォルトの 16 MB を受け入れる必要があります。これらの設定は、デプロイ前に Lambda 関数ごとに構成できます。
Lambda 関数のコンテナ化の設定を変更するには
AWS IoT コンソールのナビゲーションペインの [Manage](管理)で、[Greengrass devices](Greengrass デバイス)を展開して、[Group (V1)](グループ (V1))を選択します。
-
設定を変更する Lambda 関数が含まれているグループを選択します。
-
[Lambda functions] (Lambda 関数) タブを選択します。
-
変更する Lambda 関数で、省略記号 (…) を選択し、次に [Edit configuration] (設定の編集) を選択します。
-
コンテナ化の設定を変更します。Greengrass コンテナで実行するように Lambda 関数を設定する場合は、[Memory limit] (メモリ制限) と [Read access to /sys directory] (/sys ディレクトリへの読み込みアクセス) も設定する必要があります。
-
[Save] (保存) を選択してから [Confirm] (確認) を選択して Lambda 関数への変更を保存します。
変更は、グループのデプロイ時に反映されます。
また、「AWS IoT Greengrass API リファレンス」の「CreateFunctionDefinition」および「CreateFunctionDefinitionVersion」を使用することもできます。コンテナ化の設定を変更する場合は、他のパラメータも必ず更新してください。例えば、Lambda 関数を Greengrass コンテナでの実行からコンテナ化を使用しない実行へと変更する場合は、MemorySize
パラメータを必ずクリアします。
Greengrass デバイスでサポートされている分離モードの確認
AWS IoT Greengrass 依存関係チェッカーを使用して、Greengrass デバイスでサポートされている分離モード (Greengrass コンテナ/コンテナなし) を確認できます。
AWS IoT Greengrass 依存関係チェッカーを実行するには
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
「
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 を変更するには
AWS IoT コンソールのナビゲーションペインの [Manage](管理)で、[Greengrass devices](Greengrass デバイス)を展開して、[Group (V1)](グループ (V1))を選択します。
設定を変更するグループを選択します。
-
[Lambda functions] (Lambda 関数) タブを選択し、[Default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境)セクションで [Edit] (編集) を選択します。
-
[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 (数値)) フィールドが表示されます。
ユーザー 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 グループのコンテナ化の設定を変更するには
AWS IoT コンソールのナビゲーションペインの [Manage](管理)で、[Greengrass devices](Greengrass デバイス)を展開して、[Group (V1)](グループ (V1))を選択します。
設定を変更するグループを選択します。
-
[Lambda functions] (Lambda 関数) タブを選択します。
-
[Default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境) から、[Edit] (編集) を選択します。
-
[Edit default Lambda function runtime environment] (デフォルトの Lambda 関数ランタイム環境を編集する) ページの、[Default Lambda function containerization] (デフォルトの Lambda 関数のコンテナ化) でコンテナ化の設定を変更します。
-
[Save] を選択します。
変更は、グループのデプロイ時に反映されます。