AWS IoT Greengrass
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用组特定配置控制 Greengrass Lambda 函数的执行

AWS IoT Greengrass 提供了基于云的 Greengrass Lambda 函数管理。您可以配置 Lambda 函数在某一特定组中运行时的行为的详细信息。尽管函数的代码和依赖项是使用 AWS Lambda 管理的,但 AWS IoT Greengrass 支持以下组特定的配置设置:

Run as (运行方式)

用于运行每个 Lambda 函数的访问身份。默认情况下,Lambda 函数以该组的默认访问身份运行。通常情况下,这是标准 AWS IoT Greengrass 系统账户(ggc_user 和 ggc_group)。您可以更改设置,并选择具有运行 Lambda 函数所需权限的用户 ID 和组 ID。您可以覆盖 UID 和 GID 或只覆盖一个(如果将另一个字段留空)。通过此设置可以更精细地控制设备资源访问。建议使用适当的资源限制、文件权限和磁盘配额为使用其权限运行 Lambda 函数的用户和组配置 Greengrass 硬件。

此功能适用于 AWS IoT Greengrass Core v1.7 及更高版本。

重要

除非绝对有必要,否则建议避免以根用户身份运行。以根用户身份运行 Lambda 函数时,会增加意外更改的风险,如意外删除关键文件。此外,以根用户身份运行还会增加数据和设备受到个人恶意攻击的风险。如果需要以根用户身份运行,必须更新 AWS IoT Greengrass 配置以启用它。有关更多信息,请参阅 以根用户身份运行 Lambda 函数

UID (number) (UID (数字))

具有运行 Lambda 函数所需权限的用户的用户 ID。仅当选择 Run as another user ID/group ID (以另一个用户 ID/组 ID 身份运行) 时,此设置才可用。通过对 AWS IoT Greengrass 设备使用 getent passwd 命令,可以查找要用来运行 Lambda 函数的用户 ID。

GID (number) (GID (数字))

具有运行 Lambda 函数所需权限的组的组 ID。仅当选择 Run as another user ID/group ID (以另一个用户 ID/组 ID 身份运行) 时,此设置才可用。通过对 AWS IoT Greengrass 设备使用 getent group 命令,可以查找要用来运行 Lambda 函数的组 ID。

Containerization (容器化)

选择 Lambda 函数是否对组使用默认容器化运行,或者指定应始终对此 Lambda 函数使用的容器化。要在不启用设备内核命名空间和组的情况下运行,所有 Lambda 函数都必须在不进行容器化的情况下运行。通过为组设置默认容器化可以轻松完成此操作。请参阅 在组中设置 Lambda 函数的默认容器化

此功能适用于 AWS IoT Greengrass Core v1.7 及更高版本。

注意

建议在 Greengrass 容器中运行 Lambda 函数,除非您的使用案例要求它们在不进行容器化的情况下运行。在 Greengrass 容器中运行时,可以使用附加资源,还可以获得隔离和安全性提高的优势。在更改容器化之前,请参阅选择 Lambda 函数容器化时的注意事项

内存限制

为函数分配的内存。默认值为 16 MB。

注意

在不进行容器化的情况下运行 Lambda 函数时,此设置不可用。在不进行容器化的情况下运行的 Lambda 函数没有内存限制。将 Lambda 函数更改为在不进行容器化的情况下运行时,将丢弃内存限制设置。

超时

在终止函数或请求之前经过的时间。默认值为 3 秒。

生命周期

Lambda 函数生命周期可以是按需长时间生存。默认为“按需”。

在调用时,将在新的或重复使用的容器中启动按需 Lambda 函数。函数请求可以由任何可用的容器进行处理。长时间生存的或固定的 Lambda 函数会在 AWS IoT Greengrass 启动后自动启动,并在自己的容器(或沙盒)中保持运行。函数的所有请求是由相同的容器处理的。有关更多信息,请参阅 Greengrass Lambda 函数的生命周期配置

对 /sys 目录的只读访问权限

函数是否可以访问主机的 /sys 文件夹。当函数必须从 /sys 中读取设备信息时,请使用此设置。默认为 false。

注意

在不进行容器化的情况下运行 Lambda 函数时,此设置不可用。将 Lambda 函数更改为在不进行容器化的情况下运行时,将丢弃此设置的值。

输入负载数据类型

函数输入负载的预期编码类型:JSON 或二进制。默认值为 JSON。

从 AWS IoT Greengrass 核心软件 v1.5.0 和 AWS IoT Greengrass 核心开发工具包 v1.1.0 开始,将提供二进制编码类型支持。对于与设备数据交互的函数,接受二进制输入数据可能是非常有用的,因为设备的受限硬件功能通常导致很难或无法构造 JSON 数据类型。

注意

Lambda 可执行文件 仅支持二进制编码类型(而不是 JSON)。

环境变量

可动态将设置传递到函数代码和库的键值对。本地环境变量的工作方式与 AWS Lambda 函数环境变量相同,但可以在核心环境中使用。

资源访问策略

Lambda 函数允许访问的具有最多 10 个本地资源密钥资源机器学习资源的列表,还有相应的 read-onlyread-write 权限。在控制台中,将在函数的资源页上列出这些关联的 资源。

注意

仅当 Lambda 函数在 Greengrass 容器中运行时,资源访问策略才适用。在不进行容器化的情况下运行 Lambda 函数时,可以直接访问本地资源。在不进行容器化的情况下运行时,可以访问密钥资源。

以根用户身份运行 Lambda 函数

此功能适用于 AWS IoT Greengrass Core v1.7 及更高版本。

必须先更新 AWS IoT Greengrass 配置以启用支持,然后才能以根用户身份运行一个或多个 Lambda 函数。默认情况下,不支持以根用户身份运行 Lambda 函数。如果尝试部署 Lambda 函数并以根用户身份运行它(UID 和 GID 为 0),并且没有更新 AWS IoT Greengrass 配置,部署将失败。运行时日志 (greengrass_root/ggc/var/log/system/runtime.log) 中会显示类似下面的错误:

lambda(s) [list of function arns] are configured to run as root while Greengrass is not configured to run lambdas with root permissions

重要

除非绝对有必要,否则建议避免以根用户身份运行。以根用户身份运行 Lambda 函数时,会增加意外更改的风险,如意外删除关键文件。此外,以根用户身份运行还会增加数据和设备受到个人恶意攻击的风险。

允许 Lambda 函数以根用户身份运行

  1. 在 AWS IoT Greengrass 设备上,导航到 greengrass-root/config 文件夹。

    注意

    默认情况下,greengrass-root 是 /greengrass 目录。

  2. 更新 config.json 文件以向 runtime 字段添加 "allowFunctionsToRunAsRoot" : "yes"。例如:

    { "coreThing" : { ... }, "runtime" : { ... "allowFunctionsToRunAsRoot" : "yes" }, ... }
  3. 使用以下命令重启 AWS IoT Greengrass:

    cd /greengrass/ggc/core sudo ./greengrassd restart

    现在,可以将 Lambda 函数的用户 ID 和组 ID (UID/GID) 设置为 0,从而以根用户身份运行 Lambda 函数。

如果要禁止以根用户身份运行 Lambda 函数,可以将 "allowFunctionsToRunAsRoot" 的值更改为 "no" 并重启 AWS IoT Greengrass。

选择 Lambda 函数容器化时的注意事项

此功能适用于 AWS IoT Greengrass Core v1.7 及更高版本。

默认情况下,Lambda 函数在 AWS IoT Greengrass 容器内运行。容器在函数和主机之间提供隔离,从而为主机和容器内的函数提供更高的安全性。

建议在 Greengrass 容器中运行 Lambda 函数,除非您的使用案例要求它们在不进行容器化的情况下运行。通过在 Greengrass 容器内运行 Lambda 函数,可以更好地控制资源访问限制。

下面是在不进行容器化的情况下运行的一些示例使用案例:

  • 您需要在无法更改底层内核的设备上运行 AWS IoT Greengrass。这可能是因为公司安全策略,也可能是因为操作系统的版本不允许。

  • 您需要在另一个有自己的 OverlayFS 的容器环境中运行 Lambda 函数,但在 Greengrass 容器中运行时遇到了 OverlayFS 冲突。

  • 您需要访问的本地资源的路径在部署时无法确定,或者其路径在部署后可能更改,如可插拔设备。

  • 您有一个编写为进程的旧应用程序,在作为容器化的 Lambda 函数运行它时遇到了问题。

容器化差异

容器化 备注

AWS IoT Greengrass 容器

  • 在 Greengrass 容器中运行 Lambda 函数时,所有 AWS IoT Greengrass 功能均可用。

  • 即使以相同的组 ID 运行,在 Greengrass 容器中运行的 Lambda 函数也无权访问其他 Lambda 函数的部署代码。也就是说,Lambda 函数之间以更强的隔离运行。

  • 由于在 AWS IoT Greengrass 容器中运行的 Lambda 函数的所有子进程都在与 Lambda 函数相同的容器中运行,当 Lambda 函数终止时,子进程也会终止。

无容器

  • 在不进行容器化的情况下运行 Lambda 函数时,并非所有 AWS IoT Greengrass 功能都可用。您必须直接访问文件系统,而不是使用附加的本地资源本地设备和卷资源。目前,在不进行容器化的情况下,不支持机器学习 (ML) 模型资源

  • Lambda 函数对使用相同组 ID 运行的其他 Lambda 函数的部署代码具有只读访问权限。

  • 在父 Lambda 函数终止时,在不同进程会话中生成子进程或使用重写的 SIGHUP(信号挂断)处理程序(例如使用 nohup 实用程序)的 Lambda 函数不会自动被 AWS IoT Greengrass 终止。

  • 当 Greengrass 组的默认 Lambda 函数容器化设置为 No container (无容器) 时,不支持连接器、本地设备和卷资源以及 ML 模型资源。使用这些功能需要运行 AWS IoT Greengrass 并进行容器化。

更改 Lambda 函数的容器化会在部署时导致问题。如果为 Lambda 函数分配的本地资源在新容器化设置下不再可用,部署将失败。

  • 将 Lambda 函数从在 Greengrass 容器中运行更改为在不进行容器化的情况下运行时,将丢弃该函数的内存限制。您必须直接访问文件系统,而不是使用附加的本地资源。必须在部署前删除所有附加的资源。

  • 将 Lambda 函数从在不进行容器化的情况下运行更改为在容器中运行时,Lambda 函数将失去对文件系统的直接访问权限。您必须为每个函数定义内存限制或接受默认设置 (16MB)。您必须在部署前为每个 Lambda 函数配置这些设置。

更改 Lambda 函数的容器化设置

  1. 在 AWS IoT 控制台中,选择 Greengrass,然后选择 Groups (组)

  2. 选择包含要更改设置的 Lambda 函数的组。

  3. 选择 Lambda

  4. 在要更改的 Lambda 函数上,选择省略号 (),然后选择编辑配置

  5. 更改容器化设置。如果要将 Lambda 函数配置为在 Greengrass 容器中运行,还必须设置内存限制对 /sys 目录的只读访问权限属性。

  6. 选择更新以保存对 Lambda 函数的更改。

这些更改将在部署组时生效。

您还可以使用 AWS IoT Greengrass API 参考 中的 CreateFunctionDefinitionCreateFunctionDefinitionVersion。更改容器化设置时还请务必更新其他参数。例如,从在 Greengrass 容器中运行 Lambda 函数更改为在不进行容器化的情况下运行时,请务必清除 MemorySize 参数。

确定 Greengrass 设备支持的隔离模式

可以使用 AWS IoT Greengrass 依赖项检查程序确定 Greengrass 设备支持哪些隔离模式(Greengrass 容器/无容器)。

运行 AWS IoT Greengrass 依赖项检查程序

  1. GitHub 存储库下载并运行 AWS IoT Greengrass 依赖项检查程序。

    wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.9.0.zip unzip greengrass-dependency-checker-GGCv1.9.0.zip cd greengrass-dependency-checker-GGCv1.9.0 sudo modprobe configs sudo ./check_ggc_dependencies | more
  2. more 出现处,按 Spacebar 键以显示另一页文本。

要获得有关 modprobe 命令的信息,请在终端中运行 man modprobe

为组中的 Lambda 函数设置默认访问身份

此功能适用于 AWS IoT Greengrass Core v1.8 及更高版本。

要更多地控制对设备资源的访问权限,您可以配置用于运行组中的 Lambda 函数的默认访问身份。此设置确定了在核心设备上运行 Lambda 函数时提供给这些函数的默认权限。要覆盖组中各个函数的设置,您可以使用该函数的 Run as (运行身份) 属性。有关更多信息,请参阅运行身份

此组级别设置也用于运行底层 AWS IoT Greengrass 核心软件。这由负责管理操作(如消息路由、本地阴子同步和自动 IP 检测)的系统 Lambda 函数组成。

默认访问身份可配置为以标准 AWS IoT Greengrass 系统账户身份(ggc_user 和 ggc_group)运行,或者使用另一个用户或组的权限。建议使用适当的资源限制、文件权限和磁盘配额,为使用其权限运行用户定义的或系统 Lambda 函数的任何用户和组配置 Greengrass 硬件。

修改 AWS IoT Greengrass 组的默认访问身份

  1. 在 AWS IoT 控制台中,选择 Greengrass,然后选择 Groups (组)

  2. 选择要更改其设置的组。

  3. 选择 Settings

  4. Lambda runtime environment (Lambda 运行时环境) 下,对于 Default Lambda function user ID/ group ID (默认 Lambda 函数用户 ID/组 ID),选择 Another user ID/group ID (其他用户 ID/组 ID)

    当您选择此选项时,UID (number) (UID (数字))GID (number) (GID (数字)) 字段会显示。

  5. 输入用户 ID 和/或组 ID。如果将字段留空,将使用相应的 Greengrass 系统账户(ggc_user 或 ggc_group)。

    • 对于 UID (number) (UID (数字)),输入某个用户的用户 ID,该用户具有您在默认情况下要用来运行组中 Lambda 函数的权限。您可以在您的 AWS IoT Greengrass 设备上使用 getent passwd 命令查找用户 ID。

    • 对于 GID (number) (GID (数字)),输入某个组的组 ID,该组具有您在默认情况下要用来运行组中 Lambda 函数的权限。您可以在您的 AWS IoT Greengrass 设备上使用 getent group 命令查找组 ID。

    重要

    以根用户身份运行会给您的数据和设备增加风险。请勿以根用户身份 (UID/GID=0) 运行,除非您的业务案例需要这样。有关更多信息,请参阅以根用户身份运行 Lambda 函数

这些更改将在部署组时生效。

在组中设置 Lambda 函数的默认容器化

此功能适用于 AWS IoT Greengrass Core v1.7 及更高版本。

您可以修改组设置以指定 Lambda 函数在组中的默认容器化。如果需要 Lambda 函数以不同于组默认设置的容器化方式运行,可以覆盖组中一个或多个 Lambda 函数的此设置。在更改容器化设置之前,请参阅选择 Lambda 函数容器化时的注意事项

重要

如果要更改组的默认容器化设置,但有一个或多个函数使用不同的容器化,请先更改这些 Lambda 函数的设置,然后再更改组设置。如果先更改组容器化设置,将丢弃内存限制对 /sys 目录的只读访问权限设置的值。

修改 AWS IoT Greengrass 组的容器化设置

  1. 在 AWS IoT 控制台中,选择 Greengrass,然后选择 Groups (组)

  2. 选择要更改其设置的组。

  3. 选择 Settings

  4. Lambda runtime environment (Lambda 运行时环境) 下,更改容器化设置。

这些更改将在部署组时生效。