使用群組特定組態控制 Greengrass Lambda 函數執行 - AWS IoT Greengrass

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

使用群組特定組態控制 Greengrass Lambda 函數執行

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

群組專屬組態設定

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

Run as (執行身分)

執行 Lambda 函數所使用的存取身分。根據預設,Lambda 函數會以群組的預設存取身分執行。一般而言,這是標準的 AWS IoT Greengrass 系統帳戶 (ggc_user 和 ggc_group)。您可以變更設定並選擇擁有執行 Lambda 函數所需許可的使用者 ID 和群組 ID。您可以同時覆寫 UID 和 GID,或如果另一個欄位留白,可以只覆寫一個。此設定可讓您更精細地控制對裝置資源的存取。我們建議您對 Greengrass 硬體設定適當的資源限制、檔案許可,以及許可用於執行 Lambda 函數之使用者和群組的磁碟配額。

只有 AWS IoT Greengrass Core v1.7 與更新版本才提供這項功能。

重要

我們建議您除非必要,避免以 root 身分執行。當您以 root 身分執行 Lambda 函數時,會增加意外變更的風險,例如意外刪除重要檔案。此外,以 root 身分執行會提高您個人資料和裝置受惡意個人侵擾的風險。如果您真的需要以 root 身分執行,您必須更新 AWS IoT Greengrass 組態才能啟用它。如需更多詳細資訊,請參閱「以 Root 身分執行 Lambda 函數」。

UID (數字)

擁有執行 Lambda 函數所需許可之使用者的使用者 ID。只有當您選擇 Run as another user ID/group ID (以其他使用者 ID/群組 ID 執行) 時,才能使用此設定。您可以在 AWS IoT Greengrass 核心 裝置上使用 getent passwd 命令,查詢您要用來執行 Lambda 函數的使用者 ID。

如果您使用相同的UID運行進程, Lambda 功能,您的Greengrass組角色可以授予流程臨時憑證。進程可以使用Greengrass核心部署中的臨時憑證。

GID (數字)

擁有執行 Lambda 函數所需許可之群組的群組 ID。只有當您選擇 Run as another user ID/group ID (以其他使用者 ID/群組 ID 執行) 時,才能使用此設定。您可以在 AWS IoT Greengrass 核心 裝置上使用 getent group 命令,查詢您要用來執行 Lambda 函數的群組 ID。

容器化

選擇 Lambda 函數以群組的預設容器化執行,或指定應一律使用於此 Lambda 函數的容器化。

Lambda 函數的容器化模式決定了其隔離層級。

  • 容器化的 Lambda 函數以 Greengrass container (Greengrass 容器) 的模式執行。在 AWS IoT Greengrass 容器內的隔離執行時間環境 (或命名空間) 中執行之 Lambda 函數。

  • 非容器化 Lambda 函數以 No container (無容器) 之模式執行。Lambda 函數以普通 Linux 程序執行,沒有任何隔離。

只有 AWS IoT Greengrass Core v1.7 與更新版本才提供這項功能。

建議您在 Greengrass 容器中執行 Lambda 函數,除非您的使用案例需要在不使用容器化的情況下執行函數。當 Lambda 函數在 Greengrass 容器中執行時,您可以利用連接的本機與裝置資源,取得隔離和更高的安全性優勢。請先參閱選擇 Lambda 函數容器化時的注意事項,再變更 containerization (容器化)。

注意

若要在不啟用您裝置核心命名空間和 cgroup 的情況下執行,您所有的 Lambda 函數都必須在無容器化的情況下執行。只要設定群組的預設容器化,即可輕鬆達成此目標。如需資訊,請參閱在群組中設定 Lambda 函數的預設容器化

Memory limit (記憶體限制)

函數所需記憶體的分配。預設為 16 MB。

注意

若將 Lambda 函數變更為在沒有容器化的情況下執行,就無法使用記憶體限制設定。在沒有容器化的情況下執行的 Lambda 函數沒有記憶體限制。若將 Lambda 函數或群組預設容器化設定變更為在沒有容器化的情況下執行,就會捨棄記憶體限制設定。

逾時

在函數或要求終止前的時間值。預設為 3 秒。

生命週期

Lambda 功能生命週期可為隨需長期。預設為隨需。

呼叫隨需 Lambda 函數啟用新的或重複使用的容器。請求任何可以處理的函數。長期 — 或 鎖定的—Lambda 函數在自動啟動 AWS IoT Greengrass 啟動並保持在自己的容器 (或沙盒) 中持續運作。所有請求函數的要求皆由相同的容器處理。如需更多詳細資訊,請參閱「Greengrass Lambda 函數的生命週期組態」。

Read access to /sys directory (對 /sys 目錄的讀取存取)

不管該函數可以存取主機的 /sys 資料夾。當函數必須讀取 /sys 的裝置資訊時,請使用此函數。預設值為 false。

注意

當您在無容器化的情況下執行 Lambda 函數時,無法使用此設定。當您變更 Lambda 函數,使其在無容器化的情況下執行時,此設定的值將遭到捨棄。

輸入承載資料類型

函數輸入承載預期的編碼類型,可能是 JSON 或二進位。預設值為 JSON。

支援二進位編碼類型可在 AWS IoT Greengrass 核心軟體 v1.5.0 和 v1.1.0 和 AWS IoT Greengrass 核心開發套件中取得。接受二進位輸入資料可幫助函數與裝置資料互動,因為裝置硬體的限制讓他們自身難以或無法建構 JSON 資料類型。

注意

Lambda 可執行檔 僅支援二進位編碼類型,不支援 JSON。

環境變數

金鑰值組可動態地將設定傳給函數程式碼和二進位程式庫。本機環境變數會執行的方式與 AWS Lambda函數環境變數 一樣,但是,不同在於可在核心環境取得。

資源存取政策

允許 Lambda 函數存取的 10 項內本機資源私密資源機器學習資源清單,以及對應的 read-onlyread-write 許可。在主控台,這些公司隸屬資源列在函數的 資源 頁面。

容器化模式會影響 Lambda 函數存取本機裝置、磁碟區資源以及機器學習資源的方式。

  • 非容器化 Lambda 函數必須直接透過核心裝置上的檔案系統以存取本機裝置和磁碟區資源。

  • 若要允許非容器化 Lambda 函數存取 Greengrass 群組中的機器學習資源,您必須在機器學習資源上設定資源擁有者和存取權限屬性。如需更多詳細資訊,請參閱「從 Lambda 函數存取機器學習資源」。

有關使用的信息 AWS IoT Greengrass 用於爲用戶定義的設置組特定配置設置的API Lambda 函數,請參閱 CreateFunctionDefinitionAWS IoT Greengrass API 參考創建功能定義AWS CLI 命令參考. 若要將 Lambda 函數部署到 Greengrass 核心,請建立包含函數的函數定義版本,再建立參考函數定義版本和其他群組元件的群組版本,然後部署群組

以 Root 身分執行 Lambda 函數

只有 AWS IoT Greengrass Core v1.7 與更新版本才提供這項功能。

您必須先更新 AWS IoT Greengrass 組態以啟用支援,才能執行一或多個 Lambda 函數。預設關閉以 root 身分執行 Lambda 函數的支援。如果您嘗試部署 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
重要

我們建議您除非必要,避免以 root 身分執行。當您以 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 函數。

如果您想要禁止以 root 身分執行 Lambda 函數,您可以將 "allowFunctionsToRunAsRoot" 的值變更為 "no",然後重新啟動 AWS IoT Greengrass。

選擇 Lambda 函數容器化時的注意事項

只有 AWS IoT Greengrass Core v1.7 與更新版本才提供這項功能。

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

建議您在 Greengrass 容器中執行 Lambda 函數,除非您的使用案例需要在不使用容器化的情況下執行函數。在 Greengrass 容器中執行您的 Lambda 函數,可掌握更大的資源存取限制。

以下是一些在無容器情況下執行的範例使用案例:

  • 您想要在不支援容器模式 (例如,因為您使用的是特殊的 Linux 發行版本或核心版本太舊) 的裝置上執行 AWS IoT Greengrass。

  • 您希望運行您的 Lambda 另一個容器環境中的功能 OverlayFS,但遇到 OverlayFS 衝突。

  • 您需要存取無法在部署期間確定路徑的本機資源,或其路徑會在部署後變更,例如插入式裝置。

  • 您的舊版應用程式寫入為程序,但在您將它執行為容器化的 Lambda 函數時發生了問題。

容器化差異
容器化 備註

Greengrass 容器

  • 當您在 Greengrass 容器中執行 Lambda 函數時,所有的 AWS IoT Greengrass 功能都可使用。

  • 在 Greengrass 容器中執行的 Lambda 函數不能存取其他 Lambda 函數部署的程式碼,即使它們使用相同的群組 ID 執行。換言之,您的 Lambda 函數在執行時有更佳的隔離。

  • 因為在 AWS IoT Greengrass 容器中執行的 Lambda 函數在與 Lambda 函數相同的容器中執行所有的子程序,所以子程序會在 Lambda 函數終止時終止。

沒有容器

  • 以下功能不適用於非容器化 Lambda 函數:

    • Lambda 函數記憶體限制。

    • 本機裝置和磁碟區資源。您必須在核心裝置上直接存取這些資源,而不是以 Greengrass 群組的成員身分存取。

  • 如果您的非容器化 Lambda 函數會存取機器學習資源,則您必須識別資源擁有者,並在資源 (非 Lambda 函數) 上設定存取權限。這需要 AWS IoT Greengrass 核心軟件v1.10 or later。有關更多信息,請參閱 從 Lambda 函數存取機器學習資源.

  • Lambda 函數可以唯讀存取以相同群組 ID 執行之其他 Lambda 函數部署的程式碼。

  • 當父系 Lambda 函數終止時,AWS IoT Greengrass 不會自動終止在不同的處理工作階段產生子程序或已覆寫 SIGHUP (訊號掛斷) 處理常式的 Lambda 函數,例如使用 nohup 公用程式。

注意

Greengrass 群組的預設容器化設定不適用於連接器

變更 Lambda 函數的容器化會在您部署它時產生問題。如果您已將本機資源指派給新容器化設定不再使用的 Lambda 函數,則部署會失敗。

  • 當您將 Lambda 函數從在 Greengrass 容器中執行變更為在無容器化的情況下執行,則會捨棄函數的記憶體限制。您必須直接存取檔案系統,而不是使用連接的本機資源。您必須在部署前移除所有連接的資源。

  • 當您將 Lambda 函數從在無容器化的情況下執行變更為在容器中執行,您的 Lambda 函數即無法直接存取檔案系統。您必須定義各函數的記憶體上限,或接受預設值 16 MB。您可以在部署前為各 Lambda 函數設定這些設定。

變更 Lambda 函數的容器化設定

  1. 在 AWS IoT 主控台中,選擇 Greengrass,然後選擇 Groups (群組)

  2. 選擇包含想要變更其設定之 Lambda 函數的群組。

  3. 選擇 Lambdas

  4. 在您想要變更的 Lambda 函數上,選擇省略符號 (),然後選擇 Edit configuration (編輯組態)

  5. 變更容器化設定。如果您設定 Lambda 函數為在 Greengrass 容器中執行,則您也必須設定 Memory limit (記憶體限制)Read access to /sys directory (對 /sys 目錄的讀取存取) 屬性

  6. 選擇 Update (更新) 以儲存 Lambda 函數的變更。

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

您還可以使用 CreateFunctionDefinitionCreateFunctionDefinitionVersionAWS 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 函數的預設存取身分

只有 AWS IoT Greengrass Core v1.8 與更新版本才提供這項功能。

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

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

預設存取身分可設定為以標準的 AWS IoT Greengrass 系統帳戶 (ggc_user 和 ggc_group) 執行或使用另一個使用者或群組的許可。建議您對 Greengrass 硬體設定適當的資源限制、檔案許可,以及許可用於執行使用者定義或系統 Lambda 函數之使用者和群組的磁碟配額。

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

  1. 在 AWS IoT 主控台中,選擇 Greengrass,然後選擇 Groups (群組)

  2. 選擇您希望變更設定的群組。

  3. 選擇 Settings (設定)。

  4. Lambda runtime environment (執行時間環境) 下,針對 Default Lambda function user ID/ group ID (預設 Lambda 函數使用者 ID/群組 ID),選擇 Another user ID/group ID (另一個使用者 ID/群組 ID)

    選擇此選項時,會顯示 UID (number) (UID (number))GID (number) (GID (number)) 欄位。

  5. 輸入使用者 ID、群組 ID 或兩者。如果您將欄位留白,則會使用個別的 Greengrass 系統帳戶 (ggc_user 或 ggc_group)。

    • 針對 UID (number) (UID (number)),輸入使用者 ID,而此使用者擁有您想要根據預設在群組中執行 Lambda 函數的許可。您可以使用 AWS IoT Greengrass 裝置上的 getent passwd 命令查看使用者 ID。

    • 針對 GID (number) (GID (number)),輸入群組 ID,而此群組擁有您想要根據預設在群組中執行 Lambda 函數的許可。您可以使用 AWS IoT Greengrass 裝置上的 getent group 命令查看群組 ID。

    重要

    執行身分為根使用者會增加資料和裝置的風險。除非您的商業案例要求,否則請勿以根執行 (UID/GID = 0)。如需更多詳細資訊,請參閱「以 Root 身分執行 Lambda 函數」。

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

在群組中設定 Lambda 函數的預設容器化

只有 AWS IoT Greengrass Core v1.7 與更新版本才提供這項功能。

Greengrass 群組的容器化設定會決定群組中 Lambda 函數的預設容器化。

  • Greengrass container (Greengrass 容器) 模式下,Lambda 函數預設為在 AWS IoT Greengrass 容器內的隔離執行時間環境中執行。

  • No container (無容器) 模式下,Lambda 函數預設為以普通 Linux 處理程序執行。

您可以修改群組設定,以指定群組中 Lambda 函數的預設容器化。如果您希望 Lambda 函數能在與群組預設容器化不同的容器化情況下執行,您可以覆寫群組中一或多個 Lambda 函數的這項設定。請先參閱選擇 Lambda 函數容器化時的注意事項,再變更容器化設定。

重要

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

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

  1. 在 AWS IoT 主控台中,選擇 Greengrass,然後選擇 Groups (群組)

  2. 選擇您希望變更設定的群組。

  3. 選擇 Settings (設定)。

  4. Lambda runtime environment (執行時間環境) 下,變更容器化設定。

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