从 Lambda 函数访问机器学习资源 - AWS IoT Greengrass
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

从 Lambda 函数访问机器学习资源

用户定义的 Lambda 函数可以访问机器学习资源以在 AWS IoT Greengrass Core 上运行本地推断。机器学习资源由经过训练的模型和下载到核心设备的其他构件组成。

要允许 Lambda 函数访问核心上的机器学习资源,必须将该资源附加到 Lambda 函数并定义访问权限。附属(或附加)的 Lambda 函数的容器化模式决定了您如何执行此操作。

机器学习资源的访问权限

从 AWS IoT Greengrass 核心 v1.10.0 开始,您可以为机器学习资源定义资源所有者。资源所有者表示 AWS IoT Greengrass 用于下载资源构件的操作系统组和权限。如果未定义资源所有者,则下载的资源构件仅可供 root 访问。

  • 如果非容器化 Lambda 函数访问机器学习资源,则必须定义资源所有者,因为容器中没有权限控制。非容器化 Lambda 函数可以继承资源所有者权限并使用它们访问资源。

     

  • 如果只有容器化 Lambda 函数访问资源,我们建议您使用函数级别的权限,而不是定义资源所有者。

     

资源拥有者属性

资源所有者指定组所有者和组所有者权限。

组所有者。核心设备上现有 Linux 操作系统组的组 (GID) 的 ID。组的权限将添加到 Lambda 进程。具体而言,GID 将添加到 Lambda 函数的补充组 ID。

如果将 Greengrass 组中的 Lambda 函数配置为以与机器学习资源的资源所有者相同的操作系统组身份运行 ,则必须将该资源附加到该 Lambda 函数。否则,部署失败,因为此配置提供了隐式权限, Lambda 函数可以在未经 AWS IoT Greengrass 授权的情况下访问资源。如果 Lambda 函数以 root 身份运行,则会跳过部署验证检查 (UID=0)。

我们建议您使用 Greengrass 核心上的其他资源、 Lambda 函数或文件未使用的操作系统组。使用共享的操作系统组可为附加的 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 函数附加到机器学习资源:

  • 指定要用作机器学习资源的资源所有者的操作系统组 (GID) 的 ID。选择 Specify OS group and permission (指定操作系统组和权限),然后输入 GID。您可以在您的核心设备上使用 getent group 命令查找操作系统组的 ID。

     

  • 为操作系统组权限选择 Read-only access (只读访问权限)Read and write access (读写访问权限)

    
                  指定机器学习资源的操作系统组和访问权限。
  • 选择 Inherit resource owner permissions (继承资源所有者权限) 以获得非容器化 Lambda 函数访问权限。您可以在关联 Lambda 函数和资源时执行此操作:

    
                  继承机器学习资源的访问权限。

    对于同时访问机器学习资源的容器化 Lambda 函数,选择以继承操作系统组权限或选择函数级权限。如果您选择功能级别的权限,它们必须与操作系统组权限相同或更具限制性。

定义 Lambda 函数的访问权限 (API)

在 AWS IoT Greengrass API 中,您可以在 Lambda 函数的 ResourceAccessPolicy 属性或机器学习资源的 OwnerSetting 属性中定义对此资源的权限。

容器化 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 函数,请省略 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" // 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 核心 v1.9 及更早版本中的机器学习资源。

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

您的模型加载实现取决于您的 ML 库。

故障排除

使用以下信息帮助解决访问机器学习资源的问题。

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

解决方案:如果机器学习资源包含 ResourceDownloadOwnerSetting 对象,但未定义必需的 GroupOwnerGroupPermission 属性,则会收到此错误。要解决此问题,请定义缺失的属性。

 

附加机器学习资源时,NoContainer 函数无法配置权限。<function-arn> 是指在资源访问策略中具有权限 <ro/rw> 的机器学习资源 <resource-id>。

解决方案: 如果非容器化 Lambda 函数指定了对机器学习资源的函数级权限,则会收到此错误。非容器化函数必须从在机器学习资源上定义的资源所有者权限继承权限。要解决此问题,请选择继承资源所有者权限(控制台)或从 Lambda 函数的资源访问策略 (API) 中删除权限

 

函数 <function-arn> 指在 ResourceAccessPolicy 和资源 OwnerSetting 中都缺少权限的机器学习资源 <resource-id>。

解决方案:如果未为附加的 Lambda 函数或资源配置对机器学习资源的权限,则会收到此错误。要解决此问题,请在 Lambda 函数的 ResourceAccessPolicy 属性中或资源的 OwnerSetting 属性中配置权限。

 

函数 <function-arn> 是指具有权限 \"rw\" 的机器学习资源 <resource-id>,而资源所有者设置 GroupPermission 仅允许 \"ro\"。

解决方案:如果为附加的 Lambda 函数定义的访问权限超过为机器学习资源定义的资源所有者权限,则会收到此错误。要解决此问题,请为 Lambda 函数设置限制更多的权限或为资源所有者设置限制较少的权限。

 

NoContainer 函数 <function-arn> 是指嵌套目标路径的资源。

解决方案:如果附加到非容器化 Lambda 函数的多个机器学习资源使用相同的目标路径或嵌套的目标路径,则会收到此错误。要解决此问题,请为资源指定单独的目标路径。

 

Lambda <function-arn> 通过共享同一组所有者 ID 获得对资源 <resource-id> 的访问权限

解决方案:如果将相同的操作系统组指定为 Lambda 函数的运行身份标识和机器学习资源的资源所有者,但资源未附加到 Lambda 函数,则会在 runtime.log 中收到此错误。此配置为 Lambda 函数提供隐式权限,它可以使用这些权限来访问资源而无需 AWS IoT Greengrass 授权。

要解决此问题,请为其中一个属性使用不同的操作系统组,或将机器学习资源附加到 Lambda 函数。

另请参阅