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

AWS IoT Greengrass Version 1 於 2023 年 6 月 30 日進入延長使用壽命階段。如需詳細資訊,請參閱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為綠色 Lambda 函數提供以下群組特定的組態設定。

系統使用者和群組

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

此功能適用於AWS IoT Greengrass核心 v1.7 及更高版本。

重要

除非絕對必要,否則建議您避免以 root 身份執行 Lambda 函數。以 root 身分執行會增加下列風險:

  • 發生意外變更的風險,例如意外刪除重要檔案。

  • 惡意個人對您的資料和裝置造成的風險。

  • 當 Docker 容器使--net=host用和運行時,容器會逃脫的風險。UID=EUID=0

如果您真的需要以 root 身分執行,您必須更新 AWS IoT Greengrass 組態才能啟用它。如需詳細資訊,請參閱 以根身份運行 Lambda 函數

系統使用者 ID (編號)

具有執行 Lambda 函數所需權限之使用者的使用者識別碼。只有當您選擇以其他使用者識別碼/群組 ID 執行時,才能使用此設定。您可以使用AWS IoT Greengrass核心裝置上的getent passwd命令來查詢要用來執行 Lambda 函數的使用者 ID。

如果您使用相同的 UID 在 Greengrass 核心裝置上執行處理序和 Lambda 函數,您的 Greengrass 群組角色可以授與程序臨時登入資料。這些程序可以在 Greengrass 核心部署中使用臨時登入資料。

系統群組識別碼 (編號)

具有執行 Lambda 函數所需權限之群組的群組識別碼。只有當您選擇以其他使用者識別碼/群組 ID 執行時,才能使用此設定。您可以使用AWS IoT Greengrass核心裝置上的getent group命令來查詢要用來執行 Lambda 函數的群組 ID。

Lambda 函數容器化

選擇 Lambda 函數是否以群組的預設容器化執行,或指定應始終用於此 Lambda 函數的容器化。

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

  • 容器化 Lambda 函數在 Greeng rass 器模式下運行。Lambda 函數會在AWS IoT Greengrass容器內的隔離執行階段環境 (或命名空間) 中執行。

  • 非容器化 Lambda 函數會在容器模式下執行。Lambda 函數會以一般 Linux 程序的形式執行,而不會有任何隔離。

此功能適用於AWS IoT Greengrass核心 v1.7 及更高版本。

我們建議您在 Greengrass 容器中執行 Lambda 函數,除非您的使用案例要求它們在沒有容器化的情況下執行。當您的 Lambda 函數在 Greengrass 容器中執行時,您可以使用連接的本機和裝置資源,並獲得隔離和提高安全性的好處。請先參閱選擇 Lambda 函數容器化時的考量事項,再變更 containerization (容器化)。

注意

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

Memory limit (記憶體限制)

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

注意

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

Timeout (逾時)

在函數或要求終止前的時間值。預設為 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。

程序引數

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

環境變數

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

資源存取政策

允許 Lambda 函數存取的最多 10 個本機資源、秘密資源和機器學習資源的清單,以及對應的read-onlyread-write權限。在主控台中,這些關聯資源會列在 [資] 索引標籤的群組配置頁面上。

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

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

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

如需使用 AWS IoT Greengrass API 為使用者定義 Lambda 函數設定群組特定組態設定的相關資訊,請參閱 CreateFunctionDefinitionAWS IoT Greengrass Version 1API 參考AWS CLI命令參考create-function-definition中的。若要將 Lambda 函數部署到 Greengrass 核心,請建立包含函數的函數定義版本,建立參考函數定義版本和其他群組元件的群組版本,然後部署該群組。

以根身份運行 Lambda 函數

此功能適用於AWS IoT Greengrass核心 v1.7 及更高版本。

您必須先更新AWS IoT Greengrass組態以啟用支援,才能以 root 身分執行一或多個 Lambda 函數。依預設,以 root 身分執行 Lambda 函數的 Support 處於關閉狀態。如果您嘗試部署 Lambda 函數並以根 (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 身份執行 Lambda 函數。以 root 身分執行會增加下列風險:

  • 發生意外變更的風險,例如意外刪除重要檔案。

  • 惡意個人對您的資料和裝置造成的風險。

  • 當 Docker 容器使--net=host用和運行時,容器會逃脫的風險。UID=EUID=0

允許 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 函數的使用者識別碼和群組識別碼 (UID/GID) 設定為 0,以根使用者身分執行該 Lambda 函數。

AWS IoT Greengrass如果您不允許 Lambda 函數"allowFunctionsToRunAsRoot"以 root 身份執行,您可以將的值變更為"no"並重新啟動。

選擇 Lambda 函數容器化時的考量事項

此功能適用於AWS IoT Greengrass核心 v1.7 及更高版本。

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

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

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

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

  • 您想要使用自己的 OverlayFS 函數在另一個容器環境中執行 Lambda 函數,但是在 Greengrass 容器中執行時,會遇到覆寫檔案衝突。

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

  • 您有一個以處理程序撰寫的舊版應用程式,並且在以容器化 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 或更新版本。如需詳細資訊,請參閱 從 Lambda 函數存取機器學習資源

  • Lambda 函數對使用相同群組識別碼執行的其他 Lambda 函數的已部署程式碼具有唯讀存取權。

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

注意

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

變更 Lambda 函數的容器化可能會在部署時造成問題。如果您已將本機資源指派給 Lambda 函數,但新的容器化設定無法再使用,則部署會失敗。

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

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

若要變更 Lambda 函數的容器化設定
  1. 在AWS IoT主控台瀏覽窗格的 [管理] 下,展開 [Greengrass 裝置],然後選擇 [群組 (V1)]。

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

  3. 選擇 Lambda 函數索引標籤。

  4. 在您要變更的 Lambda 函數上,選擇省略號 (...),然後選擇 [編輯組態]。

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

  6. 選擇 [儲存],然後選擇 [確認],將變更儲存至 Lambda 函數。

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

您也可以在 AWS IoT GreengrassAPI 參考CreateFunctionDefinitionVersion中使用CreateFunctionDefinition和。如果您要變更容器化設定,請務必也要更新其他參數。例如,如果您要從在 Greengrass 容器中執行 Lambda 函數變更為在沒有容器化的情況下執行,請務必清除參數。MemorySize

判斷您 Greengrass 裝置支援的隔離模式

您可以使用 AWS IoT Greengrass 相依性檢查程式,判斷您 Greengrass 裝置支援的隔離模式 (Greengrass 容器/沒有容器)。

執行 AWS IoT Greengrass 相依性檢查程式
  1. GitHub存放庫下載並執行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
  2. more 出現的位置,按 Spacebar 鍵可顯示另一頁文字。

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

設定群組中 Lambda 函數的預設存取身分

此功能適用於AWS IoT Greengrass核心 v1.8 及更高版本。

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

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

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

要修改您的 AWS IoT Greengrass 群組的預設存取身分
  1. 在AWS IoT主控台瀏覽窗格的 [管理] 下,展開 [Greengrass 裝置],然後選擇 [群組 (V1)]。

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

  3. 選擇 Lambda 函數索引標籤,然後在預設 Lambda 函數執行階段環境區段下選擇編輯

  4. 在 [編輯預設 Lambda 函數執行階段環境] 頁面的 [預設系統使用者和群組] 下,選擇 [其他使用者 ID/群組ID]。

    當您選擇此選項時,會顯示 [系統使用者 ID (編號)] 和 [系統群組 ID (編號)] 欄位。

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

    • 對於系統使用者 ID (編號),請輸入具有預設使用權限的使用者的使用者 ID,以便在群組中執行 Lambda 函數。您可以使用 AWS IoT Greengrass 裝置上的 getent passwd 命令查看使用者 ID。

    • 對於系統群組 ID (編號),請輸入群組 ID,該群組具有預設使用的權限來執行群組中的 Lambda 函數。您可以使用 AWS IoT Greengrass 裝置上的 getent group 命令查看群組 ID。

    重要

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

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

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

此功能適用於AWS IoT Greengrass核心 v1.7 及更高版本。

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

  • Greengrass 容器模式中,Lambda 函數預設會在AWS IoT Greengrass容器內的隔離執行階段環境中執行。

  • 無容器模式下,Lambda 函數依預設會以一般 Linux 程序執行。

您可以修改群組設定,為群組中的 Lambda 函數指定預設容器化。如果您希望 Lambda 函數以與群組預設值不同的容器化執行,則可以覆寫群組中一或多個 Lambda 函數的此設定。請先參閱選擇 Lambda 函數容器化時的考量事項,再變更容器化設定。

重要

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

修改您 AWS IoT Greengrass 群組的容器化設定
  1. 在AWS IoT主控台瀏覽窗格的 [管理] 下,展開 [Greengrass 裝置],然後選擇 [群組 (V1)]。

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

  3. 選擇 Lambda 函數索引標籤。

  4. 預設 Lambda 函數執行階段環境下,選擇編輯

  5. 編輯預設 Lambda 函數執行階段環境中,頁面的預設 Lambda 函數容器化下,變更容器化設定。

  6. 選擇儲存

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