

终止支持通知：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)。

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

# 模块 6：访问其他 AWS 服务
<a name="module6"></a>

此高级模块向您展示了 AWS IoT Greengrass 内核如何与云中的其他 AWS 服务进行交互。它在[模块 5](module5.md) 中的交通信号灯示例基础上构建，并添加一个 Lambda 函数来处理影子状态并将摘要上传到 Amazon DynamoDB 表。

![\[AWS IoT 连接到 AWS IoT Greengrass 内核，该核心连接到灯光开关设备和红绿灯设备影子。交通信号灯设备影子连接到 Lambda 函数，后者连接到 DynamoDB 表。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-089.5.png)


在开始之前，请运行 [Greengrass 设备安装程序](quick-start.md)脚本，或确保您已完成[模块 1](module1.md) 和[模块 2](module2.md)。您还应该完成[模块 5](module5.md)。您无需其他组件或设备。

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

**注意**  
本模块将在 DynamoDB 中创建并更新表。尽管大多数操作比较小并且在 Amazon Web Services Free Tier 内执行，但执行本模块中的某些步骤可能会在您的账户中产生费用。有关定价的信息，请参阅 [DynamoDB 定价文档](https://aws.amazon.com/dynamodb/pricing/)。

**Topics**
+ [配置组角色](config-iam-roles.md)
+ [创建并配置 Lambda 函数](create-config-lambda.md)
+ [配置订阅](config_subs.md)
+ [测试通信](comms-test.md)

# 配置组角色
<a name="config-iam-roles"></a>

组角色是您创建并附加到 Greengrass 组的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。此角色包含已部署的 Lambda 函数（和其他 AWS IoT Greengrass 功能）用于访问服务的权限 AWS 。有关更多信息，请参阅 [Greengrass 组角色](group-role.md)。

您可以使用以下高级步骤在 IAM 控制台中创建组角色。

1. 创建允许或拒绝对一个或多个资源执行操作的策略。

1. 创建使用 Greengrass 服务作为受信任实体的角色。

1. 将策略附加到角色。

然后，在 AWS IoT 控制台中，您将角色添加到 Greengrass 群组。

**注意**  
一个 Greengrass 组有一个组角色。如果要添加权限，可以编辑附加的策略或附加更多策略。

 

对于此教程，您将创建权限策略，该策略允许对 Amazon DynamoDB 表执行描述、创建和更新操作。然后，您可以将该策略附加到新角色并将该角色与您的 Greengrass 组关联。

首先，创建一个客户托管策略，该策略授予这个模块中的 Lambda 函数要求的权限。

1. 在 IAM 控制台的导航窗格中，选择 **Policies**，然后选择 **Create policy**。

1. 在 **JSON** 选项卡中，将占位符内容替换为以下策略。此模块中的 Lambda 函数使用这些权限来创建和更新名为 `CarStats` 的 DynamoDB 表。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "PermissionsForModule6",
               "Effect": "Allow",
               "Action": [
                   "dynamodb:DescribeTable",
                   "dynamodb:CreateTable",
                   "dynamodb:PutItem"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/CarStats"
           }
       ]
   }
   ```

------

1. 依次选择 **Next: Tags**（下一步：标签）和 **Next: Review**（下一步：查看）。本教程中未使用标签。

1. 对于 **Name (名称)**，输入 **greengrass\$1CarStats\$1Table**，然后选择 **Create policy (创建策略)**。

    

   接下来，创建一个使用新策略的角色。

1. 在导航窗格中，选择**角色**，然后选择**创建角色**。

1. 在**可信实体类型**下，选择 **AWS 服务**。

1. 在**用例**、**其他 AWS 服务的用例**下面，选择 **Greengrass**，选择 **Greengrass**，然后选择**下一步**。

1. 在**权限策略**下，选择新的 **greengrass\$1CarStats\$1Table** 策略，然后选择**下一步**。

1. 对于**角色名称**，输入 **Greengrass\$1Group\$1Role**。

1. 对于**描述**，输入 **Greengrass group role for connectors and user-defined Lambda functions**。

1. 选择**创建角色**。

   现在，将该角色添加到 Greengrass 组。

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

1. 在 **Greengrass 组**下，选择您的组。

1. 选择 **设置**，然后选择 **关联角色**。

1. 从您的角色列表中选择 **Greengrass\$1Group\$1Role**，然后选择**关联角色**。

# 创建并配置 Lambda 函数
<a name="create-config-lambda"></a>

在本步骤中，您将创建一个 Lambda 函数，该函数将跟踪通过交通信号灯的汽车的数量。每当 `GG_TrafficLight` 影子状态更改为 `G` 时，Lambda 函数都将模拟通过的随机数量的汽车（从 1 到 20）。每当 `G` 灯第三次改变，Lambda 函数都会将基本统计数据（如最小值和最大值）发送到 DynamoDB 表。

1. 在您的计算机上，创建一个名为 `car_aggregator` 的文件夹。

1. 从[TrafficLight ](https://github.com/aws/aws-greengrass-core-sdk-python/tree/master/examples/TrafficLight)示例文件夹中 GitHub，将`carAggregator.py`文件下载到该文件`car_aggregator`夹。这是您的 Lambda 函数代码。
**注意**  
为方便起见，此示例 Python 文件存储在 AWS IoT Greengrass 核心 SDK 存储库中，但它不使用 AWS IoT Greengrass 核心 SDK。

1. 如果您不在美国东部（弗吉尼亚北部）地区工作，请打开以下行`carAggregator.py`并将其更改`region_name`为 AWS IoT 主机中当前选择的区域。 AWS 区域 有关支持的列表 AWS 区域，请参阅[AWS IoT Greengrass](https://docs.aws.amazon.com/general/latest/gr/greengrass.html)中的*Amazon Web Services 一般参考*。

   ```
   dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
   ```

1. 在[命令行](https://en.wikipedia.org/wiki/Command-line_interface)窗口中运行以下命令，以将 [适用于 Python (Boto3) 的 AWS SDK](https://github.com/boto/boto3/blob/develop/README.rst) 软件包及其依赖项安装到 `car_aggregator` 文件夹中。Greengrass Lambda 函数使用软件开发工具包来访问其他服务。 AWS AWS （对于 Windows，请使用[提升的命令提示符](https://technet.microsoft.com/en-us/library/cc947813(v=ws.10).aspx)。）

   ```
   pip install boto3 -t path-to-car_aggregator-folder
   ```

   这会显示类似于下面的目录列表：  
![\[显示 carAggregator.py 的目录列表的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-095.png)

1. 将 `car_aggregator``.zip` 文件夹的内容压缩到一个名为 `car_aggregator.zip` 的文件中。（压缩文件夹的内容，而不是文件夹。） 此即 Lambda 函数部署程序包。

1. 在 Lambda 控制台中，创建一个名为 **GG\$1Car\$1Aggregator** 的函数，然后按下面所示设置其余字段：
   + 对于**运行时系统**，选择 **Python 3.7**。
   + 对于**权限**，请保留默认设置。这将创建一个授予基本 Lambda 权限的执行角色。此角色未被使用 AWS IoT Greengrass。

   选择**创建函数**。  
![\[“Basic information (基本信息)”部分中，“Function name (函数名称)”设置为“GG_Car_Aggregator”，“Runtime (运行时)”设置为“Python 3.7”。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-095.5.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. 选择上传，然后选择您的 `car_aggregator.zip` 部署包。然后，选择**保存**。

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

   1. 选择**保存**。

1. 发布 Lambda 函数，然后创建一个名为 **GG\$1CarAggregator** 的别名。有关 step-by-step说明，请参阅在模块 3（第 1 部分）中[发布 Lambda 函数](create-lambda.md#publish-function-version)和[创建别名的](create-lambda.md#create-version-alias)步骤。

1. 在 AWS IoT 控制台中，将您刚刚创建的 Lambda 函数添加到您的 AWS IoT Greengrass 群组中：

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

   1. 对于 **Lambda 函数**，请选择 **gg\$1car\$1Aggregator**。

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

   1. 对于**内存限制**，输入 **64 MB**。

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

   1. 选择**添加 Lambda 函数**。
**注意**  
您可以删除先前模块中的其他 Lambda 函数。

# 配置订阅
<a name="config_subs"></a>

在此步骤中，您将创建一个订阅，允许 GG\$1 TrafficLight 影子向 gg\$1car\$1Aggregator Lambda 函数发送更新的状态信息。此订阅会添加到您在[模块 5](module5.md) 中创建的订阅中，这些订阅在此模块中都是必需的。

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

1. 在**创建事件订阅**页中，执行以下操作：

   1. 对于**源类型**，选择**服务**，然后选择**本地影子服务**。

   1. 对于**目标类型**，选择 **Lambda 函数**，然后选择 **GG\$1Car\$1Aggregator**.

   1. 对于 **Topic filter (主题筛选条件)**，输入 **\$1aws/things/GG\$1TrafficLight/shadow/update/documents**。

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

   此模块需要新订阅和您在模块 5 中创建的[订阅](config-dev-subs.md#module5-subscriptions)。

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

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

# 测试通信
<a name="comms-test"></a>

1. 在您的计算机上，打开两个[命令行](https://en.wikipedia.org/wiki/Command-line_interface)窗口。就像在[模块 5](module5.md) 中一样，一个窗口用于 GG\$1Switch 客户端设备，另一个窗口用于 GG\$1 TrafficLight 客户端设备。您可以使用它们运行在模块 5 中运行的相同命令。

   为 GG\$1Switch 客户端设备运行以下命令：

   ```
   cd path-to-certs-folder
   python lightController.py --endpoint AWS_IOT_ENDPOINT --rootCA AmazonRootCA1.pem --cert switchCertId-certificate.pem.crt --key switchCertId-private.pem.key --thingName GG_TrafficLight --clientId GG_Switch
   ```

   对 GG\$1 TrafficLight 客户端设备运行以下命令：

   ```
   cd path-to-certs-folder
   python trafficLight.py --endpoint AWS_IOT_ENDPOINT --rootCA AmazonRootCA1.pem --cert lightCertId-certificate.pem.crt --key lightCertId-private.pem.key --thingName GG_TrafficLight --clientId GG_TrafficLight
   ```

   每隔 20 秒，开关会将影子状态更新为 G、Y 和 R，并且灯会显示新状态。

1. 在每次第 3 个绿灯时（每 3 分钟），都会触发 Lambda 函数的函数处理程序，并会创建新的 DynamoDB 记录。运行三分钟后 `lightController.py``trafficLight.py`，转到 DynamoDB 控制台 AWS 管理控制台，然后打开 DynamoDB 控制台。

1. 在 AWS 区域 菜单中选择**美国东部（弗吉尼亚北部）**。这是 `GG_Car_Aggregator` 函数在其中创建表的区域。

1. 在导航窗格中，选择**表**，然后选择**CarStats**表。

1. 选择**查看项目**，以查看表中的条目。

   您应该看到包含有关通过的汽车数的基本统计数据的条目 (每隔 3 分钟创建一个条目)。您可能需要选择刷新按钮来查看表的更新。

1. 如果测试不成功，您可以在 Greengrass 日志中查找故障排除信息。

   1. <a name="root-access-logs"></a>切换到根用户并导航到 `log` 目录。访问 AWS IoT Greengrass 日志需要 root 权限。

      ```
      sudo su
      cd /greengrass/ggc/var/log
      ```

   1. 检查 `runtime.log` 有无错误。

      ```
      cat system/runtime.log | grep 'ERROR'
      ```

   1. 检查 Lambda 函数生成的日志。

      ```
      cat user/region/account-id/GG_Car_Aggregator.log
      ```

      <a name="check-connection-info"></a> `lightController.py` 和 `trafficLight.py` 脚本将连接信息存储在 `groupCA` 文件夹中，该文件夹与脚本在同一文件夹中创建。如果您收到连接错误，请确保 `ggc-host` 文件中的 IP 地址与您在此步骤中为核心配置的单个 IP 地址端点匹配。

   有关更多信息，请参阅 [故障排除 AWS IoT Greengrass](gg-troubleshooting.md)。

本基础教程到此结束。现在，您应该了解 AWS IoT Greengrass 编程模型及其基本概念，包括 AWS IoT Greengrass 内核、组、订阅、客户端设备以及在边缘运行的 Lambda 函数的部署过程。

您可以删除 DynamoDB 表以及 Greengrass Lambda 函数和订阅。要停止 AWS IoT Greengrass 核心设备与 AWS IoT 云端之间的通信，请在核心设备上打开终端并运行以下命令之一：
+ 要关闭 AWS IoT Greengrass 核心设备，请执行以下操作：

  ```
  sudo halt
  ```
+ 要停止 AWS IoT Greengrass 守护程序，请执行以下操作：

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