本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
运行Amazon Lambda函数
注意
Amazon IoT Greengrass目前不支持在 Windows 核心设备上使用此功能。
您可以将Amazon Lambda函数作为在Amazon IoT Greengrass核心设备上运行的组件导入。在以下情况下,您可能需要这样做:
-
您的 Lambda 函数中有要部署到核心设备的应用程序代码。
-
您有想要在Amazon IoT Greengrass V2核心设备上运行的 Amazon IoT Greengrass V1 应用程序。有关更多信息,请参阅 步骤 2:创建和部署 Amazon IoT Greengrass V2 组件以迁移 Amazon IoT Greengrass V1 应用程序。
Lambda 函数包括对以下组件的依赖关系。在导入函数时,您无需将这些组件定义为依赖项。当您部署 Lambda 函数组件时,部署包括这些 Lambda 组件依赖项。
-
Lambda 启动器组件 (
aws.greengrass.LambdaLauncher
) 处理进程和环境配置。 -
Lambda 管理器组件 (
aws.greengrass.LambdaManager
) 处理进程间通信和扩展。 -
Lambda 运行时组件 (
aws.greengrass.LambdaRuntimes
) 为每个支持的 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 容器 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
无容器 |
|
如果您在部署 Lambda 函数时更改其容器化,则该函数可能无法按预期运行。如果 Lambda 函数使用的本地资源在新的容器化设置下不再可用,则部署将失败。
-
当您将 Lambda 函数从在 Greengrass 容器中运行更改为不使用容器化运行时,该函数的内存限制将被丢弃。您必须直接访问文件系统,而不是使用附加的本地资源。在部署 Lambda 函数之前,必须移除所有附加的资源。
-
将 Lambda 函数从在不进行容器化的情况下运行更改为在容器中运行时,Lambda 函数将失去对文件系统的直接访问权限。必须为每个函数定义内存限制或接受默认的 16 MB 内存限制。在部署每个 Lambda 函数时,您可以为其配置这些设置。
要更改 Lambda 函数组件的容器化设置,请在部署该组件时将containerMode
配置参数的值设置为以下选项之一。
-
NoContainer
— 该组件不在隔离的运行时环境中运行。 -
GreengrassContainer
— 该组件在Amazon IoT Greengrass容器内的隔离运行时环境中运行。
有关如何部署和配置组件的更多信息,请参阅将Amazon IoT Greengrass组件部署到设备和更新组件配置。