亚马逊AWS官方博客

用 AWS IoT Device Management 进行连续作业 | AWS 上的物联网

Original URL:https://aws.amazon.com/blogs/iot/using-continuous-jobs-with-aws-iot-device-management/

在之前的使用 AWS IoT Device Management 进行在线升级的博文中,我们向您展示了如何创建简单的 AWS IoT 快照作业和跟踪其进度。在此博文中,我们将逐步向您展示如何配置和创建 AWS IoT 连续作业。连续作业是一个长时间运行的作业,它通过自动部署作业执行来响应部署目标的更改。例如,一个连续作业可以被部署为 100 个设备的初始组。当新设备被添加到部署组时,他们将自动收到有关连续作业的通知。

  • 对设备进行恢复出厂设置重置时(假设此时为v1版本),v1 后将设备软件自动更新到最新版本时。
  • 固件版本较旧的设备在仓库中存放几个月后被打开时。连续作业可以将设备固件更新到最新版本时。
  • 可重新使用设备时。连续作业可以删除设备上所有待处理作业执行时。

在接下来的几个章节,我们将创建连续作业 continuous-job-V1-to-V2 用于将设备的固件版本从 V1 更新到 V2。固件版本为 V1 的设备按事物组 FirmwareV1Group 分组,固件版本为 V2 的设备按事物组 FirmwareV2Group 分组。当设备成功更新到固件 V2 时,预配置的 Lambda 函数会将此设备从 FirmwareV1Group 中自动移除,并添加到 FirmwareV2Group 中。当连续作业 continuous-job-V1-to-V2 运行时,已添加到 FirmwareV1Group 中的新设备也将自动获得 V2 固件更新作业。 步骤包括

  1. 创建固件部署组
  2. 添加事物到初始部署组中
  3. 配置并测试 Lambda 函数,以在部署组之间移动设备
  4. 创建连续作业,以将固件从 V1 更新到 V2

配置部署组

首先,我们将创建三个事物组,每个组都具有不同的固件版本(V1、V2、V3)。

$ aws iot create-thing-group --thing-group-name "FirmwareV1Group"
$ aws iot create-thing-group --thing-group-name "FirmwareV2Group"
$ aws iot create-thing-group --thing-group-name "FirmwareV3Group"

在此示例中,使用事物名称 MyRaspberryPi 注册设备。添加 MyRaspberryPi 到事物组 FirmwareV1Group 中。

$ aws iot add-thing-to-thing-group \
--thing-name "MyRaspberryPi" \
--thing-group-name "FirmwareV1Group"

在设备启动的实际场景中,我们建议您运行启动程序来使您的设备上线及初始化其设置。在启动程序中,您可以将设备添加到相应的部署组中。此外,恢复设备出厂设置的程序还应包括将设备添加到相应部署组的步骤。

配置 Lambda 函数

我们将编写 Lambda 函数,当设备从固件版本 V1 成功更新到 V2 时,会触发此函数。此 Lambda 函数将执行以下程序:

  • 将事物从事物组 FirmwareV1Group 中移除。
  • 将事物添加到事物组 FirmwareV2Group 中。

首先,导航至 IAM 控制台,以使用以下策略创建角色 LambdaRoleForV1ToV2FirmwareUpdate。将 AWS_REGION 替换为您的 AWS 区域,并将 <AWS_ACCOUNT_ID> 替换为您的 AWS 账户 ID。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:RemoveThingFromThingGroup"
      ],
      "Resource": "arn:aws:iot:<AWS_REGION>:<AWS_ACCOUNT_ID>:thinggroup/FirmwareV1Group"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:AddThingToThingGroup"
      ],
      "Resource": "arn:aws:iot:<AWS_REGION>:<AWS_ACCOUNT_ID>:thinggroup/FirmwareV2Group"
    }
  ]
}

导航至 AWS Lambda 控制台。在创建函数页面上,选择蓝图。在蓝图下,选择 hello-world,然后选择配置


基本信息下,输入此 Lambda 函数的名称。对于角色,选择您在上一步中创建的角色 (LambdaRoleForV1ToV2FirmwareUpdate),然后选择创建函数


在下一页中,使用以下代码片段更新函数代码,然后选择保存

 

'use strict';

console.log('Loading function');

// 加载 AWS 开发工具包
var AWS = require("aws-sdk");

// 将代码设置为在调用 Lambda 函数时调用
exports.handler = (event, context, callback) => {
    // 将消息记录到控制台中,您可以在“监控”选项卡中查看此文本
    // 在 Lambda 控制台或 CloudWatch Logs 控制台中
    console.log("Received event:", event);
    console.log("Thing Arn is:", event.thingArn);
    
    var iot = new AWS.Iot();
    
    // 从 V1 组中移除事物
    var removeParams = {
        thingGroupName: "FirmwareV1Group",
        thingArn: event.thingArn
    };
    iot.removeThingFromThingGroup(removeParams, function(err, data) {
        if (err) console.log(err, err.stack); // 发生了错误
        else console.log(data);               // 成功响应
    });
    
    // 添加事物到 V2 组中
    var addParams = {
        thingGroupName: "FirmwareV2Group",
        thingArn: event.thingArn
    };
    iot.addThingToThingGroup(addParams, function(err, data) {
        if (err) console.log(err, err.stack); // 发生了错误
        else console.log(data);               // 成功响应
    });

};

要配置此 Lambda 函数的触发器,在设计器下, 选择 AWS IoT。在配置触发器部分中,我们将创建自定义 IoT 规则,以使用作业 ID continuous-job-V1-to-V2 筛选连续作业的已成功作业执行事件。要详细了解作业事件,请参阅 AWS IoT 开发人员指南中的作业事件文档。创建名为“SucceededJobExecutionsForV1toV2Update”的新规则,并为规则查询语句输入以下 SQL 语句:

SELECT * FROM 'aws/events/jobExecution/continuous-job-V1-to-V2/succeeded'

在您配置触发器后,单击添加,然后单击保存

测试 Lambda 函数

要测试 Lambda 函数,在 AWS Lambda 控制台中配置测试事件。从选择测试事件中,选择配置测试事件


将测试事件命名为 SucceededJobExecution,并将测试事件有效负载替换为以下作业执行事件有效负载。将 AWS_REGION 替换为您的 AWS 区域,并将 <AWS_ACCOUNT_ID> 替换为您的 AWS 账户 ID。选择创建以保存更改。

{
  "eventType": "JOB_EXECUTION",
  "eventId": "ba44f124-61fd-40c8-b747-f7f00a50515c",
  "timestamp": 1519870643,
  "operation": "succeeded",
  "jobId": "continuous-job-V1-to-V2",
  "thingArn": "arn:aws:iot:<AWS_REGION>:<AWS_ACCOUNT_ID>:thing/MyRaspberryPi",
  "status": "SUCCEEDED"
}

在您创建测试事件后,系统会将您定向回 AWS Lambda 控制台。选择 SucceededJobExecution 测试事件,然后选择测试。您应该会看到事物 MyRaspberryPiFirmwareV1Group 中移除并在 AWS IoT 控制台中被添加到 FirmwareV2Group 中。有关创建 Lambda 函数及如何使用 CloudWatch 监控和调试 Lambda 函数的信息,请参阅 AWS Lambda 开发人员指南中的创建简单的 Lambda 函数

创建连续作业以更新固件

现在,在事物组 FirmwareV1Group 中创建连续作业 continuous-job-V1-to-V2

$ aws iot create-job \
--job-id "continuous-job-V1-to-V2" \
--targets "arn:aws:iot:<AWS_REGION>:<AWS_ACCOUNT_ID>:thinggroup/FirmwareV1Group" \
--document file://<DIRECTORY_TO_JOB_DOCUMENT>/FirmwareUpdateV1ToV2.json \
--description "Continuous job to update firmware from V1 to V2" \
--target-selection CONTINUOUS

当作业 continuous-job-V1-to-V2 在进行中时,系统将向 FirmwareV1Group 事物组中所包含的所有目标设备通知该作业。每个设备都将执行该作业并报告其作业执行状态。对于每个成功的作业执行,作业服务将发送作业执行事件。作业执行事件将触发 Lambda 函数,以从 FirmwareV1Group 中移除设备,然后将设备添加到 FirmwareV2Group 中。

配置连续部署

我们已逐步介绍如何在部署组 FirmwareV1Group 上创建连续作业,以将设备上的固件版本从 V1 更新到 V2。我们已展示了如何从 FirmwareV1Group 中删除设备并在设备成功执行作业后将其添加到 FirmwareV2Group 中。那么,如何将 V2 设备更新到 V3?

要使设备固件保持最新版本,您可以在 FirmwareV2Group 部署组上创建另一个连续作业 continuous-job-V2-to-V3,并配置一个类似的 Lambda 函数以从 FirmwareV2Group 中移除设备并将其添加到 FirmwareV3Group 中。

连续作业不一定是增量的。无论您的更新模式是增量更新还是直接更新到特定版本,都很容易创建一个连续作业来使您的设备进入所需的状态。例如,假设您有 10 个可用的不同固件版本:V1 — V10。由于一些版本之间的兼容性问题,V1、V2 和 V3 只能直接更新到 V7,而不是 V10。所有其他版本都可以直接更新到 V10。使用连续作业,您可以为 V1、V2 和 V3 部署组轻松设置一个作业并将设备更新到 V7。您可以为 V4 — V9 部署组设置另一个作业并将设备更新到 V10。等到更新的版本 V11 发布时,您可以在 V10 部署组上轻松创建第三个连续作业,并将设备更新到 V11。

小结

有关作业的更多信息,请参阅 AWS IoT 开发人员指南中的作业用 AWS IoT Device Management 进行在线升级博文。

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

作者

Amanda Le