

终止支持通知：2026 年 10 月 7 日， AWS 将停止对的支持。 AWS IoT Greengrass Version 1 2026 年 10 月 7 日之后，您将无法再访问这些 AWS IoT Greengrass V1 资源。如需了解更多信息，请访问[迁移自 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

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

# 从 Lambda 函数访问机器学习资源
<a name="access-ml-resources"></a>

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

要允许 Lambda 函数访问核心上的机器学习资源，必须将该资源附加到 Lambda 函数并定义访问权限。关联（或*附加*）的 Lambda 函数的[容器化模式](lambda-group-config.md#lambda-function-containerization)决定了您如何执行此操作。

## 机器学习资源的访问权限
<a name="ml-resource-permissions"></a>

从 C AWS IoT Greengrass ore v1.10.0 开始，您可以为机器学习资源定义资源的所有者。资源所有者代表 AWS IoT Greengrass 用于下载资源工件的操作系统组和权限。如果未定义资源所有者，则下载的资源构件仅可供根用户访问。
+ 如果非容器化 Lambda 函数访问机器学习资源，则必须定义资源所有者，因为容器中没有权限控制。非容器化 Lambda 函数可以继承资源所有者权限并使用它们访问资源。

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

   

### 资源拥有者属性
<a name="ml-resource-owner"></a>

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

  
**组所有者**。核心设备上现有 Linux 操作系统组的组 (GID) 的 ID。组的权限将添加到 Lambda 进程。具体而言，GID 被添加到 Lambda 函数 IDs 的补充组中。  
如果将 Greengrass 组中的 Lambda 函数配置为以与机器学习资源的资源所有者相同的操作系统组身份[运行](lambda-group-config.md#lambda-access-identity)，则必须将该资源附加到该 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 函数的访问权限（控制台）
<a name="ml-resource-permissions-console"></a>

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

**容器化 Lambda 函数**  
如果只将容器化 Lambda 函数附加到机器学习资源：  
+ 选择 **无系统组** 作为机器学习资源的资源拥有者。当只有容器化 Lambda 函数访问机器学习资源时，这是建议使用的设置。否则，您可能会为附加的 Lambda 函数授予比其所需更多的访问权限。

   
 

**非容器化 Lambda 函数**（需要 GGC v1.10 或更高版本）  
如果将任何非容器化 Lambda 函数附加到机器学习资源：  
+ 指定要用作机器学习资源的资源拥有者的**系统组的 ID (GID)**。选择 **指定系统组和权限**，然后输入 GID。您可以在您的核心设备上使用 `getent group` 命令查找系统组的 ID。

   
+ 为**系统组权限**选择 **只读访问权限**或 **读写访问权限**。

## 定义 Lambda 函数的访问权限 (API)
<a name="ml-resource-permissions-api"></a>

在 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 或更高版本）  
如果将任何非容器化 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` 属性，包括子 `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 函数代码访问机器学习资源
<a name="access-resource-function-code"></a>

用户定义的 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 库。

## 问题排查
<a name="access-ml-resources-troubleshooting"></a>

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

**Topics**
+ [MLModel所有者无效- GroupOwnerSetting 在 ML 模型资源中提供，但 GroupOwner 或 GroupPermission 不存在](#nocontainer-lambda-invalid-ml-model-owner)
+ [NoContainer 在附加 Machine Learning 资源时，函数无法配置权限。 <function-arn>指在资源 <resource-id><ro/rw> 访问策略中具有权限的机器学习资源。](#nocontainer-lambda-invalid-resource-access-policy)
+ [函数<function-arn>指的是 Machine <resource-id>Learning 资源，但两者都缺少权限 ResourceAccessPolicy 和资源 OwnerSetting。](#nocontainer-lambda-missing-access-permission)
+ [函数<function-arn>指的是具有<resource-id>\$1 “rw\$1” 权限的 Machine Learning 资源，而资源所有者设置 GroupPermission 仅允许\$1 “ro\$1”。](#container-lambda-invalid-rw-permissions)
+ [NoContainer 函数<function-arn>是指嵌套目标路径的资源。](#nocontainer-lambda-nested-destination-path)
+ [Lambda <function-arn> 通过共享同一组所有者 ID 获得对资源 <resource-id> 的访问权限](#lambda-runas-and-resource-owner)

### MLModel所有者无效- GroupOwnerSetting 在 ML 模型资源中提供，但 GroupOwner 或 GroupPermission 不存在
<a name="nocontainer-lambda-invalid-ml-model-owner"></a>

**解决方案：**如果机器学习资源包含[ResourceDownloadOwnerSetting](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-resourcedownloadownersetting.html)对象，但未定义必需的`GroupOwner`或`GroupPermission`属性，则会收到此错误。要解决此问题，请定义缺失的属性。

 

### NoContainer 在附加 Machine Learning 资源时，函数无法配置权限。 <function-arn>指在资源 <resource-id><ro/rw> 访问策略中具有权限的机器学习资源。
<a name="nocontainer-lambda-invalid-resource-access-policy"></a>

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

 

### 函数<function-arn>指的是 Machine <resource-id>Learning 资源，但两者都缺少权限 ResourceAccessPolicy 和资源 OwnerSetting。
<a name="nocontainer-lambda-missing-access-permission"></a>

**解决方案：**如果未为附加的 Lambda 函数或资源配置对机器学习资源的权限，则会收到此错误。要解决此问题，请在 Lambda 函数的[ResourceAccessPolicy](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-resourceaccesspolicy.html)属性或资源的[OwnerSetting](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-ownersetting.html)属性中配置权限。

 

### 函数<function-arn>指的是具有<resource-id>\$1 “rw\$1” 权限的 Machine Learning 资源，而资源所有者设置 GroupPermission 仅允许\$1 “ro\$1”。
<a name="container-lambda-invalid-rw-permissions"></a>

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

 

### NoContainer 函数<function-arn>是指嵌套目标路径的资源。
<a name="nocontainer-lambda-nested-destination-path"></a>

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

 

### Lambda <function-arn> 通过共享同一组所有者 ID 获得对资源 <resource-id> 的访问权限
<a name="lambda-runas-and-resource-owner"></a>

**解决方案：**如果将相同的操作系统组指定为 Lambda 函数的[运行方式](lambda-group-config.md#lambda-access-identity)身份和机器学习资源的[资源所有者](#ml-resource-owner)，但该资源未附加到 Lambda 函数，您会 `runtime.log` 在中收到此错误。此配置为 Lambda 函数提供了隐式权限，无需 AWS IoT Greengrass 授权即可使用这些权限访问资源。

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

## 另请参阅
<a name="access-ml-resources-see-also"></a>
+ [执行机器学习推理](ml-inference.md)
+ [如何使用配置机器学习推理 AWS 管理控制台](ml-console.md)
+ [如何使用配置优化的机器学习推理 AWS 管理控制台](ml-dlc-console.md)
+ [AWS IoT Greengrass Version 1 API 引用](https://docs.aws.amazon.com/greengrass/v1/apireference/api-doc.html)