运行Amazon Lambda功能 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

运行Amazon Lambda功能

注意

Amazon IoT Greengrass目前在 Windows 核心设备上不支持此功能。

你可以导入Amazon Lambda函数作为运行在上的组件Amazon IoT Greengrass核心设备。您可能需要在以下情况下执行此操作:

Lambda 函数包括对以下组件的依赖关系。在导入函数时,不需要将这些组件定义为依赖项。当您部署 Lambda 函数组件时,部署包括这些 Lambda 组件依赖项。

要求

您的核心设备和 Lambda 函数必须满足以下要求,才能在Amazon IoT Greengrass核心软件:

  • 您的核心设备必须满足运行 Lambda 函数的要求。如果您希望核心设备运行容器化 Lambda 函数,该设备必须满足这样做的要求。有关更多信息,请参阅 Lambda 函数的要求

  • 您必须安装 Lambda 函数在核心设备上使用的编程语言。

    提示

    您可以创建一个安装编程语言的组件,然后将该组件指定为 Lambda 函数组件的依赖项。

  • 您的 Lambda 函数必须使用以下运行时之一:

    • Python 3.9 —python3.9

    • Python 3.8 – python3.8

    • Python 3.7 – python3.7

    • Python 2.7 –python2.7*

    • Java 11 —java11

    • Java 8 – java8

    • Node.js 14 —nodejs14.x

    • Node.js 12 – nodejs12.x

    • Node.js 10 –nodejs10.x*

    * 您可以在上运行使用此运行时的 Lambda 函数Amazon IoT Greengrass但您不能在中创建它们Amazon Lambda. 有关更多信息,请参阅 。运行时支持策略中的Amazon Lambda开发人员指南.

配置 Lambda 函数生命周期

Greengrass Lambda 函数生命周期确定函数何时启动以及它如何创建和使用容器。生命周期还决定了如何Amazon IoT Greengrass核心软件保留在函数处理程序外部的变量和预处理逻辑。

Amazon IoT Greengrass支持按需(默认)和长时间生存的生命周期:

  • 按需函数在调用时启动,并在没有要运行的任务时停止。除非有可重复使用的现有容器,否则,函数的每次调用都会创建一个单独的容器,也称为沙盒,以处理调用。任何容器都可能会处理您发送给函数的数据。

    按需函数的多次调用可以同时运行。

    在创建新容器时,不会保留在函数处理程序外部定义的变量和预处理逻辑。

  • 寿命长(或固定) 函数在Amazon IoT Greengrass核心软件在单个容器中启动和运行。同一容器处理您发送给函数的所有数据。

    将多次调用排入队列,直到Amazon IoT Greengrass核心软件运行早期的调用。

    将为处理程序的每次调用保留在函数处理程序外部定义的变量和预处理逻辑。

    在不进行任何初始输入的情况下开始工作时,请使用长时间生存的 Lambda 函数。例如,长时间生存的函数可以加载并开始处理机器学习模型,以在函数接收设备数据时准备就绪。

    注意

    长时间生存的函数具有与其处理程序的每次调用关联的超时。如果要调用无限期运行的代码,您必须在处理程序外部启动该代码。确保在处理程序外部没有阻止代码来阻止函数初始化。

    除非Amazon IoT Greengrass核心软件停止,例如在部署或重启期间。如果函数遇到未捕获的异常、超出内存限制或进入错误状态(例如处理程序超时),这些函数将不会运行。

有关容器复用的更多信息,请参阅了解中的容器重用Amazon Lambda中的Amazon计算博客.

配置 Lambda 函数容器化

默认情况下,Lambda 函数在Amazon IoT Greengrass容器。Greengrass 容器在功能和主机之间提供隔离。此隔离提高了容器内的主机和函数的安全性。

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

在以下情况下,您可能在不进行容器化的情况下运行 Lambda 函数:

  • 你想跑Amazon IoT Greengrass在不支持容器模式的设备上。一个例子是,如果你想使用特殊的 Linux 发行版,或者拥有已过时的早期内核版本。

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

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

  • 您有一个以前的应用程序是作为进程编写的,在 Greengrass 容器中运行该应用程序时遇到了问题。

容器化差异
容器化 注意

Greengrass 容器

  • 全部Amazon IoT Greengrass在 Greengrass 容器中运行 Lambda 函数时,功能可用。

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

  • 由于Amazon IoT Greengrass核心软件在与 Lambda 函数相同的容器中运行所有子进程,在 Lambda 函数停止时停止。

无容器

  • 以下功能不适用于非容器化的 Lambda 函数:

    • Lambda 函数内存限制。

    • 本地设备和卷资源。您必须使用核心设备上的文件路径访问这些资源,而不是将其作为 Lambda 函数资源进行访问。

  • 如果您的非容器化 Lambda 函数访问机器学习资源,则必须标识资源所有者并设置对资源(而不是 Lambda 函数)的访问权限。

  • 非容器化的 Lambda 函数对在相同系统组中运行的其他 Lambda 函数的部署代码具有只读访问权限。

如果您在部署 Lambda 函数时更改了容器化,则该函数可能无法按预期工作。如果 Lambda 函数使用的本地资源在新容器化设置下不再可用,部署将失败。

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

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

要更改 Lambda 函数组件的容器化设置,请设置containerMode配置参数在部署组件时,将其中一个选项转到以下选项之一。

  • NoContainer— 组件不会在孤立的运行时环境中运行。

  • GreengrassContainer— 组件在Amazon IoT Greengrass容器。

有关如何部署和配置组件的详细信息,请参阅部署Amazon IoT Greengrass组件到设备Update component configurations.