Amazon IoT Greengrass Version 12023 年 6 月 30 日进入延长寿命阶段。有关更多信息,请参阅Amazon IoT Greengrass V1维护政策。在此日期之后,Amazon IoT Greengrass V1不会发布提供功能、增强功能、错误修复或安全补丁的更新。在上运行的设备Amazon IoT Greengrass V1不会受到干扰,将继续运行并连接到云端。我们强烈建议你迁移到Amazon IoT Greengrass Version 2,它补充说重要的新功能和支持其他平台。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
从 Lambda 函数访问机器学习资源
用户定义的 Lambda 函数可以访问机器学习资源以在Amazon IoT Greengrass核心。机器学习资源由经过训练的模型和下载到核心设备的其他构件组成。
要允许 Lambda 函数访问核心上的机器学习资源,必须将该资源附加到 Lambda 函数并定义访问权限。这些区域有:容器化模式附属公司(或附上) Lambda 函数决定了你如何执行此操作。
机器学习资源的访问权限
从 Amazon IoT Greengrass 核心 v1.10.0 开始,您可以为机器学习资源定义资源所有者。资源所有者表示 Amazon IoT Greengrass 用于下载资源构件的操作系统组和权限。如果未定义资源所有者,则下载的资源构件仅可供 root 访问。
如果非容器化的 Lambda 函数访问机器学习资源,则必须定义资源所有者,因为容器中没有权限控制。非容器化的 Lambda 函数可以继承资源所有者权限并使用它们访问资源。
如果只有容器化的 Lambda 函数访问资源,我们建议您使用函数级权限,而不是定义资源所有者。
资源拥有者属性
资源所有者指定组所有者和组所有者权限。
-
组所有者。核心设备上现有 Linux 操作系统组的组 (GID) 的 ID。组的权限将添加到 Lambda 进程。具体而言,GID 将添加到 Lambda 函数的补充组 ID。
如果将 Greengrass 组中的 Lambda 函数配置为Run as与机器学习资源的资源所有者相同的操作系统组,则必须将该资源附加到 Lambda 函数。否则,部署失败,因为此配置提供了隐式权限,Lambda 函数可以在没有Amazon IoT Greengrass授权。如果 Lambda 函数以根身份运行,则会跳过部署验证检查。
我们建议您使用 Greengrass 核心上的其他资源、Lambda 函数或文件未使用的操作系统组。使用共享的操作系统组可为附加的 Lambda 函数提供比其所需更多的访问权限。如果使用共享的操作系统组,还必须将附加的 Lambda 函数附加到使用共享操作系统组的所有机器学习资源。否则,部署将失败。
-
组所有者权限。要添加到 Lambda 进程的只读或读取和写入权限。
非容器化的 Lambda 函数必须继承对于资源的这些访问权限。容器化的 Lambda 函数可以继承这些资源级权限,或定义函数级权限。如果它们定义了函数级权限,则这些权限必须与资源级权限相同或更具限制性。
下表显示了受支持的访问权限配置。
注意
当您使用以下应用程序时:Amazon IoT Greengrass用于配置 Lambda 函数和资源的 APIResourceId
属性也是必需属性。这些区域有:ResourceId
属性将机器学习资源附加到 Lambda 函数附加到了。
定义 Lambda 函数的访问权限
在Amazon IoT控制台中,您可以在配置机器学习资源或将其附加到 Lambda 函数时定义访问权限。
- 容器化的 Lambda 函数
-
如果只将容器化的 Lambda 函数附加到机器学习资源:
-
选择没有系统组作为机器学习资源的资源所有者。当只有容器化的 Lambda 函数访问机器学习资源时,这是建议使用的设置。否则,您可能会为附加的 Lambda 函数授予比其所需更多的访问权限。
-
- 非容器化的 Lambda 函数(需要 GGC v1.10 或更高版本)
-
如果将任何非容器化的 Lambda 函数附加到机器学习资源:
-
指定系统组 ID (GID)以用作机器学习资源的资源所有者。选择指定系统组和权限然后输入 GID。您可以使用
getent group
命令查找系统组的 ID。 -
选择只读访问权限要么读写权限(对于 )系统组权限.
-
定义 Lambda 函数的访问权限
在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 v1.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
属性,包括子GroupOwner
和GroupPermission
属性。例如:"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 函数使用特定于平台的操作系统接口以访问核心设备上的机器学习资源。
您的模型加载实现取决于您的 ML 库。
问题排查
使用以下信息帮助解决访问机器学习资源的问题。
主题
- ML 无效ModelOwner - GroupOwnerSetting ML and permission (ML) 中提供了 GroupOwner 要么 GroupPermission 不存在
- NoContainer 函数无法在附加Machine Learning 资源时配置权限。 <function-arn>是指在资源 <resource-id><ro/rw> 访问策略中具有权限的机器学习资源。
- 函数<function-arn>指的Machine Learning 资源<resource-id>在两者中都缺少权限 ResourceAccessPolicy 和资源 OwnerSetting.
- 函数<function-arn>是指<resource-id>具有权限\ "rw\” 的Machine Learning 资源,而资源所有者设置 GroupPermission只允许\ “ro\”。
- NoContainer 函数<function-arn>是指嵌套目标路径的资源。
- Lambda <function-arn> 通过共享同一组所有者 ID 获得对资源 <resource-id> 的访问权限
ML 无效ModelOwner - GroupOwnerSetting ML and permission (ML) 中提供了 GroupOwner 要么 GroupPermission 不存在
解决方案:如果机器学习资源包含ResourceDownloadOwnerSetting对象,但必需GroupOwner
要么GroupPermission
属性未定义。要解决此问题,请定义缺失的属性。
NoContainer 函数无法在附加Machine Learning 资源时配置权限。 <function-arn>是指在资源 <resource-id><ro/rw> 访问策略中具有权限的机器学习资源。
解决方案:如果非容器化的 Lambda 函数指定了对机器学习资源的函数级权限,则会收到此错误。非容器化函数必须从在机器学习资源上定义的资源所有者权限继承权限。要解决此问题,选择继承资源拥有者权限(console) 或从 Lambda 函数的资源访问策略中移除权限(API)。
函数<function-arn>指的Machine Learning 资源<resource-id>在两者中都缺少权限 ResourceAccessPolicy 和资源 OwnerSetting.
解决方案:如果未为附加的 Lambda 函数或资源配置对机器学习资源的权限,则会收到此错误。要解决此问题,请在ResourceAccessPolicyLambda 函数的属性或OwnerSetting资源的属性。
函数<function-arn>是指<resource-id>具有权限\ "rw\” 的Machine Learning 资源,而资源所有者设置 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 函数。