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

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

运行Amazon Lambda函数

注意

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

您可以将Amazon Lambda函数作为在Amazon IoT Greengrass核心设备上运行的组件导入。在以下情况下,您可能需要这样做:

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

要求

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

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

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

    提示

    您可以创建一个安装编程语言的组件,然后将该组件指定为 Lambda 函数组件的依赖项。Greengrass 支持所有 Lambda 支持的 Python、Node.js 和 Java 运行时版本。Greengrass 不对已弃用的 Lambda 运行时版本施加任何额外限制。您可以在上运行使用这些已弃用运行时的 Lambda 函数Amazon IoT Greengrass,但不能在中创建它们。Amazon Lambda有关 Amazon IoT Greengrass 对 Lambda 运行时的支持的更多信息,请参阅运行Amazon Lambda函数

配置 Lambda 函数生命周期

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

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

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

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

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

  • 长寿命(或固定)功能从 Amazon IoT Greengrass Core 软件启动时开始,并在单个容器中运行。同一个容器处理您发送到该函数的所有数据。

    多个调用将排队,直到 C Amazon IoT Greengrass ore 软件运行较早的调用。

    每次调用处理程序时,都会保留您在函数处理程序之外定义的变量和预处理逻辑。

    当您需要在没有任何初始输入的情况下开始工作时,请使用寿命长的 Lambda 函数。例如,长寿命函数可以加载并开始处理机器学习模型,以便在函数接收设备数据时准备就绪。

    注意

    长寿命函数的超时时间与其处理程序的每次调用相关联。如果要调用无限期运行的代码,则必须在处理程序之外启动它。确保处理程序之外没有可能阻止函数初始化的阻塞代码。

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

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

配置 Lambda 函数容器化

默认情况下,Lambda 函数在容器Amazon IoT Greengrass内运行。Greengrass 容器在您的函数和主机之间提供隔离。这种隔离提高了主机和容器中函数的安全性。

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

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

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

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

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

  • 你有一个早期的应用程序是作为进程编写的,当你在 Greengrass 容器中运行它时,你会遇到问题。

容器化差异
容器化 注意事项

Greengrass 容器

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

  • 在 Greengrass 容器中运行的 Lambda 函数无权访问其他 Lambda 函数的已部署代码,即使它们在同一个系统组中运行也是如此。换句话说,您的 Lambda 函数在运行时彼此之间的隔离程度有所提高。

  • 由于 Amazon IoT Greengrass Core 软件在 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组件部署到设备更新组件配置