亚马逊AWS官方博客

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

1.概述

亚马逊云科技提供了完备的IoT服务能力,涵盖设备服务、连接和控制服务以及云端分析服务,是快速构建安全可靠、可扩展的IoT平台的常见选择。AWS 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

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

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

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

5.构建步骤

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

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

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

5.1部署ECS Anywhere

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

5.1.1 创建ECS集群

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

选择EC2 Linux+联网模版。

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

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

5.1.2 注册边缘服务器

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

 

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

 

复制注册命令。

 

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

 

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

 

5.2 部署Greengrass

5.2.1创建访问凭证

SSH登录到边缘服务器,创建greengrass容器中访问AWS 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服务界面,从左侧导航菜单原则任务定义,选择创建新任务定义。

 

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

 

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

 

内存和CPU设置为1024。

点击添加卷。

 

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

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

 

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

 

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

 

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

 

也可以通过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服务界面的任务子页签中,选择运行新任务。

 

启动类型选择EXTERNAL。

 

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

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

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

 

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 存储桶中的组件对象。

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

 

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

 

配置信息代码如下:

{
  "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导航菜单,点击部署,进入部署页面。

 

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

 

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

 



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

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

tail -f /tmp/Greengrass_HelloWorld.log

6. 总结

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

本篇作者

姜可

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