亚马逊AWS官方博客

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

Original URL :https://aws.amazon.com/cn/blogs/iot/provision-devices-globally-with-aws-iot/

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

预置 IoT 设备

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

  • 该设备应在注册表中作为事物创建。
  • 其 X.509 证书必须已经注册并且与该事物关联。
  • 该证书必须已经附加了一个 IoT 策略。

要连接到 AWS IoT,该设备必须知道 AWS IoT 终端节点。

全球设备预置

为了实现自动化的全球设备预置,我使用了一个利用 Amazon API GatewayAWS 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 表中执行查询。“未预置”状态意味着该设备可以预置,并且预置流程将会启动。

架构

预置流程

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=='}

  2. Amazon API Gateway 调用 AWS Lambda 函数
  3. AWS Lambda 函数执行下列步骤:
    1. 验证事物名称的签名。如果验证失败,则 Lambda 函数将返回一条错误消息,然后终止。
    2. 在一个 DynamoDB 表中查询该事物名称,从而确定设备是否是预置候选设备。Lambda 函数会检查设备 (thing_name) 的 prov_status 属性是否设置为未预置。如果已如此设置,则将预置该设备。否则将会返回一条错误消息。还有更先进和更安全的方式来验证设备是否应该预置(例如令牌)。与签署事物名称的方法类似,令牌也可以通过密钥来签署。
      DynamoDB 中的示例条目:

      { "thing_name": { "S": "mydevice3" }, "prov_status": { "S": "unprovisioned" } }

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

小结

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

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