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

您正在查看Amazon IoT Greengrass Version 1.Amazon IoT Greengrass Version 2是最新的主要版本Amazon IoT Greengrass. 有关使用Amazon IoT Greengrass V2,请参阅Amazon IoT Greengrass Version 2开发人员指南.

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

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

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

要允许 Lambda 函数访问核心上的机器学习资源,必须将该资源附加到 Lambda 函数并定义访问权限。这些区域有:容器化模式的附属公司(或Attage)Lambda 函数决定了你如何做到这一点。

机器学习资源的访问权限

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

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

     

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

     

资源拥有者属性

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

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

如果 Greengrass 组中的 Lambda 函数配置为运行方式与机器学习资源的资源所有者相同的操作系统组,则必须将该资源附加到 Lambda 函数。否则,部署失败,因为此配置提供了隐式权限,Lambda 函数可以使用这些权限来访问资源而无需Amazon IoT Greengrass授权。如果 Lambda 函数以根用户身份 (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 函数访问资源
函数级属性

权限(读/写)

必填项。

不支持.

资源级属性

资源拥有者

不支持.

不支持.

权限(读/写)

不支持.

不支持.

注意

当您使用Amazon IoT GreengrassAPI 来配置 Lambda 函数和资源,函数级别ResourceId属性也是必需属性。这些区域有:ResourceId属性将机器学习资源附加到 Lambda 函数。

定义 Lambda 函数的访问权限(控制台)

在Amazon IoT控制台中,您可以在配置机器学习资源或将其附加到 Lambda 函数时定义访问权限。

容器化 Lambda 函数

如果只将容器化 Lambda 函数附加到机器学习资源:

  • 选择 No OS group (无操作系统组) 作为机器学习资源的资源所有者。当只有容器化 Lambda 函数访问机器学习资源时,这是建议使用的设置。否则,您可能会为附加的 Lambda 函数授予比其所需更多的访问权限。

     

  • 选择只读访问权限或者读取和写入访问获取 Lambda 函数访问权限。当您将 Lambda 函数附加到机器学习资源时,可以执行此操作:

    
                  资源所有者设置为“无操作系统组”,并在资源配置中将 Lambda 函数权限设置为只读访问。

    或者,当您将机器学习资源附加到 Lambda 函数时:

    
                  资源所有者设置为“无操作系统组”,并在函数配置中将 Lambda 函数权限设置为只读访问。

 

非容器化 Lambda 函数(需要 GGC 版本 1.10 或更高版本)

如果将任何非容器化 Lambda 函数附加到机器学习资源:

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

     

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

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

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

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

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

在Amazon IoT GreengrassAPI,您可以在ResourceAccessPolicy属性或 Lambda 函数的OwnerSetting属性。

容器化 Lambda 函数

如果只将容器化 Lambda 函数附加到机器学习资源:

  • 对于容器化 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" } ] }, "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 版本 1.10 或更高版本)

如果将任何非容器化 Lambda 函数附加到机器学习资源:

  • 对于非容器化 Lambda 函数,请省略Permission属性ResourceAccessPolicies. 此配置是必需的,并允许函数继承资源级权限。例如:

    "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 的工作目录并传递给AWS_GG_RESOURCE_PREFIX环境 Lambda 量。

要获取机器学习资源的下载构件的路径,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 函数才能访问Amazon IoT Greengrass核心 v1.9 及更早版本。

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

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

Troubleshooting

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

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

另请参阅