使用客户端设备设置 Amazon IoT Greengrass 并对其故障排除 - AWS Prescriptive Guidance

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

使用客户端设备设置 Amazon IoT Greengrass 并对其故障排除

由 Marouane Sefiani 和 Akalanka De Silva (AWS) 编写

环境:PoC 或试点

技术:物联网

Amazon Web Services:Amazon IoT Greengrass;AWS IoT Core

Summary

Amazon IoT Greengrass 是一种开源边缘运行时和云服务,用于在边缘设备上构建、部署和管理物联网 (IoT) 软件。Amazon IoT Greengrass 用例包括:

  • 智能家居,其中 Amazon IoT Greengrass 网关用作家庭自动化中心

  • 智能工厂,Amazon IoT Greengrass 可以促进车间数据的提取和本地处理

Amazon IoT Greengrass 可以充当其他边缘设备(也称为客户端设备)的安全、经过身份验证的 MQTT 连接端点,否则这些设备通常会直接连接到 AWS IoT Core。当客户端设备无法直接通过网络访问 AWS IoT Core 端点时,此功能非常有用。

您可将 Amazon IoT Greengrass 设置为与客户端设备一起使用,用于以下用例:

  • 供客户端设备将数据发送到 Amazon IoT Greengrass

  • 让 Amazon IoT Greengrass 将数据转发至 AWS IoT Core

  • 利用高级 AWS IoT Core 规则引擎功能

这些功能需要在 Amazon IoT Greengrass 设备上安装与配置以下组件:

  • MQTT 代理

  • MQTT 网桥

  • 客户端设备身份验证

  • IP 探测器

此外,来自客户端设备的已发布消息必须采用 JSON 格式或协议缓冲区 (protobuf) 格式。

本示例介绍了如何安装和配置这些必需的组件,并提供了故障排除提示和最佳实践。

先决条件和限制

先决条件

限制

  • 您必须选择一个提供 AWS IoT Core 的 AWS 区域。有关当前的 AWS IoT Core 区域列表,请参阅按区域划分的 Amazon Web Services

  • 核心设备必须至少有 172 MB 内存和 512 MB 磁盘空间。

架构

下图显示此模式的解决方案架构。

使用客户端设备设置 Amazon IoT Greengrass 的解决方案架构

此架构包括:

  • 两个客户端设备 每个设备都包含私钥、设备证书以及根证书颁发机构 (CA) 证书。每个客户端设备上还安装了包含 MQTT 客户端的 AWS IoT 设备开发工具包。

  • 部署了 Amazon IoT Greengrass 的核心设备,包含以下组件:

    • MQTT 代理

    • MQTT 网桥

    • 客户端设备身份验证

    • IP 探测器

该架构支持以下场景:

  • 客户端设备可以使用 MQTT 客户端通过核心设备的 MQTT 代理相互通信。

  • 客户设备还可通过核心设备的 MQTT 代理和 MQTT 桥与云中的 AWS IoT Core 通信。

  • 云端的 AWS IoT Core 可通过 MQTT 测试客户端以及核心设备的 MQTT 网桥器和 MQTT 代理向客户端设备发送消息。

有关客户端设备和核心设备之间通信的更多信息,请参阅其他信息部分。

工具

Amazon Web Services

  • Amazon IoT Greengrass 是一项开源物联网 (IoT) 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用程序。

  • AWS IoT Core 为连接互联网的设备提供安全的双向通信,以连接到 Amazon Web Services Cloud。

  • AWS IoT Device SDK 是一个软件开发工具包,包括开源库、开发人员指南(含示例)和移植指南,便于您在自己选择的硬件平台上构建创新的 IoT 产品或解决方案。

  • AWS Identity and Access Management (AWS IAM) 通过控制验证和授权使用您 AWS 资源的用户,帮助您安全地管理对您 AWS 资源的访问。

最佳实践

  • 来自客户端设备的消息负载应采用 JSON 或 Protobuf 格式,以便利用 AWS IoT Core 规则引擎的高级功能,例如转换和条件操作。

  • 配置 MQTT 巧劲儿以允许双向通信。

  • 在 Amazon IoT Greengrass 中配置和部署 IP 检测器组件,以确保核心设备的 IP 地址包含在 MQTT 代理证书的使用者备用名称 (SAN) 字段中。

操作说明

任务描述所需技能

在您的核心设备设置 Amazon IoT Greengrass。

按照开发人员指南中的说明安装 Amazon IoT Greengrass Core 软件。

Amazon IoT Greengrass

检查安装状态。

使用以下命令检查核心设备上 Amazon IoT Greengrass 服务的状态:

sudo systemctl status greengrass.service

命令预期输出是:

Launched Nucleus successfully
常规 AWS

设置 IAM policy 并将其附加至 Greengrass 服务角色。

  1. 创建 IAM policy,以允许与 MQTT 网桥进行通信。以下为策略示例:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:*" ], "Resource": "*" }, { "Sid": "GreengrassActions", "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": "*" } ] }
  2. 将策略附加到 Greengrass 服务角色。要获取服务角色,请使用以下命令:

    aws greengrassv2 get-service-role-for-account --region <region>

    其中,<region> 指的是您的 AWS 区域。

常规 AWS

在 Amazon IoT Greengrass 核心设备中配置和部署所需组件。

配置与部署以下组件:

Amazon IoT Greengrass

确认 MQTT 桥允许双向通信。

要在客户端设备和 AWS IoT Core 之间中继 MQTT 消息,请配置和部署 MQTT 桥组件并指定要中继的主题。示例如下:

{ "mqttTopicMapping": { "ClientDevicesToCloud": { "topic": "dt/#", "source": "LocalMqtt", "target": "IotCore" }, "CloudToClientDevices": { "topic": "cmd/#", "source": "IotCore", "target": "LocalMqtt" } } }
Amazon IoT Greengrass

确认身份验证组件允许客户端设备连接并发布或订阅主题。

以下 aws.greengrass.clientdevices.Auth 配置允许所有客户端设备连接、发布消息和订阅所有主题。

{ "deviceGroups": { "formatVersion": "2021-03-05", "definitions": { "MyPermissiveDeviceGroup": { "selectionRule": "thingName: *", "policyName": "MyPermissivePolicy" } }, "policies": { "MyPermissivePolicy": { "AllowAll": { "statementDescription": "Allow client devices to perform all actions.", "operations": [ "*" ], "resources": [ "*" ] } } } } }
Amazon IoT Greengrass
任务描述所需技能

安装 AWS IoT Device SDK。

在客户端设备上安装 AWS IoT 设备软件开发工具包。有关支持的语言和相关软件开发工具包的完整列表,请参见 AWS IoT Core 文档

例如,适用于 Python 的 AWS 物联网设备软件开发工具包位于上 GitHub。若要安装此 SDK,请执行以下操作

  1. 按照 GitHub 存储库的 “先决条件” 页面上的说明,确认已安装 Python 3.7 或更高版本。

  2. 使用 pip 命令安装 SDK。

    对于 MacOS 和 Linux:

    python3 -m pip install awsiotsdk

    对于 Windows:

    python -m pip install awsiotsdk

或者,您可从源存储库安装 SDK:

# Create a workspace directory to hold all the SDK files mkdir sdk-workspace cd sdk-workspace # Clone the repository git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git # Install using Pip (use 'python' instead of 'python3' on Windows) python3 -m pip install ./aws-iot-device-sdk-python-v2
常规 AWS IoT

创建事物。

  1. AWS IoT 控制台中,如果显示开始使用按钮,请选择该按钮。否则,请在导航窗格中展开 Secure(安全),然后选择 Policies(策略)。

  2. 如果显示您还没有任何策略对话框,请选择创建策略。否则,选择创建

  3. 输入 AWS IoT 策略的名称(例如,ClientDevicePolicy)。

  4. 添加语句部分中,将现有策略替换为以下 JSON 代码。使用您的 AWS 区域 和 AWS 账号替换 <region><account>

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:region:account:client/*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": "arn:aws:iot:region:account:thing/*" } ] }
  5. 选择创建

  6. AWS IoT 控制台导航窗格中,选择管理事物

  7. 如果显示您还没有任何事物对话框,请选择注册事物。否则,选择创建

  8. 创建 AWS IoT 事物页面上,选择创建单个事物

  9. 将您的设备添加到设备注册表 页面上,输入您的 IoT 事物的名称(例如 ClientDevice1),然后选择下一步

    :您无法在创建事物后更改其名称。要更改名称,您必须创建一个新事物,为其指定新名称,然后删除旧事物。

  10. 添加事物的证书页面上,选择创建证书

  11. 选择下载链接以下载证书、私有密钥和根 CA 证书。

    重要事项:这是您下载证书和私钥的唯一机会。

  12. 选择 Activate(激活)来激活您的证书。证书必须处于活动状态,设备才能连接到 AWS IoT。

  13. 选择附加策略

  14. 在 “为你的事物添加政策” 中 ClientDevicePolicy,选择 “注册事物”。

AWS IoT Core

从 Greengrass 核心设备下载 CA 证书。

如果您希望 Greengrass 核心设备在离线环境中工作,则必须使 Greengrass 核心 CA 证书可供客户端设备使用,以便客户端设备可以验证 MQTT 代理的证书(由 Greengrass 核心 CA 颁发)。因此,获取此证书副本非常重要。通过以下方法之一下载 CA 证书:

  • 如果您可通过网络访问电脑上的 Amazon IoT Greengrass 设备,请在网络浏览器输入 https://<device IP>:8883,查看 MQTT 代理证书和 CA 证书。您也可将 CA 证书保存到客户端设备。

  • 或者,您可使用 OpenSSL 命令行:

    openssl s_client -showcerts -connect <device IP>:8883
常规 AWS

在客户端设备复制凭证。

在客户端设备中复制 Greengrass 核心 CA 证书、设备证书以及私钥。

常规 AWS

将客户端设备与核心设备相关联。

将客户端设备与核心设备关联,以便其可以发现核心设备。然后,客户端设备可以使用 Greengrass 发现 API 来检索其关联核心设备的连接信息和证书。有关更多信息,请参阅 Amazon IoT Greengrass 文档中的关联客户端设备

  1. Amazon IoT Greengrass 控制台,选择核心设备

  2. 选择托管管理的核心设备。

  3. 在核心设备的详细信息页面上,请选择客户端设备选项卡。

  4. 关联客户端设备部分,选择关联客户端设备

  5. 将客户端设备与核心设备关联模式中,对要关联的每台客户端设备执行以下操作:

    1. 输入 AWS IoT 事物名称,以将其关联为客户端设备。

    2. 选择添加

  6. 选择关联

您关联的客户端设备现在可使用 Greengrass 发现 API 来发现此核心设备。

Amazon IoT Greengrass
任务描述所需技能

将数据从一个客户端设备发送到另一客户端设备。

使用设备中的 MQTT 客户端发布有关 dt/client1/sensor 主题的消息。

常规 AWS

将数据从客户端设备发送至 AWS IoT Core。

使用设备中的 MQTT 客户端发布有关 dt/client1/sensor 主题的消息。

在 MQTT 测试客户端中,订阅设备正在发送消息的主题,或订阅 # 以获取所有主题(查看详细信息)。

常规 AWS

将数据从 AWS IoT Core 发送至客户端设备。

在 MQTT 测试客户端页面上,在发布到主题选项卡上的主题名称字段中,输入您消息的主题名称。在此示例中,使用 cmd/client1 作为主题。

常规 AWS

故障排除

问题解决方案

无法验证服务器证书错误

当 MQTT 客户端无法验证 MQTT 代理在 TLS 握手期间提供的证书时,会出现此错误。最常见的原因是 MQTT 客户端缺失 CA 证书。请按照以下步骤确保将 CA 证书提供给 MQTT 客户端。

  1. 如果您可通过网络访问电脑上的 Amazon IoT Greengrass 设备,请在浏览器窗口中输入 https://<device IP>:8883 以查看 MQTT 代理证书和 CA 证书。您也可将 CA 证书保存到客户端设备。

    或使用 OpenSSL 命令行:

    openssl s_client -showcerts -connect <device IP>:8883
  2. 将 Moquette CA 和 Greengrass Core CA 证书内容保存到文件中,然后使用以下命令查看解码后的内容:

    openssl x509 -in <Name of CA>.pem -text

    Moquette CA 证书应显示 SAN 字段,如下所示:

    X509v3 Subject Alternative Name: IP Address:XXX.XXX.XXX.XXX, IP Address:127.0.0.1, DNS:localhost

无法验证服务器名称错误

当 MQTT 客户端无法验证是否连接到正确的服务器时,就会发生此错误。最常见的原因是 Greengrass 设备的 IP 地址未在证书的 SAN 字段中列出。

按照前一解决方案中的说明获取 MQTT 代理证书,并验证 SAN 字段是否包含 Amazon IoT Greengrass 设备的 IP 地址,如其他信息部分所述。如果没有,请确认 IP 检测器组件安装得当,然后重新启动核心设备。

仅在从嵌入式客户端设备连接时,无法验证服务器名称

Mbed TLS 是嵌入式设备中使用的流行 TLS 库,目前仅在证书的 SAN 字段中支持 DNS 名称验证,如 Mbed TLS 库代码所示。由于核心设备没有自己的域名并且依赖于 IP 地址,因此使用 Mbed TLS 的 TLS 客户端将在 TLS 握手期间无法通过服务器名称验证,从而导致连接失败。我们建议您通过 x509_crt_check_san 函数将 SAN IP 地址验证添加至 mbed TLS 库中。

相关资源

其他信息

本节提供有关客户端设备和核心设备之间通信的附加信息。

MQTT 代理在核心设备中的端口 8883 上侦听 TLS 客户端连接尝试。下图显示了 MQTT 代理的服务器证书示例。

MQTT 代理服务器证书示例

示例证书显示以下详细信息:

  • 该证书由 Amazon IoT Greengrass Core CA 颁发,该证书是本地的且特定于核心设备,也就是说,它充当本地 CA。

  • 该证书由客户端身份验证组件每周自动轮换,如下图所示。您可在客户端身份验证组件配置中设置此间隔。

轮换 MQTT 代理服务器证书
  • 主题备用名称 (SAN) 在 TLS 客户端服务器名称验证中起着至关重要的作用。它可以帮助 TLS 客户端确保它连接到正确的服务器,并有助于避免在 TLS 会话设置期间 man-in-the-middle 受到攻击。在示例证书中,SAN 字段表示此服务器正在本地主机 (本地 Unix 域套接字) 上侦听,并且网络接口的 IP 地址为 192.168.1.12。

TLS 客户端在服务器验证期间使用证书中的 SAN 字段来验证它是否正在连接到合法服务器。相比之下,在 HTTP 服务器和浏览器之间的典型 TLS 握手期间,通用名称 (CN) 字段或 SAN 字段中的域名用于在服务器验证过程中交叉检查浏览器实际连接到的域 。如果核心设备没有域名,SAN 字段中包含的 IP 地址也有同样的作用。有关更多信息,请参阅 RFC 5280 — Internet X.509 公钥基础设施证书和证书吊销列表 (CRL) 配置文件的主题备用名称部分

Amazon IoT Greengrass 中的 IP 检测器组件可确保证书 SAN 字段中包含正确的 IP 地址。

示例中的证书由充当本地 CA 的 Amazon IoT Greengrass 设备进行签名。TLS 客户端(MQTT 客户端)不知道此 CA,因此我们必须提供如下所示的 CA 证书。

CA 证书示例