

终止支持通知：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（第 1 部分）：开启 Lambda 函数 AWS IoT Greengrass
<a name="module3-I"></a>

本模块向您展示如何创建和部署从核心设备发送 MQTT 消息的 Lambda 函数。 AWS IoT Greengrass 本模块介绍了 Lambda 函数配置、用于允许 MQTT 消息传递的订阅和对核心设备的部署。

[模块 3（第 2 部分）](module3-II.md)涵盖了在核心上 AWS IoT Greengrass 运行的按需函数和长寿命 Lambda 函数之间的区别。

在开始之前，请确保您已经完成了[模块 1](module1.md) 和[模块 2](module2.md)，并且有正在运行的 AWS IoT Greengrass 核心设备。

**提示**  
或者，要使用为您设置核心设备的脚本，请参阅[快速入门：Greengrass 设备安装程序](quick-start.md)。该脚本还可以创建和部署此模块中使用的 Lambda 函数。

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

**Topics**
+ [创建并打包 Lambda 函数](create-lambda.md)
+ [将 Lambda 函数配置为 AWS IoT Greengrass](config-lambda.md)
+ [将云配置部署到 Greengrass 核心设备](configs-core.md)
+ [验证 Lambda 函数是否在核心设备上运行](lambda-check.md)

# 创建并打包 Lambda 函数
<a name="create-lambda"></a>

此模块中的 Python Lambda 函数示例使用适用于 Python 的 [AWS IoT Greengrass 核心开发工具包](lambda-functions.md#lambda-sdks-core)发布 MQTT 消息。

在此步骤中，您：
+ 将适用于 Python 的 AWS IoT Greengrass 核心 SDK 下载到你的电脑（不是 AWS IoT Greengrass 核心设备）。
+ 创建包含函数代码和依赖项的 Lambda 函数部署程序包。
+ 使用 Lambda 控制台创建 Lambda 函数和上传部署程序包。
+ 发布 Lambda 函数的版本并创建指向该版本的别名。

要完成本模块，必须在核心设备上安装 Python 3.7。

 <a name="create-lambda-procedure"></a>

1. <a name="download-ggc-sdk"></a> 从[AWS IoT Greengrass 核心软件开发工具包](what-is-gg.md#gg-core-sdk-download)下载页面，将适用于 Python 的 AWS IoT Greengrass 酷睿 SDK 下载到你的电脑上。

1. 解压缩下载的程序包以获取 Lambda 函数代码和软件开发工具包。

   本模块中的 Lambda 函数使用：
   + `examples\HelloWorld` 中的 `greengrassHelloWorld.py` 文件。这是您的 Lambda 函数代码。该函数每 5 秒将两条可能的消息之一发布到 `hello/world` 主题一次。
   + `greengrasssdk` 文件夹。这是软件开发工具包。

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

1. 要创建 Lambda 函数部署程序包，请将 `greengrassHelloWorld.py` 文件和 `greengrasssdk` 文件夹保存到名为 `hello_world_python_lambda.zip` 的压缩 `zip` 文件。`py` 文件和 `greengrasssdk` 文件夹必须位于该目录的根目录中。  
![\[显示 hello_word_python_lambda.zip 的压缩内容的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-017.png)

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

   ```
   zip -r hello_world_python_lambda.zip greengrasssdk greengrassHelloWorld.py
   ```
**注意**  
根据您的发行版，可能需要先安装 `zip`（例如，通过运行 `sudo apt-get install zip`）。您的发行版的安装命令可能不同。

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

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

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

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

   选择 **Create function (创建函数)**。

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_python_lambda.zip` 部署包。然后，选择**保存**。

   1. <a name="lambda-console-runtime-settings-para"></a>在函数的**代码**选项卡中，在**运行时设置**下选择**编辑**，然后输入以下值。
      + 对于**运行时系统**，选择 **Python 3.7**。
      + 对于**处理程序**，输入 **greengrassHelloWorld.function\$1handler**。  
![\[“运行时设置” 部分，“运行时” 字段设置为 “Python 3.7”，“Handler” 字段设置为 “greengrassHelloWorld.function_handler”。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-023-2.png)

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

1. <a name="publish-function-version"></a>发布 Lambda 函数：

   1. 在页面顶部的**操作**菜单上，选择**发布新版本**。  
![\[突出显示了“Publish new version (发布新版本)”的“Actions (操作)”菜单的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-026.png)

   1. 对于**版本描述**，输入 **First version**，然后选择**发布**。  
![\[“Version description (版本描述)”字段设置为“First version (第一个版本)”并且突出显示了“Publish (发布)”按钮的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-027.png)

1. <a name="create-version-alias"></a>为 Lambda 函数[版本](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)创建[别名](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html)：
**注意**  
Greengrass 组可以按别名（推荐）或版本引用 Lambda 函数。使用别名，您可以更轻松地管理代码更新，因为您在更新函数代码时，不必更改订阅表或组定义。相反，您只需将别名指向新的函数版本。

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

   1. 将别名命名为 **GG\$1HelloWorld**，将版本设置为 **1**（对应于您刚刚发布的版本），然后选择**保存**。
**注意**  
AWS IoT Greengrass **不支持 \$1LATEST 版本的 Lambda 别名。**

         
![\[“创建新别名” 的屏幕截图，“名称” 字段设置为 GG_HelloWorld，“版本” 字段设置为 1。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-029.png)

# 将 Lambda 函数配置为 AWS IoT Greengrass
<a name="config-lambda"></a>

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

在此步骤中，您：
+ 使用 AWS IoT 控制台将 Lambda 函数添加到您的 Greengrass 群组。
+ 为 Lambda 函数配置特定于组的设置。
+ 向该组添加订阅，允许 Lambda 函数向 AWS IoT发布 MQTT 消息。
+ 配置该组的本地日志设置。

 

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

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

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

1. 选择您在上一步中创建的 Lambda 函数的名称（**Greengrass\$1 HelloWorld**，而不是别名）。

1. 对于版本，请选择**别名：GG\$1 HelloWorld**。

1. 在 **Lambda 函数配置**部分中，进行以下更改：
   + 将**系统用户和组**设置为**使用组默认值**。
   + 将 **Lambda 函数容器化**设置为 **使用组默认值**。
   + 将**超时**设置为 25 秒。此 Lambda 函数在每次调用前会休眠 5 秒。
   + 对于**已固定**，选择 **True**。

    
**注意**  
<a name="long-lived-lambda"></a>*长寿命*（或*固定*）的 Lambda 函数在启动后 AWS IoT Greengrass 自动启动，并继续在自己的容器中运行。这与*按需* Lambda 函数相反，后者在调用时启动，并在没有要运行的任务时停止。有关更多信息，请参阅 [Greengrass Lambda 函数的生命周期配置](lambda-functions.md#lambda-lifecycle)。

1. 选择 **添加 Lambda 函数**以保存您的更改。有关 Lambda 函数属性的信息，请参阅 [使用组特定的配置控制 Greengrass Lambda 函数的执行](lambda-group-config.md)。

   接下来，创建一个允许 Lambda 函数 向 AWS IoT Core发送 [MQTT](http://mqtt.org/) 消息的订阅。

   Greengrass Lambda 函数可以与以下对象交换 MQTT 消息：
   + Greengrass 组中的[设备](what-is-gg.md#greengrass-devices)。
   + 组中的[连接器](connectors.md)。
   + 组中的其他 Lambda 函数。
   + AWS IoT Core.
   + 本地影子服务。有关更多信息，请参阅 [模块 5：与设备影子交互](module5.md)。

   该组使用订阅来控制这些实体可以如何互相通信。订阅提供可预测的交互和一层安全性。

   订阅由源、目标和主题组成。源是消息的发起方，目标是消息的目的地。主题允许您筛选从源发送到目标的数据。源或目标可以是 Greengrass 设备、Lambda 函数、连接器、设备影子或 AWS IoT Core。
**注意**  
订阅是定向的，也就是消息流为特定方向：从源流到目标。要允许双向通信，您必须设置两个订阅。
**注意**  
 目前，订阅主题筛选器不允许在一个主题中使用多个 `+` 字符。主题筛选器只允许在主题的结尾有一个 `#` 字符。

   `Greengrass_HelloWorld`Lambda 函数仅向中的`hello/world`主题发送消息 AWS IoT Core，因此您只需从 Lambda 函数创建一个订阅即可。 AWS IoT Core您可以在下一步中创建此订阅。

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

   有关演示如何使用创建订阅的示例 AWS CLI，请参阅《*AWS CLI 命令参考*》[create-subscription-definition](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/greengrass/create-subscription-definition.html)中的。

1. **在**源类型**中，选择 **Lambda 函数**，对于**源**，选择 Greengrass\$1。HelloWorld**

1. 对于**目标类型**，选择**服务**，对于**目标**，选择 **IoT 云**。

1. 对于**主题筛选条件**字段中，输入 **hello/world**，然后选择**订阅**。

1. 配置组的日志记录设置。在本教程中，您将配置 AWS IoT Greengrass 系统组件和用户定义的 Lambda 函数，以将日志写入核心设备的文件系统。

   1. 在组配置页面上，选择**日志**选项卡。

   1. 在**本地日志配置**部分，选择 **编辑**。

   1. 在**编辑本地日志配置**对话框中，保留日志级别和存储大小的默认值，然后选择**保存**。

   您可以使用日志解决运行本教程时可能遇到的任何问题。在排查问题时，您可以暂时将日志记录级别更改为**调试**。有关更多信息，请参阅 [访问文件系统日志](greengrass-logs-overview.md#gg-logs-local)。

1. <a name="disable-stream-manager-no-java"></a>如果核心设备上未安装 Java 8 运行时，您必须安装它或禁用流管理器。
**注意**  
此教程不使用流管理器，但它将使用默认情况下启用流管理器的 **Default Group creation (默认组创建)** 工作流。如果已启用流管理器，但未安装 Java 8，则组部署将失败。有关更多信息，请参阅[流管理器要求](stream-manager.md#stream-manager-requirements)。

   要禁用流管理器，请执行以下操作：

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

   1. 在**系统 Lambda 函数**部分下，选择**流管理器**，然后选择**编辑**。

   1. 选择**禁用**，然后选择**保存**。

# 将云配置部署到 Greengrass 核心设备
<a name="configs-core"></a>

1. 确保您的 Greengrass 核心设备已连接到 Internet。例如，尝试成功导航到网页。

1. 确保 Greengrass 守护进程正在您的核心设备上运行。在您的核心设备终端中运行以下命令来检查进程守护程序是否正在运行并启动它（如果需要）。

   1. 要检查进程守护程序是否正在运行，请执行以下操作：

      ```
      ps aux | grep -E 'greengrass.*daemon'
      ```

      如果输出包含 `root` 的 `/greengrass/ggc/packages/1.11.6/bin/daemon` 条目，则表示进程守护程序正在运行。

   1. 启动进程守护程序：

      ```
      cd /greengrass/ggc/core/
      sudo ./greengrassd start
      ```

   现在您已准备好将 Lambda 函数和订阅配置部署到您的 Greengrass 核心设备。

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

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

1. 在组配置页面上，选择**部署**。

1. 在 **Lambda 函数**选项卡的**系统 Lambda 函数**部分中，选择 **IP 检测器**。

1. 选择**编辑**，然后选择**自动检测和覆盖 MQTT 代理端点**。这使得设备可以自动获取核心的连接信息，例如 IP 地址、DNS 和端口号。建议使用自动检测，不过 AWS IoT Greengrass 也支持手动指定的端点。只有在首次部署组时，系统才会提示您选择发现方法。

第一次部署可能需要几分钟。当部署完成后，您应该在**部署**页面上的**状态**列中看到**已成功完成**：

**注意**  
部署状态也显示在页面标题上的组名称下方。

有关问题排查帮助，请参阅[故障排除 AWS IoT Greengrass](gg-troubleshooting.md)。

# 验证 Lambda 函数是否在核心设备上运行
<a name="lambda-check"></a>

1. 在 [AWS IoT 控制台](https://console.aws.amazon.com/iot/)导航窗格中的**测试**下方，选择 **MQTT 测试客户端**。

1. 选择 **订阅主题**选项卡。

1. 在**主题筛选器**中输入 **hello/world**，然后展开**其他配置**。

1. 输入在以下字段中列出的信息：
   + 对于**服务质量**，选择 **0**。
   + 对于 **MQTT payload display (MQTT 负载显示)**，选择 **Display payloads as strings (以字符串形式显示负载)**。

    

1. 选择**订阅**。

假定 Lambda 函数正在设备上运行，它将向 `hello/world` 主题发布消息，如下所示：

![\[发送到 hello/world 主题的消息的屏幕截图，其中突出显示了消息。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-045.png)


尽管 Lambda 函数会继续向`hello/world`主题发送 MQTT 消息，但不要停止守护程序。 AWS IoT Greengrass 其余模块是在假定它正在运行的情况下编写的。

您可以从组中删除函数和订阅：
+ 在组配置页面的 **Lambda 函数**选项卡下，选择要移除的 Lambda 函数，然后选择**移除**。
+ 在组配置页面中的**订阅**选项卡下，选择订阅，然后选择**删除**。

在下一个组部署期间，将会从核心中删除函数和订阅。