GTLC全球技术领导力峰会·上海站,首批讲师正式上线! 了解详情
写点什么

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

2019 年 9 月 25 日

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

在之前的使用 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 测试事件,然后选择测试。您应该会看到事物 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 论坛中开一个新话题。


作者介绍:


Amanda Le


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/using-continuous-jobs-with-aws-iot-device-management/


2019 年 9 月 25 日 15:28304
用户头像

发布了 1238 篇内容, 共 31.9 次阅读, 收获喜欢 34 次。

关注

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

评论

发布
暂无评论
发现更多内容

JavaScript中的原型到底该如何理解?

Walker

Java 前端 面向对象编程 原型

架构师训练营第十三周作业

叮叮董董

打破Scrum的五个误区(译)

Bruce Talk

Scrum 敏捷开发 Agile

架构师训练营 week13

devfan

Centos7 IP、名字、防火墙配置

yuanhang

centos7 防火墙 静态IP

面试阿里太难了!二本毕业、两年crud经验,侥幸通过面试定级P6

Java成神之路

Java 编程 程序员 面试

区块链赋能数字经济,为知识和版权确权定价

CECBC区块链专委会

区块链 知识产权 数字经济

架构师课程第十三周总结

dongge

详解 Python 的二元算术运算,为什么说减法只是语法糖?

Python猫

Python 编程 翻译

架构师训练营-第十二周作业

Geek_a327d3

JavaScript 简介

InfoQ_34a83d636158

【架构师训练营】第 13周作业

花生无翼

架构师训练营 week13 - 学习总结

devfan

架构师训练营-第十一周作业

Geek_a327d3

捡到宝啦!阿里内部人手一本的Springboot进阶手册,先学为敬

Java架构师迁哥

为什么说区块链是制造信任的机器?

CECBC区块链专委会

区块链 不可篡改

大数据解答(二)

dony.zhang

数据分析

Linux Shell编程

yuanhang

Shell

每周花6小时跟清华大牛学Java:JVM、高并发多线程、算法、微服务。

Java成神之路

Java 编程 程序员 面试

常用数据分析指标

大数据2学习总结

周冬辉

云栖大会倒计时8天,新一代CDN的技术突破和应用实践专场有什么看点?

阿里云Edge Plus

CDN CDN加速

第十三周作业

Linuxer

你所在的行业,常用的数据分析指标有哪些?

李朋

微信群总是有人发广告?看我用Python写一个自动化机器人消灭他!

刘早起😶

Python

北京或先行落地央行数字货币 人民币3.0时代将来临

CECBC区块链专委会

数字货币 银行 人民币

够开放吗?来,和一群开发者搞事情!

易观大数据

绝了!大厂20个企业级实战项目,靠它成功定级了阿里P7

周老师

Java 编程 程序员 架构 面试

CommonMistakes

卓丁

搜索引擎如何推荐网页

dongge

java快速开发平台功能特点之代码生成器

力软.net/java开发平台

Java 分布式 代码组织 平台应用服务

DNSPod与开源应用专场

DNSPod与开源应用专场

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