使用 Amazon ECS Anywhere 在边缘部署 Amazon IoT Greengrass

发布时间 2023-08-04 16:43:15作者: 亚马逊云开发者

1.概述

亚马逊云科技提供了完备的IoT服务能力,涵盖设备服务、连接和控制服务以及云端分析服务,是快速构建安全可靠、可扩展的 IoT 平台的常见选择。Amazon IoT Greengrass 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用。Amazon ECS Anywhere提供的混合云容器服务。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

 

本文将提出一种基于 ECS Anywhere 构建容器化云边统一管理的IoT平台参考架构,介绍了如何利用 ECS Anywhere 在边缘设备上容器化部署 Greengrass,并在 Greengrass 上部署组件,帮助用户简化 IoT 设备管理,从而构建云边一体的 IoT 平台。

2.ECS Anywhere

Amazon Elastic Container Service (ECS) Anywhere 是亚马逊云科技自研的容器管理平台 ECS 的扩展功能,将云端的容器管理能力延伸到本地数据中心和边缘端,是利用容器技术构建云边一体 IoT 平台的理想选择。ECS Anywhere 为用户提供了一个完全托管的容器编排服务,使客户能够使用与目前在 Amazon ECS 中所用的相同 API、集群管理、工作负载计划、监控和部署流水线在本地运行和管理容器化应用程序。通过将服务器或实例连接到托管 Amazon ECS 控制平面,客户可以在自己的基础设施上使用 Amazon ECS Anywhere。使用 Amazon ECS Anywhere,客户可以在任何客户管理的实例上部署和管理容器化应用程序,而无需在本地手动安装、操作和管理容器编排软件。

3.IoT Greengrass

Amazon IoT Greengrass 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用。使用 IoT Greengrass 来构建软件,使设备能够对其生成的数据进行本地操作,基于机器学习模型运行预测,以及过滤和聚合设备数据。可将 Amazon 服务扩展至物理设备,以便在边缘侧操作生成的数据,同时仍可将云用于管理、分析和持久存储。可确保设备不仅可以快速响应本地事件,还能在连接不稳定时正常运行。可以编写自定义软件,可在本地设备上运行的 Amazon Lambda 函数和容器应用。Amazon IoT Greengrass 也可运行在容器中。

4.基于 ECS Anywhere 的 IoT 平台参考架构

在 ECS 中统一管理服务端和边缘端的设备和容器任务,通过 ECS Anywhere 在边缘端容器中部署 Greengrass 和其他边缘应用,通过云端 IoT 控制台管理连接 Greengrass,管理 Greengrass 中的组件和应用。

image.png

5.构建步骤

(本文将用一台 EC2 服务器模拟边缘服务器,操作系统为 ubuntu20,机型为 T3.large ,磁盘 EBS50G。)

使用 ECS Anywhere 在边缘部署 IoT Greengrass 及应用, 具体构建步骤如下:

  • 部署 ECS Anywhere
  • 部署 Greengrass
  • 部署应用

5.1部署 ECS Anywhere

ECS Anywhere 部署架构图如下所示。

image.png

5.1.1 创建 ECS 集群

进入 ECS 服务,点击创建集群。

image.png

选择 EC2 Linux+ 联网模版。

image.png

输入集群名,可以选择创建空集群或者创建有实例的集群。

image.png

如果为非空集群,实例数量输入 2,网络设置可选已有 VPC 和子网,也可以新建 VPC 。其他设置默认,点击创建集群。

image.png

5.1.2 注册边缘服务器

进入新创建的 ECS 集群,选择 ECS 实例子页签,点击注册 External 实例。

image.png

选择实例数量,实例角色新建,点击生成注册命令。

image.png

复制注册命令。

image.png

以 root 身份运行脚本将在边缘服务器上安装ECS代理和SSM代理。

image.png

执行完毕后,SSM 代理和 ECS 代理将在边缘服务器上运行,在 Amazon 控制台 ECS 服务界面的 ECS 示例标签可以看到注册成功的外部实例。

image.png

5.2 部署 Greengrass

5.2.1创建访问凭证

SSH登录到边缘服务器,创建 greengrass 容器中访问 Amazon IoT Core 的访问凭证

vi /root/.aws/credentials

输入以下内容,其中 <AWS_ACCESS_KEY_ID> <AWS_SECRET_ACCESS_KEY>需要替换为访问 AK、SK,如果为临时凭证还需要替换<AWS_SESSION_TOKEN>

aws_access_key_id     = <AWS_ACCESS_KEY_ID>
aws_secret_access_key = <AWS_SECRET_ACCESS_KEY>
aws_session_token     = <AWS_SESSION_TOKEN
5.2.2定义任务

进入控制台 ECS 服务界面,从左侧导航菜单原则任务定义,选择创建新任务定义

image.png

进入控制台 ECS 服务界面,选择 EXTERNAL。

image.png

选择创建的任务角色,网络模式选择主机。

image.png

内存和 CPU 设置为 1024。

image.png

点击添加卷。

image.png

在弹出页面中添加 Amazon 访问凭证的径/root/.aws/credentials。

image.png

点击添加容器,进入容器添加画面。

image.png

输入容器名和映像地址 public.ecr.aws/q3k3q7c1/aws-iot-greengrass-v2:latest。

image.png

输入访问 Amazon 凭证及 PROVISION 环境变量,值为 true。

image.png

设置存储挂载点,选择挂载卷,输入容器中 Amazon 凭证的挂载路径 /root/.aws/credentials,完成任务定义。

image.png

也可以通过 JSON 文件配置任务,代码如下。

{
    "requiresCompatibilities": [
        "EXTERNAL"
    ],
    "containerDefinitions": [
        {
            "name": "greengrassv2",
            "image": "public.ecr.aws/q3k3q7c1/aws-iot-greengrass-v2:latest",
            "resourceRequirements": null,
            "essential": true,
            "portMappings": [],
            "environment": [
                {
                    "name": "AWS_ACCESS_KEY_ID",
                    "value": "<AWS_ACCESS_KEY_ID>"
                },
                {
                    "name": "AWS_SECRET_ACCESS_KEY",
                    "value": "<AWS_SECRET_ACCESS_KEY>"
                },
                {
                    "name": "AWS_SESSION_TOKEN",
                    "value": "<AWS_SESSION_TOKEN>"
                },
                {
                    "name": "AWS_REGION",
                    "value": "<AWS_REGION>"
                },
                {
                    "name": "PROVISION",
                    "value": "true"
                }
            ],
            "environmentFiles": [],
            "secrets": null,
            "mountPoints": [
                {
                    "sourceVolume": "aws-credentials",
                    "containerPath": "/root/.aws/credentials",
                    "readOnly": ""
                }
            ],
            "volumesFrom": null,
            "hostname": null,
            "user": null,
            "workingDirectory": null,
            "extraHosts": null,
            "logConfiguration": null,
            "ulimits": null,
            "dockerLabels": null,
            "dependsOn": null,
            "repositoryCredentials": {
                "credentialsParameter": ""
            }
        }
    ],
    "volumes": [
        {
            "host": {
                "sourcePath": "/root/.aws/credentials"
            },
            "name": "aws-credentials"
        }
    ],
    "networkMode": "host",
    "memory": "1024",
    "cpu": "1024",
    "placementConstraints": [],
    "family": "greengrassv2",
    "taskRoleArn": "arn:aws:iam::804077508687:role/ECSTaskRole",
    "executionRoleArn": "arn:aws:iam::804077508687:role/ECSTaskRole",
"tags": []
}
5.2.3 运行任务

在 ECS 服务界面的任务子页签中,选择运行新任务。

image.png

启动类型选择 EXTERNAL。

image.png

修改环境变量参数或保持任务定义的默认设置。

image.png

启动任务,可以看到任务列表里在边缘服务器上运行新的 greengrass 任务。

image.png

在 Amazon 控制台 IOT 的服务界面中,点击左侧导航菜单的Greengrass 的核心设备,可以看到刚才注册成功的 Greengrass 核心设备。

image.png

5.3 部署示例应用

在本地终端,编写 Greengrass 组建 hello_world.py 脚本如下:

 
import sys
import datetime

message = "Hello, %s! Current time: %s." % (sys.argv[1], datetime.datetime.now())
message += " Greetings from your first Greengrass component."
# Print the message to stdout.
print(message)

# Append the message to the log file.
with open('/tmp/Greengrass_HelloWorld.log', 'a') as f:
    print(message, file=f)
创建一个 S3存储桶用于存放 Greengrass 组件,存储桶名为 GREEGRASS-EXAMPLE-BUCKET。

aws s3 mb s3:// GREEGRASS-EXAMPLE-BUCKET 
aws s3 cp hello_world.py \
  s3://GREEGRASS-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py

设置 IAM 权限,允许核心设备的 ECSTaskRole 访问 S3 存储桶中的组件对象。

从 Amazon 控制台进入 IoT 服务页面,点击 Greengrass 设备的组件,点击创建组件。

image.png

在创建组件页面中,选择 JSON 格式,输入组件配置信息。

image.png

配置信息代码如下:

{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.HelloWorld",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "My first Greengrass component.",
  "ComponentPublisher": "Amazon",
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "Message": "world"
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "Run": "python3 -u {artifacts:path}/hello_world.py '{configuration:/Message}'"
      },
      "Artifacts": [
        {
          "URI": "s3://GREENGRASS-DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py"
        }
      ]
    }
  ]
}

在 Iot Greengrass 导航菜单,点击部署,进入部署页面。

image.png

输入部署名和,目标类型输入创建的 Greengrass 设备名,点击下一步。

image.png

选择已定义的 helloworld 组件,配置策略采用默认,完成部署创建。

image.png

image.png

部署完成后,可以在 Greengrass 设置的组件列表中看到已安装的组件。

SSH 登录 Greengrass 设备,进入 Greengrass 容器,通过以下命令可以查看输出信息。

tail -f /tmp/Greengrass_HelloWorld.log

6. 总结

本文介绍了基于 ECS Anywhere 的 IoT 平台参考架构,利用 ECS Anywhere 在边缘设备上容器化部署 Greengrass,并在 Greengrass 上部署组件,而从简化边缘设备管理和应用部署,用户可基于此扩展功能、构建基于容器的云边一体 IoT 平台。

本篇作者

image.png

姜可

亚马逊云科技资深解决方案架构师,负责协助客户业务系统上云的解决方案架构设计和咨询,现致力于 DevOps、IoT、机器学习相关领域的研究。在加入亚马逊云科技之前,曾在金融、制造、政府等行业耕耘多年,对相关行业解决方案和架构有很深的理解。

文章来源:

https://dev.amazoncloud.cn/column/article/630a1502d4155422a4610a58?sc_medium=regulartraffic&amp;sc_campaign=crossplatform&amp;sc_channel=bokey