使用 AWS IoT 来构建全球性的物联网解决方案

阅读数:62 2019 年 9 月 20 日 11:56

使用 AWS IoT 来构建全球性的物联网解决方案

客户使用 AWS IoT 来构建全球性的分布式物联网解决方案。连接到 AWS IoT 的设备必须在某个 AWS 区域预置。但在向全球配送设备时,您不需要知道该设备开始运行时将连接到哪个 AWS IoT 区域。在本博文中,我将介绍一个全球性的 AWS IoT 设备预置流程。

预置 IoT 设备

设备必须预置后才能与 AWS IoT Core 配合使用。要预置的设备必须满足下列条件:

  • 该设备应在注册表中作为事物创建。
  • 其 X.509 证书必须已经注册并且与该事物关联。
  • 该证书必须已经附加了一个 IoT 策略。
    要连接到 AWS IoT,该设备必须知道 AWS IoT 终端节点。

全球设备预置

为了实现自动化的全球设备预置,我使用了一个利用 Amazon API Gateway、AWS Lambda、AWS IoT Core 和 Amazon DynamoDB 构建的架构。该设备将预置请求发送到一个 Amazon API Gateway 终端节点。Amazon API Gateway 调用一个 AWS Lambda 函数,该函数通过某个方法来找到最适合该设备的区域,然后在该区域预置该设备。

您将在 GitHub 上找到此示例实施、文档以及 AWS CloudFormation 模板。所提供的 AWS CloudFormation 模板用于创建示例实施所需的 AWS 资源。有关示例实施设置以及设备预置的信息,请参阅 https://github.com/aws-samples/aws-iot-global-device-provisioning。

在此例中,最佳的区域为地理上最靠近该设备的区域。为确定最近的区域,您必须确定设备的 IP 地址和地理位置,从而计算距离最近 AWS 区域的距离。如果无法查询到地理位置,则将使用默认 AWS 区域。

在我的实施中,我使用 ipstack.com 来查询设备 IP 地址的地理位置。要使用 ipstack.com API,您需要拥有 API 访问密钥。请遵循 https://ipstack.com 上的注册步骤。确定最佳区域的 AWS Lambda 函数会从某个环境变量中获取该 API 访问密钥。

在成功完成预置后,下列资源和信息将会返回到设备:

  • 一个私有密钥(如果设备尚没有私有密钥)。
  • 一个 X.509 证书。
  • AWS IoT 终端节点。
    为确保预置流程的安全,设备必须签署事物名称并将在预置请求将签名发送到 Amazon API Gateway。这种方法与 AWS IoT 中用于自定义授权方的方法类似。每个设备都必须安装有预置用的私有密钥和用于 API Gateway 的 URL。

签名通过验证后,将在一个 DynamoDB 表中执行查询。“未预置”状态意味着该设备可以预置,并且预置流程将会启动。

架构
使用 AWS IoT 来构建全球性的物联网解决方案

预置流程

GitHub 存储库包含了一个程序,该程序可以与设备上的预置解决方案交互。除将该程序安装到设备上外,您还需要一个私有密钥和您的 API Gateway URL。

下面是设备预置的工作流程:

  1. 设备使用私有密钥签署它的事物名称,然后向 Amazon API Gateway 一条预置请求。设备使用自己的私有密钥或使用 AWS IoT Core 发布的私有密钥。如果设备使用自己的私有密钥,它将在预置请求中提供代码签名请求 (CSR)。如果请求中没有“CSR”,则 AWS IoT 会创建私有密钥。
    示例预置请求:
复制代码
{'thing-name': 'mydevice3', 'thing-name-sig': 'R725rxa+vnrMkvsydqS/lbZDDPzBTBXlKI5teO4OX1pKE9jRn/cUailOJczie2zMXUFUtO83sPr+HtRkjJQHDBrA2HDH87G21nMQdJT8K4RGHP6KRfpOhBYT7e162TnKc8DdUBh+Yh4T78dMePuaW4/PPkEbaRf6O7ieBZMITYmeETRDkkDwRD/jAcuEthmBSxRFw1YOzphw36atqS3+J0chc6lnAgCwbZhfPDI98HkLzgVaaXJlJ12ryXtyPA3D1Ptf+mUIci+DbharLsRCiaGsLrnCnoaL4y+vnD2LO0SwS05xhQtFI+0khq3pvGBMtw4HC/+AExI3I1jV3f9EBA=='}
  1. Amazon API Gateway 调用 AWS Lambda 函数
  2. AWS Lambda 函数执行下列步骤:
    a. 验证事物名称的签名。如果验证失败,则 Lambda 函数将返回一条错误消息,然后终止。
    b. 在一个 DynamoDB 表中查询该事物名称,从而确定设备是否是预置候选设备。Lambda 函数会检查设备 (thing_name) 的 prov_status 属性是否设置为未预置。如果已如此设置,则将预置该设备。否则将会返回一条错误消息。还有更先进和更安全的方式来验证设备是否应该预置(例如令牌)。与签署事物名称的方法类似,令牌也可以通过密钥来签署。
    DynamoDB 中的示例条目:
复制代码
{ "thing_name": { "S": "mydevice3" }, "prov_status": { "S": "unprovisioned" } }

c. 计算 IoT 设备的最佳 AWS 区域。此计算会查找设备 IP 地址与某个 AWS 区域之间的最短距离。
d. 预置设备。这意味着将在设备注册表中创建该设备。将会创建一个证书以及(可选)密钥。如果还没有 IoT 策略,则也将创建一个。
e. 使用已经预置的设备的时间和区域更新 DynamoDB 表。
f. 以 JSON 格式返回应答。应答包含 IoT 终端节点、证书以及私有密钥(如果预置请求中没有发送 CSR)。
4. 收到应答后,设备将会存储密钥、证书和终端节点。现在设备已经准备就绪,可以立即与 AWS IoT Core 交互。

小结

AWS IoT Device Management 提供了多种设备预置选项以方便设备的注册。在您使用其他 AWS 服务时,您可以实施解决方案以在您选择的 AWS 区域自动将设备注册到 AWS IoT Core。

请在评论中留下您的反馈。如果您对此解决方案的实施有任何疑问或问题,请在 AWS IoT 论坛中开一条线索。

本文转载自 AWS 博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/provision-devices-globally-with-aws-iot/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布