亚马逊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 固件更新作业。 步骤包括
- 创建固件部署组
- 添加事物到初始部署组中
- 配置并测试 Lambda 函数,以在部署组之间移动设备
- 创建连续作业,以将固件从 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 测试事件,然后选择测试。您应该会看到事物 MyRaspberryPi 从 FirmwareV1Group 中移除并在 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 论坛中开一个新话题。