使用 亚马逊云科技 IoT Device Management 自动将应用程序部署到物联网设备

简介

物联网 (IoT) 行业正趋向于使用与最新标准、接口和协议兼容的设备。为了保持竞争力,设备制造商必须发布新功能、执行系统更新并及时部署安全补丁。长期以来,软件应用程序一直在使用自动 持续集成和交付 (CI/CD) 管道来管理这些更新的交付。但是,物联网设备的自动化部署具有挑战性,原因有很多,例如远程位置、间歇性连接、网络带宽和规模。

在这篇博客文章中,我们介绍了一个 CI/ID 管道,用于将应用程序持续集成和部署到 IoT 设备。该管道可自动部署应用程序并缩短物联网应用程序的发布时间。物联网设备运营商还可以使用该管道大规模执行管理任务,例如固件更新、命令执行和安全补丁部署。

架构概述

该架构使用 亚马逊云科技 IoT Core 来处理 IoT 设备的连接和认证。CI/CD 管道是使用 亚马逊云科技 CodePip elin e 设置的。 该管道从 亚马逊云科技 CodeCommit 存储库中获取源代码,并使用 A WS CodeBuild 进行构建 和部署步骤。然后,使用 亚马逊云科技 IoT Dev ice Managemen t 的 亚马逊云科技 I oT Job s 功能来管理物联网设备的应用程序部署。任务功能允许在连接到 亚马逊云科技 IoT Core 的一台或多台设备上执行远程操作。亚马逊云科技 IoT Device Management 负责安排、重试和报告远程操作的状态。物联网设备负责订阅来 自 亚马逊云科技 IoT 的 任务通知

Architecture diagram

图 1.0 物联网设备的 CI/CD 管道

先决条件

  • 将 亚马逊云科技 CLI 安装到本地计算机,按照 安装说明进行操作
  • 在本地计算机上安装 git 和 git -remote-code-commit 实用程序
  • 启用版本控制的 A mazon Simple Storage Service (Amazon S3) 工件存储桶,用于存储 CI/CD 工件。
  • 物联网设备 作为一个 东西 连接到 亚马逊云科技 IoT Core 。在本文中,我们将使用虚拟物联网设备,在 亚马逊弹性计算云(Amazon EC2)实例 上安装亚马逊云科技 IoT设备客户端软件 。 亚马逊云科技 IoT 入门研讨会 提供了有关设置虚拟 IoT 设备的详细指导。

草率排练

在本演练中,我们将设置一个 CI/CD 管道,用于创建 IoT 作业,将应用程序部署到 IoT 设备。 该应用程序是一个简单的 bash 脚本,它在执行时会在物联网设备上创建一个带有当前时间戳的文件, 例如 2023-05-0410-48.log。

创建 亚马逊云科技 CodeCommit 存储库(亚马逊云科技 控制台)

  • 创建代码存储库,例如 IotApplicationRepo,用于存储应用程序源代码(有关详细说明,请参阅创建 亚马逊云科技 CodeCommit 存储库)。
  • 使用以下命令将存储库提取到本地计算机:git clone code comm it: //iotApplicationRepo iotApplic ationRepo

创建 CI/CD 管道(亚马逊云科技 控制台)

使用 亚马逊云科技 CodePipeline 创建 CI/CD 管道,分为三个阶段,即来源、构建和部署。

步骤 1:创建并命名管道

  • 转到 CodePipeline 控制台 ,然后选择 创建管道

Select Create pipeline

图 1.1 — 创建管道

  • 步骤 1 :输入 流水线名称 。在 “ 高级设置” 下 选择 “ 自定义位置 ” ,然后选择 Amazon S3 存储桶对象(来自先决条件)。

select default AWS Managed key and select next

图 1.2 — 选择 亚马逊云科技 托管密钥

  • 选择 “ 下一步 ” 。

步骤 2:创建源阶段

  • 步骤 2:添加源代码阶段中 ,在 源 提供商 下选择 亚马逊云科技 CodeCommit
  • 存储库名称 中 ,选择之前创建的 亚马逊云科技 CodeCommit 存储库,例如 IotApplicationRepo。 在分支名称 中 ,输入 master 。选择 “ 下一步 ” 。

步骤 3:创建构建阶段

  • 步骤 3:添加构建阶段 。在 构建提供商 中,选择 亚马逊云科技 CodeBuild ,然后选择 创建 项目。 这将打开一个新窗口。

Add build stage, select single build

图 1.3 — 构建阶段

  • 在 “ 创建构建项目 ” 下 ,输入 项目名称
  • 在 “ 操作系统 中的环境” 下, 选择 Amazon Linux 2
  • 对于 运行时间 ,选择 标准 ,对于 映像 ,选择 aws/codebuild/amazonlinux2-x86_64 标准:4.0(或使用亚马逊 Linux 2 的最新 映像)
  • 在 “ 其他配置” 中 ,在 “ 环境变量 ” 下 。创建变量 “ 存储桶 ”,然后在值下方输入工件存储桶名称。
  • Buildspec 名称(可选) 中 ,输入 buil d.yaml。
  • 然后选择 “ 继续使用代码管道 ”。
  • 选择 “ 下一步 ” 。
  • 亚马逊云科技 CodeBuild 会自动创建名为 codebuil d-service-role 的 IAM 服务角色。 此角色需要额外的权限才能将构建构件上传到工件存储桶。
  • 前往 I AM 控制台的 角色中心 并选择此角色。
  • 选择 “ 添加权限 ” ,然后选择 “ 创建内联策略

Select create inline policy

图 1.4 — 创建内联策略

  • 创建策略 中 ,选择 JSON 并将内容替换为以下策略,并使用工 件存储桶名称替换 your_s3_Bucket
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::your_S3_bucket/*"
        }
    ]
}
  • 选择 “ 查看政策 ” 。
  • 创建策略 中 ,输入 名称 并选择 创建策略
  • 导航回 创建新管道

步骤 4:跳过部署阶段

  • 步骤 4:添加部署阶段 中 ,选择 跳过部署阶段 。在步骤 8 中,我们将使用 亚马逊云科技 CodeBuild 将应用程序部署到 IoT 设备上。

skip deploy stage

图 1.5 — 跳过部署阶段

第 5 步:查看管道

  • 步骤 5:查看 页面中,查看管道配置,然后选择 创建管道 来创建管道。
  • CI/CD 管道将自动开始执行,选择 “ 停止执行”-> “停 止” 以停止管道。由于管道尚未完成。

步骤 6:创建预签名的亚马逊身份和访问管理 (IAM) 角色

CI/CD 管道会将应用程序文件上传到工件的 Amazon S3 存储桶。Amazon S3 存储桶对象是私有的,因此 亚马逊云科技 IoT 将自动生成 预签名 URL ,这将授予物联网设备下载应用程序文件的限时权限(更多详情请参阅 亚马逊云科技 IoT Device Managem ent 文档)。

要生成预签名 URL,亚马逊云科技 IoT 需要一个有权从工件存储桶下载对象的 IAM 角色。

  • 转到 IAM 控制台的 角色中心 ,然后选择 创建角色
  • 选择可信实体 中 ,在其 他 亚马逊云科技 服务的 用例 下 选择 IoT ,然后选择 下一步

Select trusted entity, Use case IoT

图 1.6 — 选择用例 (IoT)

  • 添加权限 中 ,选择 下一步
  • 角色详细信息 中 ,输入 角色名称 并选择 创建角色
  • 选择新创建的角色并选择 添加权限-> 创建内联策略
  • 创建策略 中 ,选择 JSON 并将内容替换为以下策略,并将 your_S3_Bucket 替换为 CI/CD 工件存储桶 名称。选择 “ 查看政策 ” 。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your_S3_bucket/*"
        }
    ]
}
  • 创建策略 中 ,输入 名称 并选择 创建策略

步骤 7:创建部署阶段

  • 前往 CodePipeline 控制台 ,选择创建的管道,然后选择 编辑
  • 选择 “ 添加舞台 ” ,它将出现在 “编辑:构建” 阶段 之后 。

Select Add stage

图 1.7 — 选择 “添加阶段”

  • 在 S 阶段名称 中 ,输入 Deploy 并选择 添加阶段
  • 选择 添加操作组 ,在操作 名称中 输入 部署 ,在 操作 提供者 中 选择 亚马逊云科技 Code Build。
  • 在 “ 输入构件 ” 下选择 “ 生成工件 ”。
  • 在项目名称中,选择 创建项目
    • 在 “ 创建构建项目 ” 下 ,输入 项目名称
    • 在 “
    • 操作系统 中的 环境 ” 下, 选择 Amazon Linux 2
    • 对于 运行时间 ,选择 标准 ,对于 图像 ,选择 aws/codebuild/amazonlinux2-x86_64 standard : 4.0(或其最新版本)
    • 在 “ 其他配置” 中 ,在 “ 环境变量 ” 下 。
      • 创建变量 IOT_ARN ,在值下输入物联网事物的 ARN (来自先决条件)。
      • 创建变量 RO L E 并输入步骤 6 中预先签名 IAM 角色的 ARN。
      • 最后,创建变量 B UCKE T 并输入 CI/CD 工件存储桶的存储桶名称。
  • Buildspec 名称(可选) 中 ,输入部署.yaml。
  • 选择 继续使用代码管道 ,然后选择 完成
  • 选择 “ 保存 ” 。

步骤 8:向部署阶段 IAM 角色添加权限

  • 亚马逊云科技 CodeBuild 部署阶段将自动创建名为 codebuild-service-role 的 IAM 服务角色。此角色需要额外的权限才能与 亚马逊云科技 IoT 进行交互。
  • 前往 I AM 控制台的 角色中心 并选择此角色。
  • 选择 添加权限-> 创建内联策略
  • 创建策略 中 ,选择 JSON 并将内容替换为以下策略并替换:将 pres
    • ign_role_arn 替换为步骤 6 中预签名 IAM 角色 ARN 的 URL。
    • 使用 亚马逊云科技 区域 和 亚马逊云科技 账户 ID 替换区域和账户。
    • IoT_Device_name 替换为物联网设备名称 使用 CI/CD 工件存储桶名称
    • 替换 your_s3_B ucket。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PassRole",
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:PassRole"
            ],
            "Resource": "presign_role_arn"
        },
        {
            "Sid": "IoTJobPermissions",
            "Effect": "Allow",
            "Action": [
                "iot:CreateJob"
            ],
            "Resource": [
                "arn:aws:iot:region:account_id:job/iot-device-job*",
                "arn:aws:iot:region:account_id:thing/IoT_device_name"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3::: your_S3_bucket/*"
        }
    ]
}
  • 选择 “ 查看政策 ” 。在 创建策略 中 ,输入 名称 并选择 创建策略

将应用程序部署到 IoT 设备

CI/CD 管道已完成。为了触发管道,我们可以将文件上传到存储库。

将文件上传到存储库 (亚马逊云科技 CLI)

向存储库添加四个文件、应用程序代码文件 application.sh 亚马逊云科技 CodeBuild buildspec 文件 bu il d.yaml 和 deploy.yaml 以及 IoT 任务 文档。

  • 导航到本地存储库目录并创建包含以下内容的应用程序脚本文件 application.sh:
#!/bin/bash
set -x
time_stamp=$(date "+%Y-%m-%d%H-%M")
filename="$time_stamp.log"
touch /home/ubuntu/$filename
sudo chmod a+rw /home/ubuntu/$filename
echo "Installing Firmware Version 1 at $time_stamp" >> /home/ubuntu/$filename

该脚本使用当前时间戳作为文件名创建一个新文件。

  • 创建一个 亚马逊云科技 Code Build build.yaml 文件,其中包含以下内容:
version: 0.2

phases:
  build:
    commands:
      - echo IoT Application Build started on `date`
      - sed -i "s/bucket-name/$bucket/g" deploy_instructions.json
artifacts:
  files:
    - '*.sh'
    - 'deploy.yaml'
    - 'deploy_instructions.json'

构建步骤将 Amazon S3 存储桶名称插入到任务文档中。

  • 创建一个 亚马逊云科技 CodeBuild 部署.yaml 文件,其中包含以下内容:
version: 0.2

phases:
  build:
    commands:
      - echo "Deploying application to the IoT device"
      - time_stamp=$(date +%Y%m%d_%H%M%S)
      - aws s3 cp deploy_instructions.json s3://$BUCKET/job/deploy_instructions.json
      - aws s3 cp application.sh s3://$BUCKET/binaries/application.sh
      - aws iot create-job --job-id iot-device-job$time_stamp --targets $IOT_ARN --document-source  s3://$BUCKET/job/deploy_instructions.json --presigned-url-config roleArn=$ROLE,expiresInSec=60

部署步骤创建一个 亚马逊云科技 IoT 任务

  • 创建 亚马逊云科技 IoT 任务文档 deplo y_instructions.json ,内容如下:
{
  "version": "1.0",
  "steps": [
    {
      "action": {
        "name": "Deploy Application",
        "type": "runHandler",
        "input": {
          "handler": "bash",
          "args": [
            "wget -O /home/ubuntu/application.sh '${aws:iot:s3-presigned-url:https://s3.amazonaws.com/bucket-name/binaries/application.sh}' && sudo chmod u+x /home/ubuntu/application.sh && sudo /home/ubuntu/application.sh" 
          ],
          "path": "/bin"
        },
        "runAsUser": "-c"
      }
    }
  ]
}

该文档包含用于下载和执行应用程序脚本的命令。

  • 将文件上传到存储库
git add .
git commit -m “adding files for the IoT application”
git push

文件上传将触发 CI/CD 管道。部署状态可以从 亚马逊云科技 IoT 控制台 的 “ 远程操作 ” 下的 “ 任务 ” 中看到 。

Jobs screen

图 1.8 — 作业画面

正在清理

请记住删除在本演练中创建的所有资源,以避免将来产生成本。

结论

在这篇文章中,我们介绍了物联网设备的自动应用程序部署指南。本指南使您可以专注于开发功能,而 亚马逊云科技 IoT 服务则负责应对间歇连接、身份验证和可扩展性等部署挑战。自动化节省了开发和测试时间,有助于及时发布新功能、更新和安全补丁。

下一步将是扩大管道,增加测试和监控等更多阶段。要进一步了解 亚马逊云科技 IoT Device Management 如何处理部署,请参阅 工作文档

作者简介

Asad author one Asad Syed is a DevOps Architect with 亚马逊云科技 ProServe and is based out of Berlin. He works with global customers to modernize their applications & processes. Asad has a keen interest in helping customers utilize 亚马逊云科技 IoT services to achieve their business outcomes. Outside of work, he enjoys playing volleyball, bouldering and hiking.
Syed Rehan author two
Syed Rehan is a Sr. Global IoT Cybersecurity Specialist at Amazon Web Services (亚马逊云科技) working within 亚马逊云科技 IoT Service team and is based out of London. He is covering global span of customers working with security specialists, developers and decision makers to drive the adoption of 亚马逊云科技 IoT services. Syed has in-depth knowledge of cybersecurity, IoT and cloud and works in this role with global customers ranging from start-up to enterprises to enable them to build IoT solutions with the 亚马逊云科技 Eco system.


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。