從 Lambda 函數存取機器學習資源 - AWS IoT Greengrass

若我們提供該指南英語版本的翻譯,在有任何牴觸的狀況下請以英文版本的指南為主。其透過機器翻譯提供翻譯。

從 Lambda 函數存取機器學習資源

使用者定義的 Lambda 函數可存取機器學習資源,以在 AWS IoT Greengrass 核心 上執行本機推論。機器學習資源包含培訓過的模型,以及下載至核心裝置的其他成品。

若要允許 Lambda 函數存取核心上的機器學習資源,必須將資源附加至 Lambda 函數並定義存取權限。附屬 (或附加) Lambda 函數的容器化模式決定了執行此操作的方式。

機器學習資源的存取權限

從 AWS IoT Greengrass Core v1.10.0 開始,您可以定義機器學習資源的資源擁有者。資源擁有者代表作業系統群組和 AWS IoT Greengrass 用來下載資源成品的權限。如果未定義資源擁有者,則僅限根存取的下載資源成品。

  • 如果非容器化的 Lambda 函數存取機器學習資源,您必須定義資源擁有者,因為沒有來自容器的權限控制。非容器化的 Lambda 函數可以繼承資源擁有者權限,並使用函數來存取資源。

     

  • 如果只有容器化的 Lambda 函數存取資源,建議您使用函數層級的權限,而不是定義資源擁有者。

     

資源擁有者屬性

資源擁有者指定群組擁有者和群組擁有者權限。

群組擁有者。核心裝置上現有 Linux 作業系統群組的 ID (GID)。群組權限會新增至 Lambda 處理程序。具體而言,GID 會加入 Lambda 函數的補充群組 ID。

如果 Greengrass 群組中的 Lambda 函數設定為與機器學習資源的資源擁有者相同的作業系統群組執行,則必須將資源附加至該 Lambda 函數。否則,部署會失敗,因為此組態會提供 Lambda 函數在未經 AWS IoT Greengrass 授權的情況下,用來存取資源的隱含權限。如果 Lambda 函數以 root 身分執行 (UID=0),則會略過部署驗證檢查。

建議您使用其他資源、Lambda 函數,或 Greengrass 核心上的檔案不使用的作業系統群組。使用共用作業系統群組可提供附加 Lambda 函數比所需更多的存取權限。如果您使用共用作業系統群組,附加的 Lambda 函數也必須附加至使用共用作業系統群組的所有機器學習資源。否則,部署會失敗。

群組擁有者權限。新增至 Lambda 處理程序的唯讀權限或讀取和寫入權限。

非容器化 Lambda 函數必須將這些存取權限繼承至資源。容器化的 Lambda 函數可以繼承這些資源層級權限,或定義功能層級權限。如果他們定義了函數層級權限,則權限必須與資源層級權限相同或更加嚴格。

下表顯示支援的存取權限組態。

GGC v1.10 or later
屬性 如果只有容器化的 Lambda 函數存取資源 如果有任何非容器化 Lambda 函數存取資源
函數層級屬性

權限 (讀取/寫入)

除非資源定義資源擁有者,否則為必要項目。如果已定義資源擁有者,則函數層級權限必須與資源擁有者權限相同或更加嚴格。

如果只有容器化 Lambda 函數存取資源,建議您不要定義資源擁有者。

非容器化 Lambda 函數:

不支援.非容器化的 Lambda 函數必須繼承資源層級權限。

容器化 Lambda 函數:

可選,但必須與資源層級權限相同或更加嚴格。

資源層級屬性

資源擁有者

可選 (不建議使用)。

必要。

權限 (讀取/寫入)

可選 (不建議使用)。

必要。

GGC v1.9 or earlier
屬性 如果只有容器化的 Lambda 函數存取資源 如果有任何非容器化 Lambda 函數存取資源
函數層級屬性

權限 (讀取/寫入)

必要。

不支援.

資源層級屬性

資源擁有者

不支援.

不支援.

權限 (讀取/寫入)

不支援.

不支援.

注意

使用 AWS IoT Greengrass API 來設定 Lambda 函數和資源時,也需要函數層級 ResourceId 屬性。ResourceId 屬性會將機器學習資源附加至 Lambda 函數。

定義 Lambda 函數的存取權限 (主控台)

在 AWS IoT 主控台 中,您可以在設定機器學習資源或將其附加至 Lambda 函數時定義存取權限。

容器化 Lambda 函數

如果只將容器化 Lambda 函數附加至機器學習資源:

  • 選擇 No OS group (非作業系統群組) 做為機器學習資源的資源擁有者。當只有容器化 Lambda 函數存取機器學習資源時,建議使用此設定。否則,您可能會為附加 Lambda 函數提供比所需更多的存取權限。

     

  • 針對 Lambda 函數,選取 Read-only access (唯讀存取)Read and write access (讀取和寫入存取權限)。將 Lambda 函數附加至機器學習資源時,您可以這樣做:

    
                  資源擁有者設定為非作業系統群組,而且 Lambda 函數權限在資源設定中設定為唯讀存取權。

    或者,當您將機器學習資源附加至 Lambda 函數時:

    
                  資源擁有者設定為非作業系統群組,而且 Lambda 函數權限在函數設定中設定為唯讀存取權。

 

非容器化 Lambda 函數 (需要 GGC v1.10 or later)

如果有任何非容器化 Lambda 函數附加至機器學習資源:

  • 指定要用的作業系統群組 ID (GID),做為機器學習資源的資源擁有者。選擇 Specify OS group and permission (指定作業系統群組和權限),然後輸入 GID。您可以使用核心裝置上的 getent group 命令查看作業系統群組的 ID。

     

  • 針對作業系統群組權限,選擇 Read-only access (唯讀存取)Read and write access (讀取和寫入權限)

    
                  針對機器學習資源,指定作業系統群組和存取權限。
  • 針對非容器化的 Lambda 函數存取權限,選擇 Inherit resource owner permissions (繼承資源擁有者權限)。您可以在將 Lambda 函數和資源建立隸屬關係時執行此操作:

    
                  繼承機器學習資源的存取權限。

    對於能同時存取機器學習資源的容器化 Lambda 函數,請選擇繼承作業系統群組權限或選擇功能層級權限。如果您選擇功能層級權限,則必須與作業系統群組權限相同或更加嚴格。

定義 Lambda 函數的存取權限 (API)

在 AWS IoT Greengrass API 中,您可以針對資源的 Lambda 函數或 OwnerSetting 屬性,定義 ResourceAccessPolicy 屬性中機器學習資源的權限。

容器化 Lambda 函數

如果只將容器化 Lambda 函數附加至機器學習資源:

  • 對於容器化 Lambda 函數,請定義 ResourceAccessPolicies 屬性的 Permission 屬性中的存取權限。例如:

    "Functions": [ { "Id": "my-containerized-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", "FunctionConfiguration": { "Environment": { "ResourceAccessPolicies": [ { "ResourceId": "my-resource-id", "Permission": "ro-or-rw" } ] }, "MemorySize": 512, "Pinned": true, "Timeout": 5 } } ]
  • 對於機器學習資源,請省略 OwnerSetting 屬性。例如:

    "Resources": [ { "Id": "my-resource-id", "Name": "my-resource-name", "ResourceDataContainer": { "S3MachineLearningModelResourceData": { "DestinationPath": "/local-destination-path", "S3Uri": "s3://uri-to-resource-package" } } } ]

    當只有容器化 Lambda 函數存取機器學習資源時,建議使用此設定。否則,您可能會為附加 Lambda 函數提供比所需更多的存取權限。

 

非容器化 Lambda 函數 (需要 GGC v1.10 or later)

如果有任何非容器化 Lambda 函數附加至機器學習資源:

  • 針對非容器化 Lambda 函數,請省略 ResourceAccessPolicies 中的 Permission 屬性。此設定是必要的,並允許函數繼承資源層級權限。例如:

    "Functions": [ { "Id": "my-non-containerized-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", "FunctionConfiguration": { "Environment": { "Execution": { "IsolationMode": "NoContainer", }, "ResourceAccessPolicies": [ { "ResourceId": "my-resource-id" } ] }, "Pinned": true, "Timeout": 5 } } ]
  • 針對同時存取機器學習資源的容器化 Lambda 函數,請省略中的 Permission 屬性,ResourceAccessPolicies 或定義與資源層級權限相同或更嚴格的權限。例如:

    "Functions": [ { "Id": "my-containerized-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", "FunctionConfiguration": { "Environment": { "ResourceAccessPolicies": [ { "ResourceId": "my-resource-id", "Permission": "ro-or-rw" // Optional, but cannot exceed the GroupPermission defined for the resource. } ] }, "MemorySize": 512, "Pinned": true, "Timeout": 5 } } ]
  • 對於機器學習資源,定義 OwnerSetting 屬性,包括子項 GroupOwnerGroupPermission 屬性。例如:

    "Resources": [ { "Id": "my-resource-id", "Name": "my-resource-name", "ResourceDataContainer": { "S3MachineLearningModelResourceData": { "DestinationPath": "/local-destination-path", "S3Uri": "s3://uri-to-resource-package", "OwnerSetting": { "GroupOwner": "os-group-id", "GroupPermission": "ro-or-rw" } } } } ]

從 Lambda 函數程式碼存取機器學習資源程式碼

使用者定義的 Lambda 函數使用平台專屬的作業系統界面,存取核心裝置上的機器學習資源。

GGC v1.10 or later

對於容器化 Lambda 函數,資源掛載在 Greengrass 容器內,並可供為資源定義的本地目標路徑使用。對於非容器化 Lambda 函數,資源透過符號連接到 Lambda 專屬工作目錄,並傳遞給 Lambda 處理流程中的 AWS_GG_RESOURCE_PREFIX 環境變數。

若要取得機器學習資源下載成品的路徑,Lambda 函數會將 AWS_GG_RESOURCE_PREFIX 環境變數附加至為資源定義的本機目的地路徑。對於容器化 Lambda 函數,返回值是一個單一正斜線 (/)。

resourcePath = os.getenv("AWS_GG_RESOURCE_PREFIX") + "/destination-path" with open(resourcePath, 'r') as f: # load_model(f)
GGC v1.9 or earlier

機器學習資源的下載成品位於為資源定義的本機目的地路徑中。只有容器化的 Lambda 函數才能存取 AWS IoT Greengrass Core v1.9 及更早版本的機器學習資源。

resourcePath = "/local-destination-path" with open(resourcePath, 'r') as f: # load_model(f)

模型載入實作取決於您的 ML 程式庫。

故障診斷

使用下列資訊,協助疑難排解存取機器學習資源的問題。

InvalidMLModelOwner - GroupOwnerSetting 在 ML 模型資源中提供,但是 GroupOwner 或 GroupPermission 不存在

解決方案:如果機器學習資源包含 ResourceDownloadOwnerSetting 物件,但未定義必要的 GroupOwnerGroupPermission 屬性,便會收到此錯誤訊息。若要解決此問題,請定義遺失的屬性。

 

附加 Machine Learning 資源時,NoContainer 函數無法設定權限。<function-arn> 係指在資源存取政策中,具有權限 <ro/rw> 的 Machine Learning 資源 <resource-id>。

解決方案:如果非容器化 Lambda 函數指定機器學習資源的功能層級權限,便會收到此錯誤訊息。非容器化函數必須從機器學習資源上定義的資源擁有者權限繼承權限。若要解決這個問題,請選擇 inherit resource owner permissions (繼承資源擁有者權限) (主控台),或 從 Lambda 函數的資源存取政策 (API) 移除權限

 

函數 <function-arn> 係指在資源 <resource-id> ResourceAccessPolicy 和資源 OwnerSetting 中具有遺失權限的 Machine Learning 資源。

解決方案:如果未針對附加的 Lambda 函數或資源,設定機器學習資源的權限,便會收到此錯誤訊息。若要解決此問題,請設定 Lambda 函數 ResourceAccessPolicy 屬性中的權限,或資源的 OwnerSetting 屬性。

 

函數 <function-arn> 係指具有 \"rw\" 權限的 Machine Learning 資源 <resource-id>,而資源擁有者設定 GroupPermission 只允許 \"ro\"。

解決方案:如果為附加 Lambda 函數定義的存取權限超過為機器學習資源定義的資源擁有者權限,便會收到此錯誤訊息。若要解決這個問題,請設定權限限制較多的 Lambda 函數,或資源擁有者限制較少的權限。

 

NoContainer 函數 <function-arn> 係指巢狀目的地路徑的資源。

解決方案:如果多個附加至非容器化 Lambda 函數的機器學習資源使用相同目的地路徑或巢狀目的地路徑,便會收到此錯誤訊息。若要解決此問題,請為資源指定個別目的地路徑。

 

Lambda <function-arn> 透過共用相同群組擁有者 ID 來獲得資源 <resource-id> 的存取權

解決方案:如果 runtime.log 將相同的作業系統群組指定為 Lambda 函式的執行身分和機器學習資源的資源擁有者,但資源未附加至 Lambda 函數,便會收到此錯誤訊息。這種設定能提供 Lambda 函數的隱含權限,不用 AWS IoT Greengrass 授權也可以用於存取資源。

若要解決這個問題,請使用其中一個屬性的不同作業系統群組,或將機器學習資源附加至 Lambda 函數。

另請參閱