使用 AWS IoT 设备管理自动化应用程序部署
关键要点
在物联网 (IoT) 行业中,设备生产商需要及时发布新特性、进行系统更新和部署安全补丁,以保持竞争力。我们介绍了一种持续集成和交付 (CI/CD) 流水线,旨在自动化 IoT 设备的应用程序部署,简化管理任务并缩短应用程序发布周期。
引言
物联网行业越来越多地采用符合最新标准、接口和协议的设备。为了保持竞争力,设备制造商必须及时发布新功能、执行系统更新和部署安全补丁。软件应用程序早已通过自动化的 持续集成和交付 (CI/CD) 流水线来管理这些更新。然而,由于 IoT 设备的远程位置、不稳定的连接、网络带宽和规模等原因,自动化部署面临诸多挑战。
在本博文中,我们将介绍一种 CI/CD 流水线,用于持续集成和部署应用程序到 IoT 设备。该流水线自动化应用程序部署,并减少 IoT 应用程序的发布时间。此流水线还可被 IoT 设备运营者用于大规模管理任务,例如固件更新、命令执行和安全补丁部署。
架构概述
该架构使用 AWS IoT Core 处理 IoT 设备的连接和身份验证。CI/CD 流水线使用 AWS CodePipeline 进行设置。流水线从 AWS CodeCommit 仓库中获取源代码,并使用 AWS CodeBuild 进行构建和部署步骤。然后,使用 AWS IoT Device Management 的 AWS IoT Jobs 功能来管理应用程序部署。Jobs 功能允许执行连接到 AWS IoT Core 的一个或多个设备的远程操作。AWS IoT 设备管理负责调度、重试和报告远程操作的状态。IoT 设备需负责订阅来自 AWS IoT 的 作业通知。
图 10 IoT 设备的 CI/CD 流水线
前提条件
在本地计算机上安装 AWS CLI,按照 安装说明 操作。在本地计算机上设置 git 和 gitremotecodecommit 工具。创建一个启用了版本控制的 Amazon Simple Storage Service (Amazon S3) 工件桶,用于存储 CI/CD 工件。一台连接到 AWS IoT Core 的 IoT 设备作为 thing。在这篇文章中,我们将使用一台虚拟 IoT 设备,在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上安装 AWS IoT 设备客户端软件。可以参考 AWS IoT 入门工作坊 获取详细的虚拟 IoT 设备设置指导。操作步骤
在此操作过程中,我们将设置一个 CI/CD 流水线,以创建 IoT 作业,并将应用程序部署到 IoT 设备。该应用程序是一个简单的 bash 脚本,在执行时会在 IoT 设备上创建一个包含当前时间戳的文件,例如 202305041048log。
创建 AWS CodeCommit 仓库 (AWS 控制台)
创建一个代码仓库,例如 IoTApplicationRepo,以存储应用程序源代码详细说明请参见 创建 AWS CodeCommit 仓库。使用以下命令将仓库拉取到本地计算机:git clone codecommit//IoTApplicationRepo IoTApplicationRepo创建 CI/CD 流水线 (AWS 控制台)
使用 AWS CodePipeline 创建一个包含三阶段源、构建和部署的 CI/CD 流水线。
步骤 1:创建并命名流水线转到 CodePipeline 控制台,选择 创建流水线。图 11 创建流水线
在 步骤 1 中,输入 流水线名称。在 高级设置 下选择 自定义位置,并选定工件存储的 Amazon S3 桶参见前提条件。魔方加速器app下载图 12 选择 AWS 管理密钥
点击 下一步。步骤 2:创建源阶段在 步骤 2:添加源阶段 中,选择 AWS CodeCommit 作为 源提供商。在 仓库名称 中选择之前创建的 AWS CodeCommit 仓库,例如 IoTApplicationRepo。在 分支名称 中输入 master。点击 下一步。步骤 3:创建构建阶段在 步骤 3:添加构建阶段 中,从 构建提供商 选择 AWS CodeBuild,然后选择 创建项目。这将打开一个新窗口。图 13 构建阶段
在 创建构建项目 下,输入 项目名称。在 环境 的 操作系统 中选择 Amazon Linux 2。对于 运行时,选择 标准,在 镜像 中选择 aws/codebuild/amazonlinux2x8664standard40 (或选择最新的 Amazon Linux 2 镜像)。在 附加配置 中,在 环境变量 下创建变量 ‘bucket ’,在值中输入工件桶名称。在 Buildspec 文件名称 可选 中,输入 buildyaml。然后选择 继续到 CodePipeline。点击 下一步。AWS CodeBuild 将自动创建一个名为 codebuildlt项目名称gtservicerole 的 IAM 服务角色。该角色需要额外的权限才能将构建工件上传到工件桶。
转到 IAM 控制台的角色中心,并选择该角色。点击 添加权限,选择 创建内联策略。图 14 创建内联策略
在 创建策略 中,选择 JSON,并用以下策略替换内容,将 yourS3bucket 替换为工件桶名称。json{ Version 20121017 Statement [ { Effect Allow Action [ s3GetObject s3PutObject ] Resource arnawss3yourS3bucket/ } ]}
点击 审核策略。在 创建策略 中输入 名称,然后选择 创建策略。返回到 创建新流水线 页面。步骤 4:跳过部署阶段在 步骤 4:添加部署阶段 中,选择 跳过部署阶段。我们将在步骤 8 中使用 AWS CodeBuild 将应用程序部署到 IoT 设备。图 15 跳过部署阶段
步骤 5:审核流水线在 步骤 5:审核 页面,查看流水线配置,然后选择 创建流水线 创建流水线。CI/CD 流水线将自动开始执行,选择 停止执行 gt 停止,以停止流水线。因为流水线尚未完成。步骤 6:创建预签名的 Amazon 身份与访问管理 (IAM) 角色CI/CD 流水线将把应用程序文件上传到工件的 Amazon S3 桶。由于 Amazon S3 桶中的对象是私有的,因此 AWS IoT 将自动生成 预签名 URL,这将授予 IoT 设备有限时间内下载应用程序文件的权限有关详情,请参见 AWS IoT 设备管理 文档。
为了生成预签名 URL,AWS IoT 需要一个具有权限从工件桶下载对象的 IAM 角色。
转到 IAM 控制台的角色中心,选择 创建角色。在 选择受信任的实体 中,在 其他 AWS 服务的用例 下选择 IoT,然后选择 下一步。图 16 选择用例 (IoT)
在 添加权限 页面,选择 下一步。在 角色详情 中,输入 角色名称,然后选择 创建角色。选择新创建的角色,点击 添加权限 gt 创建内联策略。在 创建策略 页面,选择 JSON,并用以下内容替换,替换 yourS3bucket 为 CI/CD 工件桶名称。选择 审核策略。
json{ Version 20121017 Statement [ { Effect Allow Action s3GetObject Resource arnawss3yourS3bucket/ } ]}
在 创建策略 页面,输入 名称,然后选择 创建策略。步骤 7:创建部署阶段转到 CodePipeline 控制台,选择已创建的流水线,点击 编辑。选择 添加阶段,该选项在 编辑:构建阶段 后出现。图 17 选择添加阶段
在 阶段名称 中输入 Deploy,然后选择 添加阶段。选择 添加操作组,在 操作名称 中输入 Deploy,在 操作提供商 中选择 AWS CodeBuild。在 输入工件 下选择 BuildArtifact。在 项目名称 中选择 创建项目。在 创建构建项目 中,输入 项目名称。在 环境 的 操作系统 中选择 Amazon Linux 2。对于 运行时,选择 标准,在 镜像 中选择 aws/codebuild/amazonlinux2x8664standard40 (或最新版本)。在 附加配置 中,在 环境变量 下创建: 变量 IOTARN,值为 IoT 设备的 ARN来源于前提条件。变量 ROLE,输入来自步骤 6 的预签名 IAM 角色的 ARN。最后,创建变量 BUCKET,输入 CI/CD 工件桶的名称。在 Buildspec 文件名称 可选 中输入 deployyaml。选择 继续到 CodePipeline,然后选择 完成。选择 保存。步骤 8:为部署阶段 IAM 角色添加权限AWS CodeBuild 部署阶段将自动创建一个名为 codebuildlt项目名称gtservicerole 的 IAM 服务角色。此角色需要额外的权限与 AWS IoT 交互。转到 IAM 控制台的角色中心,选择该角色。点击 添加权限 gt 创建内联策略。在 创建策略 页面,选择 JSON,并用以下内容替换,并替换: presignrolearn 为步骤 6 中的预签名 IAM 角色 ARN 地址。region 和 account 分别替换为 AWS 区域和 AWS 账户 ID。IoTdevicename 替换为 IoT 设备名称。yourS3bucket 替换为 CI/CD 工件桶名称。json{ Version 20121017 Statement [ { Sid PassRole Effect Allow Action [ iamGetRole iamPassRole ] Resource presignrolearn } { Sid IoTJobPermissions Effect Allow Action [ iotCreateJob ] Resource [ arnawsiotregionaccountidjob/iotdevicejob arnawsiotregionaccountidthing/IoTdevicename ] } { Effect Allow Action [ s3GetObject s3PutObject ] Resource arnawss3 yourS3bucket/ } ]}
点击 审核策略。在 创建策略 页面输入 名称,然后选择 创建策略。将应用程序部署到 IoT 设备
CI/CD 流水线已完成。要触发流水线,我们可以将文件上传到仓库。
上传文件到仓库 (AWS CLI)
向仓库上传四个文件,应用程序代码文件 applicationsh, AWS CodeBuild 的 buildspec 文件 buildyaml 和 deployyaml,以及 IoT 作业文档。
导航到本地仓库目录,并使用以下内容创建应用程序脚本文件 applicationsh:bash
!/bin/bash
set xtimestamp=(date YmdHM)filename=timestamplogtouch /home/ubuntu/filenamesudo chmod arw /home/ubuntu/filenameecho Installing Firmware Version 1 at timestamp gtgt /home/ubuntu/filename
该脚本创建一个新的文件,并将当前时间戳作为文件名。
创建一个 AWS CodeBuild 的 buildyaml 文件,内容如下:yamlversion 02
phases build commands echo IoT Application Build started on date sed i s/bucketname/bucket/g deployinstructionsjsonartifacts files sh deployyaml deployinstructionsjson
构建步骤会将 Amazon S3 桶名称插入到作业文档中。
创建 AWS CodeBuild 的 deploy
亚马逊转录Amazon Transcribe宣布了一款新的基于语音基础模型的自动语音识别ASR
Amazon Transcribe 推出百种语言支持的新一代语音识别系统关键要点Amazon Transcribe 宣布推出了支持 100 多种语言的新一代自动语音识别系统。该系统基于多参数语音基础模...
在 Amazon Bedrock预览版中导入自定义模型 新闻博客
在 Amazon Bedrock (预览版) 中导入自定义模型作者:Danilo Poccia 发表于 2024年4月23日,分类:Amazon Bedrock、Amazon SageMaker、公告...