

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

# 运行 AWS Lambda 函数
<a name="run-lambda-functions"></a>

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

您可以将 AWS Lambda 函数作为在 AWS IoT Greengrass 核心设备上运行的组件导入。在以下情况下，您可能需要执行此操作：
+ Lambda 函数中有要部署到核心设备的应用程序代码。
+ 您有想要在 AWS IoT Greengrass V2 核心设备上运行的 AWS IoT Greengrass V1 应用程序。有关更多信息，请参阅[步骤 2：创建和部署 AWS IoT Greengrass V2 组件以迁移 AWS IoT Greengrass V1 应用程序](set-up-v2-test-device.md#run-v1-applications)。

Lambda 函数包括以下组件的依赖关系。在导入函数时，您不需要将这些组件定义为依赖关系。当您部署 Lambda 函数组件时，部署包括这些 Lambda 组件依赖关系。
+ [Lambda 启动程序组件](lambda-launcher-component.md) (`aws.greengrass.LambdaLauncher`) 处理进程和环境配置。
+ [Lambda 管理器组件](lambda-manager-component.md) (`aws.greengrass.LambdaManager`) 处理进程间通信和扩展。
+ [Lambda 运行时组件](lambda-runtimes-component.md) (`aws.greengrass.LambdaRuntimes`) 为每个受支持的 Lambda 运行时提供构件。

**Topics**
+ [要求](#run-lambda-functions-requirements)
+ [配置 Lambda 函数生命周期](#lambda-lifecycle)
+ [配置 Lambda 函数容器化](#lambda-containerization)
+ [将 Lambda 函数作为组件导入（控制台）](import-lambda-function-console.md)
+ [将 Lambda 函数作为组件导入（AWS CLI）](import-lambda-function-cli.md)

## 要求
<a name="run-lambda-functions-requirements"></a>

您的核心设备和 Lambda 函数必须满足以下要求才能在 AWS IoT Greengrass Core 软件上运行这些函数：
+ <a name="core-device-lambda-function-requirements"></a>您的核心设备必须满足运行 Lambda 函数的要求。如果您希望核心设备运行容器化 Lambda 函数，则设备必须满足相关要求。有关更多信息，请参阅[Lambda 函数要求](setting-up.md#greengrass-v2-lambda-requirements)。
+ 您必须在核心设备上安装 Lambda 函数使用的编程语言。
**提示**  
您可以创建一个安装编程语言的组件，然后将该组件指定为 Lambda 函数组件的依赖关系。Greengrass 支持所有 Lambda 支持的 Python、Node.js 和 Java 运行时版本。Greengrass 不对已弃用的 Lambda 运行时版本施加任何额外限制。您可以在 AWS IoT Greengrass 上运行使用这些已弃用的运行时的 Lambda 函数，但无法在 AWS Lambda 中创建它们。有关 AWS IoT Greengrass 对 Lambda 运行时的支持的更多信息，请参阅[运行 AWS Lambda 函数](#run-lambda-functions)。

## 配置 Lambda 函数生命周期
<a name="lambda-lifecycle"></a>

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

AWS IoT Greengrass 支持按需（默认）和长时间生存的生命周期：
+ **按需**函数在调用时启动，并在没有要执行的任务时停止。每次调用该函数都会创建一个单独的容器（也称为沙盒）来处理调用，除非现有的容器可供重复使用。任何容器都可以处理您发送到该函数的数据。

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

  在创建新容器时，系统不会保留您在函数处理程序之外定义的变量和预处理逻辑。
+ **长时间生存的**（或*固定的*）函数在 AWS IoT Greengrass Core 软件启动时启动，并在单个容器中运行。您发送到该函数的所有数据都由同一个容器处理。

  多个调用将排入队列，直到 AWS IoT Greengrass Core 软件运行较早的调用。

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

  如果您需要在没有任何初始输入的情况下开始工作，请使用长时间生存的 Lambda 函数。例如，在长时间生存的函数接收设备数据时，该函数可以加载并开始处理机器学习模型以使其准备就绪。
**注意**  
长时间生存的函数具有与其处理程序的每次调用关联的超时。如果要调用无限期运行的代码，您必须在处理程序外部启动该代码。确保处理程序之外没有可能阻止函数初始化的阻止代码。  
除非 AWS IoT Greengrass Core 软件停止运行（例如在部署或重启期间），否则这些函数将运行。如果函数遇到未捕获的异常、超出其内存限制或进入错误状态（例如处理程序超时），则这些函数将不会运行。

有关容器重复使用的更多信息，请参阅 *AWS 计算博客*中的 [Understanding Container Reuse in AWS Lambda](https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/)。

## 配置 Lambda 函数容器化
<a name="lambda-containerization"></a>

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

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

在以下情况下，您可能会在不进行容器化的情况下运行 Lambda 函数：
+ 您想在不支持容器模式的设备上运行 AWS IoT Greengrass。例如，如果您想使用特殊的 Linux 发行版，或者使用过时的早期内核版本。
+ 您需要在另一个有自己的 OverlayFS 的容器环境中运行 Lambda 函数，但在 Greengrass 容器中运行时遇到了 OverlayFS 冲突。
+ 您需要访问的本地资源的路径在部署时无法确定，或者其路径在部署后可能更改。此资源的示例是可插拔设备。
+ 您有一个编写为进程的早期应用程序，在 Greengrass 容器中运行该应用程序时会遇到问题。


**容器化差异**  

| 容器化 | 备注 | 
| --- | --- | 
|  Greengrass 容器  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/greengrass/v2/developerguide/run-lambda-functions.html)  | 
|  无容器  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/greengrass/v2/developerguide/run-lambda-functions.html)  | 

如果您在部署 Lambda 函数时更改其容器化，则函数可能无法按预期运行。如果 Lambda 函数使用的本地资源在新的容器化设置中不再可用，则部署失败。
+ 如果将 Lambda 函数从在 Greengrass 容器中运行更改为在不进行容器化的情况下运行，系统将丢弃该函数的内存限制。您必须直接访问文件系统，而不是使用附加的本地资源。必须先移除所有附加的资源，然后才能部署 Lambda 函数。
+ 将 Lambda 函数从在不进行容器化的情况下运行更改为在容器中运行时，Lambda 函数将失去对文件系统的直接访问权限。您必须为每个函数定义内存限制或接受默认的 16 MB 内存限制。您可以在部署每个 Lambda 函数时为其配置这些设置。

要更改 Lambda 函数组件的容器化设置，请在部署该组件时将 `containerMode` 配置参数的值设置为以下选项之一。<a name="lambda-function-component-container-mode-parameter"></a>
+ `NoContainer` – 该组件不在隔离的运行时环境中运行。
+ `GreengrassContainer` – 该组件在 AWS IoT Greengrass 容器内的隔离运行时环境中运行。

有关如何部署和配置组件的更多信息，请参阅[将 AWS IoT Greengrass 组件部署到设备](manage-deployments.md)和[更新组件配置](update-component-configurations.md)。