

支援終止通知：2026 年 10 月 7 日 AWS 將停止 的支援 AWS IoT Greengrass Version 1。2026 年 10 月 7 日之後，您將無法再存取 AWS IoT Greengrass V1 資源。如需詳細資訊，請造訪[從 遷移 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用群組特定的組態控制 Greengrass Lambda 函數的執行
<a name="lambda-group-config"></a>

AWS IoT Greengrass 提供 Greengrass Lambda 函數的雲端型管理。雖然 Lambda 函數的程式碼和相依性是使用 管理 AWS Lambda，但您可以設定 Lambda 函數在 Greengrass 群組中執行時的行為。

## 群組專屬組態設定
<a name="lambda-group-config-properties"></a>

AWS IoT Greengrass 為 Greengrass Lambda 函數提供下列群組特定的組態設定。

**系統使用者和群組**  <a name="lambda-access-identity"></a>
用來執行 Lambda 函數的存取身分。根據預設，Lambda 函數會以群組[的預設存取身分](#lambda-access-identity-groupsettings)執行。一般而言，這是標準的 AWS IoT Greengrass 系統帳戶 (ggc\$1user 和 ggc\$1group)。您可以變更設定，並選擇具有執行 Lambda 函數所需許可的使用者 ID 和群組 ID。您可以同時覆寫 UID 和 GID，或如果另一個欄位留白，可以只覆寫一個。此設定可讓您更精細地控制對裝置資源的存取。建議您使用適當的資源限制、檔案許可和磁碟配額來設定 Greengrass 硬體，以用於執行 Lambda 函數的使用者和群組。  
此功能適用於 AWS IoT Greengrass Core v1.7 和更新版本。  
除非絕對必要，否則建議您避免將 Lambda 函數作為根函數執行。以根目錄執行會增加下列風險：  
+ 意外變更的風險，例如意外刪除關鍵檔案。
+ 惡意個人對您的資料和裝置造成的風險。
+ 當 Docker 容器搭配 `--net=host`和 執行時，容器逸出的風險`UID=EUID=0`。
如果您確實需要以根身分執行 ，則必須更新 AWS IoT Greengrass 組態以啟用它。如需詳細資訊，請參閱[執行 Lambda 函數做為根](#lambda-running-as-root)。  
**系統使用者 ID （數字）**  
具有執行 Lambda 函數所需許可之使用者的使用者 ID。只有在您選擇以**另一個使用者 ID/群組 ID** 執行時，才能使用此設定。您可以在 AWS IoT Greengrass 核心裝置上使用 **getent passwd**命令來查詢要用來執行 Lambda 函數的使用者 ID。  
如果您使用相同的 UID 在 Greengrass 核心裝置上執行程序和 Lambda 函數，您的 Greengrass 群組角色可以授予程序臨時登入資料。這些程序可以使用 Greengrass 核心部署的臨時登入資料。  
**系統群組 ID （數字）**  
具有執行 Lambda 函數所需許可的群組的群組 ID。只有在您選擇以**另一個使用者 ID/群組 ID** 執行時，才能使用此設定。您可以在 AWS IoT Greengrass 核心裝置上使用 **getent group**命令來查詢要用來執行 Lambda 函數的群組 ID。

**Lambda 函數容器化**  <a name="lambda-function-containerization"></a>
選擇 Lambda 函數是否使用群組的預設容器化執行，或指定應一律用於此 Lambda 函數的容器化。  
Lambda 函數的容器化模式決定其隔離層級。  
+ 容器化 Lambda 函數會以 **Greengrass 容器**模式執行。Lambda 函數會在 AWS IoT Greengrass 容器內的隔離執行時間環境 （或命名空間） 中執行。
+ 非容器化 Lambda 函數會以**無容器**模式執行。Lambda 函數會以一般 Linux 程序執行，而沒有任何隔離。
此功能適用於 AWS IoT Greengrass Core v1.7 和更新版本。  
建議您在 Greengrass 容器中執行 Lambda 函數，除非您的使用案例要求它們在沒有容器化的情況下執行。當您的 Lambda 函數在 Greengrass 容器中執行時，您可以使用連接的本機和裝置資源，並取得隔離和提高安全性的優勢。請先參閱[選擇 Lambda 函數容器化時的考量事項](#lambda-containerization-considerations)，再變更 containerization (容器化)。  
若要在不啟用裝置核心命名空間和 cgroup 的情況下執行 ，所有 Lambda 函數都必須在沒有容器化的情況下執行。只要設定群組的預設容器化，即可輕鬆達成此目標。如需相關資訊，請參閱[為群組中的 Lambda 函數設定預設容器化](#lambda-containerization-groupsettings)。

**Memory limit (記憶體限制)**  
函數所需記憶體的分配。預設為 16 MB。  
當您將 Lambda 函數變更為在沒有容器化的情況下執行時，記憶體限制設定會變成無法使用。在沒有容器化的情況下執行的 Lambda 函數沒有記憶體限制。當您將 Lambda 函數或群組預設容器化設定變更為在沒有容器化的情況下執行時，會捨棄記憶體限制設定。

**Timeout (逾時)**  
在函數或要求終止前的時間值。預設為 3 秒。

**固定**  
Lambda 函數生命週期可以是*隨需*或*長期。*預設為隨需。  
呼叫時，隨需 Lambda 函數會在新的或重複使用的容器中啟動。請求任何可以處理的函數。**Lambda 函數會在 AWS IoT Greengrass 啟動後自動啟動，並在自己的容器 （或沙盒） 中持續執行。所有請求函數的要求皆由相同的容器處理。如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。

**Read access to /sys directory (對 /sys 目錄的讀取存取)**  
不管該函數可以存取主機的 /sys 資料夾。當函數必須讀取 /sys 的裝置資訊時，請使用此函數。預設值為 false。  
當您在沒有容器化的情況下執行 Lambda 函數時，無法使用此設定。當您將 Lambda 函數變更為在沒有容器化的情況下執行時，會捨棄此設定的值。

**編碼類型**  
函數輸入承載預期的編碼類型，可能是 JSON 或二進位。預設值為 JSON。  
從 AWS IoT Greengrass Core Software v1.5.0 和 AWS IoT Greengrass Core SDK v1.1.0 開始，即可支援二進位編碼類型。接受二進位輸入資料可幫助函數與裝置資料互動，因為裝置硬體的限制讓他們自身難以或無法建構 JSON 資料類型。  
[Lambda 可執行檔](lambda-functions.md#lambda-executables)僅支援二進位編碼類型，不支援 JSON。

**程序引數**  
命令列引數會在執行時傳遞至 Lambda 函數。

**環境變數**  
金鑰值組可動態地將設定傳給函數程式碼和二進位程式庫。本機環境變數會執行的方式與 [AWS Lambda 函數環境變數](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html) 一樣，但是，不同在於可在核心環境取得。

**資源存取政策**  
允許 Lambda 函數存取的最多 10 個[本機資源](access-local-resources.md)、[秘密資源](secrets.md)和[機器學習資源](ml-inference.md)的清單，以及對應的 `read-only`或 `read-write`許可。在 主控台中，這些*附屬*資源會列在**資源**索引標籤的群組組態頁面上。  
[容器化模式](#lambda-function-containerization)會影響 Lambda 函數如何存取本機裝置和磁碟區資源，以及機器學習資源。  
+ 非容器化 Lambda 函數必須透過核心裝置上的檔案系統直接存取本機裝置和磁碟區資源。
+ 若要允許非容器化 Lambda 函數存取 Greengrass 群組中的機器學習資源，您必須在機器學習資源上設定資源擁有者和存取許可屬性。如需詳細資訊，請參閱[從 Lambda 函數存取機器學習資源](access-ml-resources.md)。

如需有關使用 AWS IoT Greengrass API 為使用者定義的 Lambda 函數設定群組特定組態設定的資訊，請參閱*AWS IoT Greengrass Version 1 《 API 參考*》中的 [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html) 或《 *AWS CLI 命令參考*》中的 [create-function-definition](https://docs.aws.amazon.com/cli/latest/reference/greengrass/create-function-definition.html)。若要將 Lambda 函數部署至 Greengrass 核心，請建立包含函數的函數定義版本，建立參考函數定義版本和其他群組元件的群組版本，然後[部署群組](deployments.md)。

## 執行 Lambda 函數做為根
<a name="lambda-running-as-root"></a>

此功能適用於 AWS IoT Greengrass Core v1.7 和更新版本。

您必須先更新 AWS IoT Greengrass 組態以啟用支援，才能執行一或多個 Lambda 函數做為根目錄。支援在根目錄關閉時執行 Lambda 函數。如果您嘗試部署 Lambda 函數並以根 (UID 和 GID 為 0) 執行，且尚未更新 AWS IoT Greengrass 組態，則部署會失敗。類似以下的錯誤會出現在執行時間日誌 (*greengrass\$1root*/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 函數作為根函數執行。以根目錄執行會增加下列風險：  
意外變更的風險，例如意外刪除關鍵檔案。
惡意個人對您的資料和裝置造成的風險。
當 Docker 容器搭配 `--net=host`和 執行時，容器逸出的風險`UID=EUID=0`。

**允許 Lambda 函數以根目錄執行**

1. 在您的裝置上 AWS IoT Greengrass ，導覽至 *greengrass-root*/config 資料夾。
**注意**  
根據預設，*greengrass-root* 為 /greengrass 目錄。

1. 編輯 config.json 檔案，以將 `"allowFunctionsToRunAsRoot" : "yes"` 新增到 `runtime` 欄位。例如：

   ```
   {
     "coreThing" : {
       ...
     },
     "runtime" : {
       ...
       "allowFunctionsToRunAsRoot" : "yes"
     },
     ...
   }
   ```

1. 使用以下命令重新啟動 AWS IoT Greengrass：

   ```
   cd /greengrass/ggc/core
   sudo ./greengrassd restart
   ```

   現在，您可以將 Lambda 函數的使用者 ID 和群組 ID (UID/GID) 設定為 0，以將該 Lambda 函數執行為根。

如果您想要不允許 Lambda 函數做為根函數執行 AWS IoT Greengrass ，您可以將 的值變更為 `"allowFunctionsToRunAsRoot"``"no"`並重新啟動。

## 選擇 Lambda 函數容器化時的考量事項
<a name="lambda-containerization-considerations"></a>

此功能適用於 AWS IoT Greengrass Core v1.7 和更新版本。

根據預設，Lambda 函數會在 AWS IoT Greengrass 容器內執行。該容器會隔離您的函數和主機，為容器內的主機和函數提供更多安全性。

建議您在 Greengrass 容器中執行 Lambda 函數，除非您的使用案例要求它們在沒有容器化的情況下執行。透過在 Greengrass 容器中執行 Lambda 函數，您可以更好地控制限制對 資源的存取。

以下是一些在無容器情況下執行的範例使用案例：
+ 您想要 AWS IoT Greengrass 在不支援容器模式的裝置上執行 （例如，因為您使用的是特殊 Linux 發行版本或核心版本太舊）。
+ 您想要在另一個容器環境中使用自己的 OverlayFS 執行 Lambda 函數，但在 Greengrass 容器中執行時遇到 OverlayFS 衝突。
+ 您需要存取無法在部署期間確定路徑的本機資源，或其路徑會在部署後變更，例如插入式裝置。
+ 您有一個已寫入程序的舊版應用程式，且在以容器化 Lambda 函數執行它時遇到問題。


**容器化差異**  

| 容器化 | 備註 | 
| --- | --- | 
| Greengrass 容器 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/lambda-group-config.html) | 
| 沒有容器 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/lambda-group-config.html) | 

**注意**  
Greengrass 群組的預設容器化設定不適用於[連接器](connectors.md)。

變更 Lambda 函數的容器化可能會在您部署時造成問題。如果您已將本機資源指派給新的容器化設定不再可用的 Lambda 函數，則部署會失敗。
+ 當您將 Lambda 函數從 Greengrass 容器中執行變更為在沒有容器化的情況下執行時，會捨棄函數的記憶體限制。您必須直接存取檔案系統，而不是使用連接的本機資源。您必須在部署前移除所有連接的資源。
+ 當您將 Lambda 函數從在沒有容器化的情況下執行變更為在容器中執行時，您的 Lambda 函數會失去檔案系統的直接存取權。您必須定義各函數的記憶體上限，或接受預設值 16 MB。您可以在部署之前為每個 Lambda 函數設定這些設定。<a name="change-containerization-lambda"></a>

**變更 Lambda 函數的容器化設定**

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. <a name="lambda-choose-group"></a>選擇包含您要變更其設定之 Lambda 函數的群組。

1. <a name="lambda-choose-lambdas"></a>選擇 **Lambda 函數**索引標籤。

1. <a name="lambda-edit-lambda"></a>在您要變更的 Lambda 函數上，選擇省略符號 (**...**)，然後選擇**編輯組態**。

1. 變更容器化設定。如果您將 Lambda 函數設定為在 Greengrass 容器中執行，您還必須設定**記憶體限制**和對 **/sys 目錄的讀取存取權**。

1. <a name="lambda-save-changes"></a>選擇**儲存**，然後選擇**確認**以儲存對 Lambda 函數的變更。

變更會在群組部署後生效。

您也可以使用 *AWS IoT Greengrass API 參考*中的 [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html) 和 [CreateFunctionDefinitionVersion](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinitionversion-post.html)。如果您要變更容器化設定，請務必也要更新其他參數。例如，如果您要從在 Greengrass 容器中執行 Lambda 函數變更為在沒有容器化的情況下執行，請務必清除 `MemorySize` 參數。

### 判斷您 Greengrass 裝置支援的隔離模式
<a name="dependency-checker-tests-isolation"></a>

您可以使用 AWS IoT Greengrass 相依性檢查程式來判斷 Greengrass 裝置支援哪些隔離模式 (Greengrass 容器/無容器）。

**執行 AWS IoT Greengrass 相依性檢查程式**

1. 從 [GitHub 儲存庫](https://github.com/aws-samples/aws-greengrass-samples)下載並執行 AWS IoT Greengrass 相依性檢查程式。

   ```
   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
   ```

1. 在 `more` 出現的位置，按 Spacebar 鍵可顯示另一頁文字。

如需 **modprobe** 命令的資訊，請在終端機中執行 **man modprobe**。

## 為群組中的 Lambda 函數設定預設存取身分
<a name="lambda-access-identity-groupsettings"></a>

此功能適用於 AWS IoT Greengrass Core v1.8 和更新版本。

如需進一步控制裝置資源的存取，您可以設定用於在 群組中執行 Lambda 函數的預設存取身分。此設定會決定在核心裝置上執行 Lambda 函數時授予的預設許可。若要覆寫群組中的個別函數設定，您可以使用函數的 **Run as (執行身分)** 屬性。如需詳細資訊，請參閱[執行身分](#lambda-access-identity)。

此群組層級設定也用於執行基礎 AWS IoT Greengrass Core 軟體。這包含管理操作的系統 Lambda 函數，例如訊息路由、本機陰影同步和自動 IP 地址偵測。

預設存取身分可設定為做為標準 AWS IoT Greengrass 系統帳戶 (ggc\$1user 和 ggc\$1group) 執行，或使用其他使用者或群組的許可。建議您針對其許可用於執行使用者定義或系統 Lambda 函數的任何使用者和群組，使用適當的資源限制、檔案許可和磁碟配額來設定 Greengrass 硬體。

**修改 AWS IoT Greengrass 群組的預設存取身分**

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. <a name="group-choose-group"></a>選擇您希望變更設定的群組。

1. 選擇 **Lambda 函數**索引標籤，然後在**預設 Lambda 函數執行期環境**區段下，選擇**編輯**。

1. 在**編輯預設 Lambda 函數執行期環境**頁面**的預設系統使用者和群組**下，選擇**另一個使用者 ID/群組 ID**。

   當您選擇此選項時，系統**使用者 ID （數字）** 和**系統群組 ID （數字）** 欄位會顯示。

1. 輸入使用者 ID、群組 ID 或兩者。如果您將欄位留白，則會使用個別的 Greengrass 系統帳戶 (ggc\$1user 或 ggc\$1group)。
   + 在**系統使用者 ID （數字）** 中，輸入具有預設要在群組中執行 Lambda 函數之許可的使用者 ID。您可以使用 AWS IoT Greengrass 裝置上的 **getent passwd** 命令查看使用者 ID。
   + 針對**系統群組 ID （數字）**，輸入群組的群組 ID，該群組具有預設要在群組中執行 Lambda 函數的許可。您可以使用 AWS IoT Greengrass 裝置上的 **getent group** 命令查看群組 ID。
**重要**  
執行身分為根使用者會增加資料和裝置的風險。除非您的商業案例要求，否則請勿以根執行 (UID/GID = 0)。如需詳細資訊，請參閱[執行 Lambda 函數做為根](#lambda-running-as-root)。

變更會在群組部署後生效。

## 為群組中的 Lambda 函數設定預設容器化
<a name="lambda-containerization-groupsettings"></a>

此功能適用於 AWS IoT Greengrass Core v1.7 和更新版本。

Greengrass 群組的容器化設定會決定群組中 Lambda 函數的預設容器化。
+ 在 **Greengrass 容器**模式中，Lambda 函數預設會在 AWS IoT Greengrass 容器內的隔離執行時間環境中執行。
+ 在**無容器**模式中，Lambda 函數預設會以一般 Linux 程序執行。

您可以修改群組設定，以指定群組中 Lambda 函數的預設容器化。如果您想要 Lambda 函數以與群組預設值不同的容器化執行，您可以覆寫群組中一或多個 Lambda 函數的此設定。請先參閱[選擇 Lambda 函數容器化時的考量事項](#lambda-containerization-considerations)，再變更容器化設定。

**重要**  
如果您想要變更群組的預設容器化，但有一或多個函數使用不同的容器化，請在變更群組設定之前變更 Lambda 函數的設定。如果您先變更群組容器化設定，就會捨棄 **Memory limit (記憶體限制)** 和 **Read access to /sys directory (對 /sys 目錄的讀取存取)** 設定。

**修改 AWS IoT Greengrass 群組的容器化設定**

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. <a name="group-choose-group"></a>選擇您希望變更設定的群組。

1. 選擇 **Lambda 函數**索引標籤。

1. 在**預設 Lambda 函數執行期環境中**，選擇**編輯**。

1. 在**編輯預設 Lambda 函數執行期環境**頁面**的預設 Lambda 函數容器化**下，變更容器化設定。

1. 選擇**儲存**。

變更會在群組部署後生效。