

终止支持通知：2026 年 10 月 7 日， AWS 将停止对的支持。 AWS IoT Greengrass Version 1 2026 年 10 月 7 日之后，您将无法再访问这些 AWS IoT Greengrass V1 资源。如需了解更多信息，请访问[迁移自 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

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

# 模块 3（第 2 部分）：开启 Lambda 函数 AWS IoT Greengrass
<a name="module3-II"></a>

本模块探讨了在核心上运行的按需函数和长期运行的 Lambda 函数之间的区别。 AWS IoT Greengrass 

在开始之前，请运行 [Greengrass 设备安装](quick-start.md) 脚本或确保您已完成[模块 1](module1.md)、[模块 2](module2.md)、和[模块 3（第 1 部分）](module3-I.md)。

本模块应该需要大约 30 分钟才能完成。

**Topics**
+ [创建和打包 Lambda 函数](package.md)
+ [为以下项配置长期存在的 Lambda 函数 AWS IoT Greengrass](long-lived.md)
+ [测试长时间生存的 Lambda 函数](long-testing.md)
+ [按需测试 Lambda 函数](on-demand.md)

# 创建和打包 Lambda 函数
<a name="package"></a>

在此步骤中，您：
+ 创建包含函数代码和依赖项的 Lambda 函数部署程序包。
+ 使用 Lambda 控制台创建 Lambda 函数和上传部署程序包。
+ 发布 Lambda 函数的版本并创建指向该版本的别名。

 

1. 在你的电脑上，转到你在模块 3-1 中下载并提取的适用于 Python [创建并打包 Lambda 函数](create-lambda.md) 的 AWS IoT Greengrass 核心 SDK。

   本模块中的 Lambda 函数使用：
   + `examples\HelloWorldCounter` 中的 `greengrassHelloWorldCounter.py` 文件。这是您的 Lambda 函数代码。
   + `greengrasssdk` 文件夹。这是软件开发工具包。

1. 创建 Lambda 函数部署程序包：

   1. 将 `greengrasssdk` 文件夹复制到包含 `greengrassHelloWorldCounter.py` 的 `HelloWorldCounter` 文件夹中。

   1. 将 `greengrassHelloWorldCounter.py` 和 `greengrasssdk` 文件夹保存到名为 `hello_world_counter_python_lambda.zip` 的 `zip` 文件。`py` 文件和 `greengrasssdk` 文件夹必须位于该目录的根目录中。  
![\[显示“hello_word_counter_python_lambda.zip”的压缩内容的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-046.png)

      在已安装 `zip` 的类 UNIX 系统（包括 Mac 终端）上，您可以使用以下命令打包文件和文件夹：

      ```
      zip -r hello_world_counter_python_lambda.zip greengrasssdk greengrassHelloWorldCounter.py
      ```

   现在您已准备好创建您的 Lambda 函数和上传部署程序包。

1. 打开 Lambda 控制台，选择**创建函数**。

1. 选择**从头开始创作**。

1. 将您的函数命名为 **Greengrass\$1HelloWorld\$1Counter** 并设置其余字段，如下所示：
   + 对于**运行时系统**，选择 **Python 3.7**。
   + 对于**权限**，请保留默认设置。这将创建一个授予基本 Lambda 权限的执行角色。此角色未被使用 AWS IoT Greengrass。或者，您可以重复使用在模块 3-1 中创建的角色。

   选择 **Create function (创建函数)**。  
![\[“基本信息” 部分，“函数名称” 字段设置为 “Greengrass_ HelloWorld _Counter”，“运行时” 字段设置为 “Python 3.7”。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-023-3.png)

1. 上传您的 Lambda 函数部署软件包。

   1. <a name="lambda-console-upload"></a>在**代码**选项卡上的**代码源**下，选择**上传自**。从下拉列表中选择 **.zip 文件**。  
![\[“上传自”下拉列表中突出显示了.zip 文件。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

   1. 选择**上传**，然后选择您的 `hello_world_counter_python_lambda.zip` 部署包。然后，选择**保存**。

   1. <a name="lambda-console-runtime-settings-para"></a>在函数的**代码**选项卡中，在**运行时设置**下选择**编辑**，然后输入以下值。
      + 对于**运行时系统**，选择 **Python 3.7**。
      + 对于**处理程序**，输入 **greengrassHelloWorldCounter.function\$1handler**。

   1. <a name="lambda-console-save-config"></a>选择**保存**。
**注意**  
 AWS Lambda 主机上的 “**测试**” 按钮不适用于此功能。 AWS IoT Greengrass 核心软件开发工具包不包含在控制台中独立运行 Greengrass Lambda 函数所需的模块。 AWS Lambda 这些模块（例如 `greengrass_common`）是在函数部署到您的 Greengrass 核心之后提供给它们的。

1. 发布函数的第一个版本：

   1. 在页面顶部的**操作**菜单上，选择**发布新版本**。对于**版本描述**，输入 **First version**。

   1. 选择**发布**。

1. 为函数版本创建别名。

   1. 从页面顶部的**操作**菜单中，选择**创建别名**。  
![\[“操作”菜单设置为“创建别名”的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-028.png)

   1. 对于**名称**，输入 **GG\$1HW\$1Counter**。

   1. 对于**版本**，选择 **1**。

   1. 选择**保存**。  
![\[“创建别名”屏幕，其中“名称”字段设置为“GG_HW_Counter”，“版本”字段设置为 1。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-048.png)

   别名可为您的Lambda 函数创建一个单一实体，可供 Greengrass 设备订阅。这样，每次修改函数后，您就不必使用新的 Lambda 函数版本号更新订阅。

# 为以下项配置长期存在的 Lambda 函数 AWS IoT Greengrass
<a name="long-lived"></a>

现在，您已准备好为 AWS IoT Greengrass配置您的 Lambda 函数。

1. <a name="console-gg-groups"></a>**在 AWS IoT 控制台导航窗格的**管理**下，展开 **Greengrass** 设备，然后选择群组 (V1)。**

1. 在 **Greengrass 组**下，选择您在[模块 2](module2.md) 中创建的组。

1. 在组配置页面上，选择 **Lambda 函数**选项卡，然后在**我的 Lambda 函数**下选择**添加**。

1. 对于 **Lambda 函数**，请选择 **Gre HelloWorld** engrass\$1 \$1Counter。

1. 对于 **Lambda 函数版本**，选择您发布的版本的别名。

1. 对于**超时（秒）**，输入 **25**。此 Lambda 函数在每次调用前会休眠 20 秒。

1. 对于**已固定**，选择 **True**。

1. 保留所有其他字段的默认值，然后选择**添加 Lambda 函数**。

# 测试长时间生存的 Lambda 函数
<a name="long-testing"></a>

当核心启动并在单个容器（或沙箱）中运行时 AWS IoT Greengrass ，*[长寿命](lambda-functions.md#lambda-lifecycle)*的 Lambda 函数会自动启动。保留在函数处理程序外部定义的所有变量和预处理逻辑，用于函数处理程序的每次调用。函数处理程序的多次调用将排队，直到执行完前面的调用。

 此模块中使用的 `greengrassHelloWorldCounter.py` 代码定义了函数处理程序外部的 `my_counter` 变量。

**注意**  
你可以在 AWS Lambda 控制台或适用于 [Python 的AWS IoT Greengrass 核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-python/blob/master/examples/HelloWorldCounter/greengrassHelloWorldCounter.py) 中查看代码 GitHub。

在此步骤中，您将创建允许 Lambda 函数和交换 MQTT 消息 AWS IoT 的订阅。然后，部署组并测试函数。

1. 在组配置页面上，选择 **订阅**，然后选择**添加**。

1. 在 “**源类型**” 下，选择 **Lambda 函数**，然后选择 **Gre HelloWorld** engrass\$1 \$1Counter。

1. 在**目标类型**下，选择**服务**，选择 **IoT 云**。

1. 对于 **Topic filter (主题筛选条件)**，输入 **hello/world/counter**。

1. 选择**创建订阅**。

   此单一订阅仅朝一个方向发展：从 `Greengrass_HelloWorld_Counter` Lambda 函数到。 AWS IoT要从云中调用（或触发）此 Lambda 函数，您必须创建反方向的订阅。

1. 按照步骤 1 至 5 添加另一个订阅，它使用以下值。此订阅允许 Lambda 函数从 AWS IoT接收消息。当您从 AWS IoT 控制台发送调用该函数的消息时，您可以使用此订阅。
   + 对于源，选择**服务**，然后选择 **IoT 云**。
   + 对于目标，选择 **Lambda 函数，然后选择 **Gre HelloWorld** en** grass\$1 \$1Counter。
   + 对于主题筛选条件，输入 **hello/world/counter/trigger**。

   本主题筛选条件中使用了 `/trigger` 扩展，因为您创建了两个订阅，不希望它们互相干扰。

1. 确保 Greengrass 进程守护程序正在运行，如 [将云配置部署到核心设备](configs-core.md) 中所述。

1. <a name="console-actions-deploy"></a>在组配置页面上，选择**部署**。

1. <a name="console-test-after-deploy"></a>部署完成后，返回 AWS IoT 控制台主页并选择**测试**。

1. 配置以下字段：
   + 对于 **Subscription topic (订阅主题)**，输入 **hello/world/counter**。
   + 对于**服务质量**，选择 **0**。
   + 对于 **MQTT payload display (MQTT 负载显示)**，选择 **Display payloads as strings (以字符串形式显示负载)**。

1. 选择**订阅**。

   与此模块的[第 1 部分](module3-I.md)不同，在您订阅 `hello/world/counter` 之后，您不应看到任何消息。这是因为发布到 `hello/world/counter` 主题的 `greengrassHelloWorldCounter.py` 代码位于函数处理程序中，该函数处理程序仅在调用函数时才运行。

   在此模块中，您配置了 `Greengrass_HelloWorld_Counter` Lambda 函数，当其收到以 `hello/world/counter/trigger` 为主题的 MQTT 消息时将被调用。

   **Greengrass\$1 \$1Counter t HelloWorld o** Io **T Cloud** 订阅允许该功能向其发送有关该主题的消息。 AWS IoT `hello/world/counter`**物联网云**到 **Greengrass\$1 HelloWorld \$1Counter** 订阅允许 AWS IoT 向该功能发送有关该主题的消息。`hello/world/counter/trigger`

1. 要测试较长的生命周期，请通过向 `hello/world/counter/trigger` 主题发布消息来调用 Lambda 函数。您可以使用默认消息。  
![\[发送到的来自 AWS IoT 控制台的默认 Hello 消息，并hello/world/counter/trigger突出显示了 “发布到主题” 按钮。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-057.png)
**注意**  
 该 `Greengrass_HelloWorld_Counter` 函数会忽略所接收消息的内容。它只运行 `function_handler` 中的代码，该代码会向 `hello/world/counter` 主题发送消息。你可以在上查看适用于 [Python 的AWS IoT Greengrass 核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-python/blob/master/examples/HelloWorldCounter/greengrassHelloWorldCounter.py) 中的这段代码 GitHub。

每次将消息发布到 `hello/world/counter/trigger` 主题时，`my_counter` 变量都会递增。此调用计数显示在从 Lambda 函数发送的消息中。由于函数处理程序包含 20 秒的睡眠周期 (`time.sleep(20)`)，因此反复触发处理程序会使来自 AWS IoT Greengrass 内核的响应排队。

![\[显示“Invocation Count (调用计数)”从 1、2 和最后的 3 递增的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-058.png)


# 按需测试 Lambda 函数
<a name="on-demand"></a>

*[按需](lambda-functions.md#lambda-lifecycle)* Lambda 函数在功能上类似于基于云 AWS Lambda 的函数。按需 Lambda 函数的多次调用可以并行运行。Lambda 函数调用创建单独的容器以处理调用，或者在资源允许时重复使用现有的容器。在创建容器时，不会保留在函数处理程序外部定义的任何变量或预处理。

1. 在组配置页面上，选择**Lambda 函数**选项卡。

1. 在 “**我的 Lambda 函数**” 下，选择 **Greengrass\$1HelloWorld\$1Counter**Lambda 函数。

1. 在存储库的 ** Greengrass\$1HelloWorld\$1Counter**详细信息页面，选择**编辑**。

1. 在**已固定**中，选择 **False**，然后选择**保存**。

1. <a name="console-actions-deploy"></a>在组配置页面上，选择**部署**。

1. <a name="console-test-after-deploy"></a>部署完成后，返回 AWS IoT 控制台主页并选择**测试**。

1. 配置以下字段：
   + 对于 **Subscription topic (订阅主题)**，输入 **hello/world/counter**。
   + 对于**服务质量**，选择 **0**。
   + 对于 **MQTT payload display (MQTT 负载显示)**，选择 **Display payloads as strings (以字符串形式显示负载)**。  
![\[“Subscriptions (订阅)”测试页面的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-056.png)

1. 选择**订阅**。
**注意**  
在您订阅之后，您不应看到任何消息。

1. 要测试按需生命周期，请通过向 `hello/world/counter/trigger` 主题发布消息来调用该函数。您可以使用默认消息。

   1. 快速选择 **发布** 三次，每次都在五秒钟内按下按钮。  
![\[显示必须快速单击三次的“Publish to topic (发布到主题)”按钮的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-063.png)

      每次发布都会调用函数处理程序并为每次调用创建一个容器。在您三次触发该函数时，不会为触发递增调用计数，因为每个按需 Lambda 函数都有自己的容器/沙盒。  
![\[显示“Invocation Count (调用计数)”固定为 1 的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-064.png)

   1. 等待大约 30 秒，然后选择 **Publish to topic (发布到主题)**。调用计数应递增到 2。这说明重复使用了从之前调用创建的容器，并且存储了函数处理程序外部的预处理变量。  
![\[显示“Invocation Count (调用计数)”现在为 2 的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-065.png)

您现在应该了解了可在 AWS IoT Greengrass 核心上运行的两种类型的 Lambda 函数。下一个模块，即[模块 4](module4.md)，向您展示本地物联网设备如何在 AWS IoT Greengrass 群组中进行交互。