运行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 函数使用的编程语言。

    提示

    您可以创建安装编程语言的组件,然后将该组件指定为 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 Core 软件启动并在单个容器中运行时启动。同一个容器处理您发送给函数的所有数据。

    多次调用会排队,直到 CAmazon 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核心软件与 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组件部署到设备更新组件配置