{"value":"### **1.概述**\n亚马逊云科技提供了完备的IoT服务能力,涵盖设备服务、连接和控制服务以及云端分析服务,是快速构建安全可靠、可扩展的 IoT 平台的常见选择。Amazon IoT Greengrass 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用。Amazon ECS Anywhere提供的混合云容器服务。\n\n本文将提出一种基于 ECS Anywhere 构建容器化云边统一管理的IoT平台参考架构,介绍了如何利用 ECS Anywhere 在边缘设备上容器化部署 Greengrass,并在 Greengrass 上部署组件,帮助用户简化 IoT 设备管理,从而构建云边一体的 IoT 平台。\n\n### **2.ECS Anywhere**\nAmazon Elastic Container Service (ECS) Anywhere 是亚马逊云科技自研的容器管理平台 ECS 的扩展功能,将云端的容器管理能力延伸到本地数据中心和边缘端,是利用容器技术构建云边一体 IoT 平台的理想选择。ECS Anywhere 为用户提供了一个完全托管的容器编排服务,使客户能够使用与目前在 Amazon ECS 中所用的相同 API、集群管理、工作负载计划、监控和部署流水线在本地运行和管理容器化应用程序。通过将服务器或实例连接到托管 Amazon ECS 控制平面,客户可以在自己的基础设施上使用 Amazon ECS Anywhere。使用 Amazon ECS Anywhere,客户可以在任何客户管理的实例上部署和管理容器化应用程序,而无需在本地手动安装、操作和管理容器编排软件。\n\n### **3.IoT Greengrass**\nAmazon IoT Greengrass 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用。使用 IoT Greengrass 来构建软件,使设备能够对其生成的数据进行本地操作,基于机器学习模型运行预测,以及过滤和聚合设备数据。可将 Amazon 服务扩展至物理设备,以便在边缘侧操作生成的数据,同时仍可将云用于管理、分析和持久存储。可确保设备不仅可以快速响应本地事件,还能在连接不稳定时正常运行。可以编写自定义软件,可在本地设备上运行的 Amazon Lambda 函数和容器应用。Amazon IoT Greengrass 也可运行在容器中。\n\n### **4.基于 ECS Anywhere 的 IoT 平台参考架构**\n在 ECS 中统一管理服务端和边缘端的设备和容器任务,通过 ECS Anywhere 在边缘端容器中部署 Greengrass 和其他边缘应用,通过云端 IoT 控制台管理连接 Greengrass,管理 Greengrass 中的组件和应用。\n\n![image.png](https://dev-media.amazoncloud.cn/9679c7e0d6364c73a2ca4ae659779bca_image.png)\n\n#### **5.构建步骤**\n(本文将用一台 EC2 服务器模拟边缘服务器,操作系统为 ubuntu20,机型为 T3.large ,磁盘 EBS50G。)\n\n使用 ECS Anywhere 在边缘部署 IoT Greengrass 及应用, 具体构建步骤如下:\n\n- 部署 ECS Anywhere\n- 部署 Greengrass\n- 部署应用\n\n#### **5.1部署 ECS Anywhere**\nECS Anywhere 部署架构图如下所示。\n\n![image.png](https://dev-media.amazoncloud.cn/167267f8022949a9ad7c1db6c3c3c7b6_image.png)\n\n##### **5.1.1 创建 ECS 集群**\n\n进入 ECS 服务,点击创建集群。\n\n![image.png](https://dev-media.amazoncloud.cn/ad6f7608a9634a98ae58d026cd72bf23_image.png)\n\n选择 EC2 Linux+ 联网模版。\n\n![image.png](https://dev-media.amazoncloud.cn/517764340008489a87aee48373cd0d6b_image.png)\n\n输入集群名,可以选择创建空集群或者创建有实例的集群。\n\n![image.png](https://dev-media.amazoncloud.cn/137b4310a33645cca80496575e0a1d59_image.png)\n\n如果为非空集群,实例数量输入 2,网络设置可选已有 VPC 和子网,也可以新建 VPC 。其他设置默认,点击创建集群。\n\n![image.png](https://dev-media.amazoncloud.cn/cd2fd9a27c9845e293ba14e8a83b1ade_image.png)\n\n##### **5.1.2 注册边缘服务器**\n\n进入新创建的 ECS 集群,选择 ECS 实例子页签,点击注册 External 实例。\n\n![image.png](https://dev-media.amazoncloud.cn/eb1a029325fa4c1c99c57c2bd96c2a74_image.png)\n\n选择实例数量,实例角色新建,点击生成注册命令。\n\n![image.png](https://dev-media.amazoncloud.cn/9a68cacc7b08425aa3ab274150006537_image.png)\n\n复制注册命令。\n\n![image.png](https://dev-media.amazoncloud.cn/2bdf36b8449841daae9843c835073af0_image.png)\n\n以 root 身份运行脚本将在边缘服务器上安装ECS代理和SSM代理。\n\n![image.png](https://dev-media.amazoncloud.cn/334b97e0665c4ef0aec890c3078e7edf_image.png)\n\n执行完毕后,SSM 代理和 ECS 代理将在边缘服务器上运行,在 Amazon 控制台 ECS 服务界面的 ECS 示例标签可以看到注册成功的外部实例。\n\n![image.png](https://dev-media.amazoncloud.cn/6045e8c597b3436391b4c64faa8ab24c_image.png)\n\n#### **5.2 部署 Greengrass**\n\n##### **5.2.1创建访问凭证**\n\nSSH登录到边缘服务器,创建 greengrass 容器中访问 Amazon IoT Core 的访问凭证\n\n```\nvi /root/.aws/credentials\n```\n\n输入以下内容,其中```\n<AWS_ACCESS_KEY_ID>```和```\n<AWS_SECRET_ACCESS_KEY>```需要替换为访问 AK、SK,如果为临时凭证还需要替换```<AWS_SESSION_TOKEN>```\n\n```\naws_access_key_id = <AWS_ACCESS_KEY_ID>\naws_secret_access_key = <AWS_SECRET_ACCESS_KEY>\naws_session_token = <AWS_SESSION_TOKEN\n```\n\n##### **5.2.2定义任务**\n\n进入控制台 ECS 服务界面,从左侧导航菜单原则任务定义,选择创建新任务定义\n\n![image.png](https://dev-media.amazoncloud.cn/8bfd5bf441af475bae1571e70adaa3e0_image.png)\n\n进入控制台 ECS 服务界面,选择 EXTERNAL。\n\n![image.png](https://dev-media.amazoncloud.cn/a5f668e452e041a8b12d0080c47c936a_image.png)\n\n选择创建的任务角色,网络模式选择主机。\n\n![image.png](https://dev-media.amazoncloud.cn/0be986e8949a48f983edc88a39d5b089_image.png)\n\n内存和 CPU 设置为 1024。\n\n![image.png](https://dev-media.amazoncloud.cn/4eafa9704a3f41f0949dd88746cc04c1_image.png)\n\n点击添加卷。\n\n![image.png](https://dev-media.amazoncloud.cn/83bc9a7d9f414757b22c7d3d7b088ac1_image.png)\n\n在弹出页面中添加 Amazon 访问凭证的径/root/.aws/credentials。\n\n![image.png](https://dev-media.amazoncloud.cn/931bb05be6d4462e849399bf25a696d3_image.png)\n\n点击添加容器,进入容器添加画面。\n\n![image.png](https://dev-media.amazoncloud.cn/6794f056eb824b2b8d7d80c669a36dbc_image.png)\n\n输入容器名和映像地址 public.ecr.aws/q3k3q7c1/aws-iot-greengrass-v2:latest。\n\n![image.png](https://dev-media.amazoncloud.cn/a96b29403c2540f0b8b71d76750e39c4_image.png)\n\n输入访问 Amazon 凭证及 PROVISION 环境变量,值为 true。\n\n![image.png](https://dev-media.amazoncloud.cn/0dd36826a5a74610aa3b79b50feeeb52_image.png)\n\n设置存储挂载点,选择挂载卷,输入容器中 Amazon 凭证的挂载路径 /root/.aws/credentials,完成任务定义。\n\n![image.png](https://dev-media.amazoncloud.cn/0e3dfebbc5ff4588b4949b26549788d4_image.png)\n\n也可以通过 JSON 文件配置任务,代码如下。\n\n```\n{\n \"requiresCompatibilities\": [\n \"EXTERNAL\"\n ],\n \"containerDefinitions\": [\n {\n \"name\": \"greengrassv2\",\n \"image\": \"public.ecr.aws/q3k3q7c1/aws-iot-greengrass-v2:latest\",\n \"resourceRequirements\": null,\n \"essential\": true,\n \"portMappings\": [],\n \"environment\": [\n {\n \"name\": \"AWS_ACCESS_KEY_ID\",\n \"value\": \"<AWS_ACCESS_KEY_ID>\"\n },\n {\n \"name\": \"AWS_SECRET_ACCESS_KEY\",\n \"value\": \"<AWS_SECRET_ACCESS_KEY>\"\n },\n {\n \"name\": \"AWS_SESSION_TOKEN\",\n \"value\": \"<AWS_SESSION_TOKEN>\"\n },\n {\n \"name\": \"AWS_REGION\",\n \"value\": \"<AWS_REGION>\"\n },\n {\n \"name\": \"PROVISION\",\n \"value\": \"true\"\n }\n ],\n \"environmentFiles\": [],\n \"secrets\": null,\n \"mountPoints\": [\n {\n \"sourceVolume\": \"aws-credentials\",\n \"containerPath\": \"/root/.aws/credentials\",\n \"readOnly\": \"\"\n }\n ],\n \"volumesFrom\": null,\n \"hostname\": null,\n \"user\": null,\n \"workingDirectory\": null,\n \"extraHosts\": null,\n \"logConfiguration\": null,\n \"ulimits\": null,\n \"dockerLabels\": null,\n \"dependsOn\": null,\n \"repositoryCredentials\": {\n \"credentialsParameter\": \"\"\n }\n }\n ],\n \"volumes\": [\n {\n \"host\": {\n \"sourcePath\": \"/root/.aws/credentials\"\n },\n \"name\": \"aws-credentials\"\n }\n ],\n \"networkMode\": \"host\",\n \"memory\": \"1024\",\n \"cpu\": \"1024\",\n \"placementConstraints\": [],\n \"family\": \"greengrassv2\",\n \"taskRoleArn\": \"arn:aws:iam::804077508687:role/ECSTaskRole\",\n \"executionRoleArn\": \"arn:aws:iam::804077508687:role/ECSTaskRole\",\n\"tags\": []\n}\n```\n\n##### **5.2.3 运行任务**\n\n在 ECS 服务界面的任务子页签中,选择运行新任务。\n\n![image.png](https://dev-media.amazoncloud.cn/60e1f5d19ae445f4ba911196f157f973_image.png)\n\n启动类型选择 EXTERNAL。\n\n![image.png](https://dev-media.amazoncloud.cn/49b8ab12d5ec4438a2568d5b0202baf4_image.png)\n\n修改环境变量参数或保持任务定义的默认设置。\n\n![image.png](https://dev-media.amazoncloud.cn/cd2e5a0b91e846ff9a7e07229a83769e_image.png)\n\n启动任务,可以看到任务列表里在边缘服务器上运行新的 greengrass \n任务。\n\n![image.png](https://dev-media.amazoncloud.cn/447257cc191a4f56859d623a90782d15_image.png)\n\n在 Amazon 控制台 IOT 的服务界面中,点击左侧导航菜单的Greengrass 的核心设备,可以看到刚才注册成功的 Greengrass 核心设备。\n\n![image.png](https://dev-media.amazoncloud.cn/e3ee7d4730da4affad4aa8a55abd7acf_image.png)\n\n#### **5.3 部署示例应用**\n\n在本地终端,编写 Greengrass 组建 hello_world.py 脚本如下:\n\n```\nimport sys\nimport datetime\n\nmessage = \"Hello, %s! Current time: %s.\" % (sys.argv[1], datetime.datetime.now())\nmessage += \" Greetings from your first Greengrass component.\"\n# Print the message to stdout.\nprint(message)\n\n# Append the message to the log file.\nwith open('/tmp/Greengrass_HelloWorld.log', 'a') as f:\n print(message, file=f)\n创建一个 S3存储桶用于存放 Greengrass 组件,存储桶名为 GREEGRASS-EXAMPLE-BUCKET。\n\naws s3 mb s3:// GREEGRASS-EXAMPLE-BUCKET \naws s3 cp hello_world.py \\\n s3://GREEGRASS-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py\n```\n\n设置 IAM 权限,允许核心设备的 ECSTaskRole 访问 S3 存储桶中的组件对象。\n\n从 Amazon 控制台进入 IoT 服务页面,点击 Greengrass 设备的组件,点击创建组件。\n\n![image.png](https://dev-media.amazoncloud.cn/bb65c910f56342188adec8801df0eb96_image.png)\n\n在创建组件页面中,选择 JSON 格式,输入组件配置信息。\n\n![image.png](https://dev-media.amazoncloud.cn/d120b93de5384c8fa54ab00e20e4c809_image.png)\n\n配置信息代码如下:\n\n```\n{\n \"RecipeFormatVersion\": \"2020-01-25\",\n \"ComponentName\": \"com.example.HelloWorld\",\n \"ComponentVersion\": \"1.0.0\",\n \"ComponentDescription\": \"My first Greengrass component.\",\n \"ComponentPublisher\": \"Amazon\",\n \"ComponentConfiguration\": {\n \"DefaultConfiguration\": {\n \"Message\": \"world\"\n }\n },\n \"Manifests\": [\n {\n \"Platform\": {\n \"os\": \"linux\"\n },\n \"Lifecycle\": {\n \"Run\": \"python3 -u {artifacts:path}/hello_world.py '{configuration:/Message}'\"\n },\n \"Artifacts\": [\n {\n \"URI\": \"s3://GREENGRASS-DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py\"\n }\n ]\n }\n ]\n}\n```\n\n在 Iot Greengrass 导航菜单,点击部署,进入部署页面。\n\n![image.png](https://dev-media.amazoncloud.cn/951ce218f4764fdf902aff2c85717531_image.png)\n\n输入部署名和,目标类型输入创建的 Greengrass 设备名,点击下一步。\n\n![image.png](https://dev-media.amazoncloud.cn/8404088e73cb42348f69a38343541815_image.png)\n\n选择已定义的 helloworld 组件,配置策略采用默认,完成部署创建。\n\n![image.png](https://dev-media.amazoncloud.cn/a9601f31157240f6a031ec1b63135dcb_image.png)\n\n![image.png](https://dev-media.amazoncloud.cn/0b041c62b30445468863609a63c4d823_image.png)\n\n部署完成后,可以在 Greengrass 设置的组件列表中看到已安装的组件。\n\nSSH 登录 Greengrass 设备,进入 Greengrass 容器,通过以下命令可以查看输出信息。\n\ntail -f /tmp/Greengrass_HelloWorld.log\n\n### **6. 总结**\n\n本文介绍了基于 ECS Anywhere 的 IoT 平台参考架构,利用 ECS Anywhere 在边缘设备上容器化部署 Greengrass,并在 Greengrass 上部署组件,而从简化边缘设备管理和应用部署,用户可基于此扩展功能、构建基于容器的云边一体 IoT 平台。\n\n### **本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/a058e9d1fe0e437289227f2999e41ec9_image.png)\n\n#### **姜可**\n\n亚马逊云科技资深解决方案架构师,负责协助客户业务系统上云的解决方案架构设计和咨询,现致力于 DevOps、IoT、机器学习相关领域的研究。在加入亚马逊云科技之前,曾在金融、制造、政府等行业耕耘多年,对相关行业解决方案和架构有很深的理解。","render":"<h3><a id=\"1_0\"></a><strong>1.概述</strong></h3>\n<p>亚马逊云科技提供了完备的IoT服务能力,涵盖设备服务、连接和控制服务以及云端分析服务,是快速构建安全可靠、可扩展的 IoT 平台的常见选择。Amazon IoT Greengrass 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用。Amazon ECS Anywhere提供的混合云容器服务。</p>\n<p>本文将提出一种基于 ECS Anywhere 构建容器化云边统一管理的IoT平台参考架构,介绍了如何利用 ECS Anywhere 在边缘设备上容器化部署 Greengrass,并在 Greengrass 上部署组件,帮助用户简化 IoT 设备管理,从而构建云边一体的 IoT 平台。</p>\n<h3><a id=\"2ECS_Anywhere_5\"></a><strong>2.ECS Anywhere</strong></h3>\n<p>Amazon Elastic Container Service (ECS) Anywhere 是亚马逊云科技自研的容器管理平台 ECS 的扩展功能,将云端的容器管理能力延伸到本地数据中心和边缘端,是利用容器技术构建云边一体 IoT 平台的理想选择。ECS Anywhere 为用户提供了一个完全托管的容器编排服务,使客户能够使用与目前在 Amazon ECS 中所用的相同 API、集群管理、工作负载计划、监控和部署流水线在本地运行和管理容器化应用程序。通过将服务器或实例连接到托管 Amazon ECS 控制平面,客户可以在自己的基础设施上使用 Amazon ECS Anywhere。使用 Amazon ECS Anywhere,客户可以在任何客户管理的实例上部署和管理容器化应用程序,而无需在本地手动安装、操作和管理容器编排软件。</p>\n<h3><a id=\"3IoT_Greengrass_8\"></a><strong>3.IoT Greengrass</strong></h3>\n<p>Amazon IoT Greengrass 边缘运行时和云服务,可帮助您在设备上构建、部署和管理 IoT 应用。使用 IoT Greengrass 来构建软件,使设备能够对其生成的数据进行本地操作,基于机器学习模型运行预测,以及过滤和聚合设备数据。可将 Amazon 服务扩展至物理设备,以便在边缘侧操作生成的数据,同时仍可将云用于管理、分析和持久存储。可确保设备不仅可以快速响应本地事件,还能在连接不稳定时正常运行。可以编写自定义软件,可在本地设备上运行的 Amazon Lambda 函数和容器应用。Amazon IoT Greengrass 也可运行在容器中。</p>\n<h3><a id=\"4_ECS_Anywhere__IoT__11\"></a><strong>4.基于 ECS Anywhere 的 IoT 平台参考架构</strong></h3>\n<p>在 ECS 中统一管理服务端和边缘端的设备和容器任务,通过 ECS Anywhere 在边缘端容器中部署 Greengrass 和其他边缘应用,通过云端 IoT 控制台管理连接 Greengrass,管理 Greengrass 中的组件和应用。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/9679c7e0d6364c73a2ca4ae659779bca_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"5_16\"></a><strong>5.构建步骤</strong></h4>\n<p>(本文将用一台 EC2 服务器模拟边缘服务器,操作系统为 ubuntu20,机型为 T3.large ,磁盘 EBS50G。)</p>\n<p>使用 ECS Anywhere 在边缘部署 IoT Greengrass 及应用, 具体构建步骤如下:</p>\n<ul>\n<li>部署 ECS Anywhere</li>\n<li>部署 Greengrass</li>\n<li>部署应用</li>\n</ul>\n<h4><a id=\"51_ECS_Anywhere_25\"></a><strong>5.1部署 ECS Anywhere</strong></h4>\n<p>ECS Anywhere 部署架构图如下所示。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/167267f8022949a9ad7c1db6c3c3c7b6_image.png\" alt=\"image.png\" /></p>\n<h5><a id=\"511__ECS__30\"></a><strong>5.1.1 创建 ECS 集群</strong></h5>\n<p>进入 ECS 服务,点击创建集群。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/ad6f7608a9634a98ae58d026cd72bf23_image.png\" alt=\"image.png\" /></p>\n<p>选择 EC2 Linux+ 联网模版。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/517764340008489a87aee48373cd0d6b_image.png\" alt=\"image.png\" /></p>\n<p>输入集群名,可以选择创建空集群或者创建有实例的集群。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/137b4310a33645cca80496575e0a1d59_image.png\" alt=\"image.png\" /></p>\n<p>如果为非空集群,实例数量输入 2,网络设置可选已有 VPC 和子网,也可以新建 VPC 。其他设置默认,点击创建集群。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/cd2fd9a27c9845e293ba14e8a83b1ade_image.png\" alt=\"image.png\" /></p>\n<h5><a id=\"512__48\"></a><strong>5.1.2 注册边缘服务器</strong></h5>\n<p>进入新创建的 ECS 集群,选择 ECS 实例子页签,点击注册 External 实例。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/eb1a029325fa4c1c99c57c2bd96c2a74_image.png\" alt=\"image.png\" /></p>\n<p>选择实例数量,实例角色新建,点击生成注册命令。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/9a68cacc7b08425aa3ab274150006537_image.png\" alt=\"image.png\" /></p>\n<p>复制注册命令。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/2bdf36b8449841daae9843c835073af0_image.png\" alt=\"image.png\" /></p>\n<p>以 root 身份运行脚本将在边缘服务器上安装ECS代理和SSM代理。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/334b97e0665c4ef0aec890c3078e7edf_image.png\" alt=\"image.png\" /></p>\n<p>执行完毕后,SSM 代理和 ECS 代理将在边缘服务器上运行,在 Amazon 控制台 ECS 服务界面的 ECS 示例标签可以看到注册成功的外部实例。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/6045e8c597b3436391b4c64faa8ab24c_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"52__Greengrass_70\"></a><strong>5.2 部署 Greengrass</strong></h4>\n<h5><a id=\"521_72\"></a><strong>5.2.1创建访问凭证</strong></h5>\n<p>SSH登录到边缘服务器,创建 greengrass 容器中访问 Amazon IoT Core 的访问凭证</p>\n<pre><code class=\"lang-\">vi /root/.aws/credentials\n</code></pre>\n<p>输入以下内容,其中<code> <AWS_ACCESS_KEY_ID></code>和<code> <AWS_SECRET_ACCESS_KEY></code>需要替换为访问 AK、SK,如果为临时凭证还需要替换<code><AWS_SESSION_TOKEN></code></p>\n<pre><code class=\"lang-\">aws_access_key_id = <AWS_ACCESS_KEY_ID>\naws_secret_access_key = <AWS_SECRET_ACCESS_KEY>\naws_session_token = <AWS_SESSION_TOKEN\n</code></pre>\n<h5><a id=\"522_90\"></a><strong>5.2.2定义任务</strong></h5>\n<p>进入控制台 ECS 服务界面,从左侧导航菜单原则任务定义,选择创建新任务定义</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/8bfd5bf441af475bae1571e70adaa3e0_image.png\" alt=\"image.png\" /></p>\n<p>进入控制台 ECS 服务界面,选择 EXTERNAL。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/a5f668e452e041a8b12d0080c47c936a_image.png\" alt=\"image.png\" /></p>\n<p>选择创建的任务角色,网络模式选择主机。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/0be986e8949a48f983edc88a39d5b089_image.png\" alt=\"image.png\" /></p>\n<p>内存和 CPU 设置为 1024。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/4eafa9704a3f41f0949dd88746cc04c1_image.png\" alt=\"image.png\" /></p>\n<p>点击添加卷。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/83bc9a7d9f414757b22c7d3d7b088ac1_image.png\" alt=\"image.png\" /></p>\n<p>在弹出页面中添加 Amazon 访问凭证的径/root/.aws/credentials。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/931bb05be6d4462e849399bf25a696d3_image.png\" alt=\"image.png\" /></p>\n<p>点击添加容器,进入容器添加画面。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/6794f056eb824b2b8d7d80c669a36dbc_image.png\" alt=\"image.png\" /></p>\n<p>输入容器名和映像地址 public.ecr.aws/q3k3q7c1/aws-iot-greengrass-v2:latest。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/a96b29403c2540f0b8b71d76750e39c4_image.png\" alt=\"image.png\" /></p>\n<p>输入访问 Amazon 凭证及 PROVISION 环境变量,值为 true。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/0dd36826a5a74610aa3b79b50feeeb52_image.png\" alt=\"image.png\" /></p>\n<p>设置存储挂载点,选择挂载卷,输入容器中 Amazon 凭证的挂载路径 /root/.aws/credentials,完成任务定义。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/0e3dfebbc5ff4588b4949b26549788d4_image.png\" alt=\"image.png\" /></p>\n<p>也可以通过 JSON 文件配置任务,代码如下。</p>\n<pre><code class=\"lang-\">{\n "requiresCompatibilities": [\n "EXTERNAL"\n ],\n "containerDefinitions": [\n {\n "name": "greengrassv2",\n "image": "public.ecr.aws/q3k3q7c1/aws-iot-greengrass-v2:latest",\n "resourceRequirements": null,\n "essential": true,\n "portMappings": [],\n "environment": [\n {\n "name": "AWS_ACCESS_KEY_ID",\n "value": "<AWS_ACCESS_KEY_ID>"\n },\n {\n "name": "AWS_SECRET_ACCESS_KEY",\n "value": "<AWS_SECRET_ACCESS_KEY>"\n },\n {\n "name": "AWS_SESSION_TOKEN",\n "value": "<AWS_SESSION_TOKEN>"\n },\n {\n "name": "AWS_REGION",\n "value": "<AWS_REGION>"\n },\n {\n "name": "PROVISION",\n "value": "true"\n }\n ],\n "environmentFiles": [],\n "secrets": null,\n "mountPoints": [\n {\n "sourceVolume": "aws-credentials",\n "containerPath": "/root/.aws/credentials",\n "readOnly": ""\n }\n ],\n "volumesFrom": null,\n "hostname": null,\n "user": null,\n "workingDirectory": null,\n "extraHosts": null,\n "logConfiguration": null,\n "ulimits": null,\n "dockerLabels": null,\n "dependsOn": null,\n "repositoryCredentials": {\n "credentialsParameter": ""\n }\n }\n ],\n "volumes": [\n {\n "host": {\n "sourcePath": "/root/.aws/credentials"\n },\n "name": "aws-credentials"\n }\n ],\n "networkMode": "host",\n "memory": "1024",\n "cpu": "1024",\n "placementConstraints": [],\n "family": "greengrassv2",\n "taskRoleArn": "arn:aws:iam::804077508687:role/ECSTaskRole",\n "executionRoleArn": "arn:aws:iam::804077508687:role/ECSTaskRole",\n"tags": []\n}\n</code></pre>\n<h5><a id=\"523__210\"></a><strong>5.2.3 运行任务</strong></h5>\n<p>在 ECS 服务界面的任务子页签中,选择运行新任务。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/60e1f5d19ae445f4ba911196f157f973_image.png\" alt=\"image.png\" /></p>\n<p>启动类型选择 EXTERNAL。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/49b8ab12d5ec4438a2568d5b0202baf4_image.png\" alt=\"image.png\" /></p>\n<p>修改环境变量参数或保持任务定义的默认设置。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/cd2e5a0b91e846ff9a7e07229a83769e_image.png\" alt=\"image.png\" /></p>\n<p>启动任务,可以看到任务列表里在边缘服务器上运行新的 greengrass<br />\n任务。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/447257cc191a4f56859d623a90782d15_image.png\" alt=\"image.png\" /></p>\n<p>在 Amazon 控制台 IOT 的服务界面中,点击左侧导航菜单的Greengrass 的核心设备,可以看到刚才注册成功的 Greengrass 核心设备。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/e3ee7d4730da4affad4aa8a55abd7acf_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"53___233\"></a><strong>5.3 部署示例应用</strong></h4>\n<p>在本地终端,编写 Greengrass 组建 hello_world.py 脚本如下:</p>\n<pre><code class=\"lang-\">import sys\nimport datetime\n\nmessage = "Hello, %s! Current time: %s." % (sys.argv[1], datetime.datetime.now())\nmessage += " Greetings from your first Greengrass component."\n# Print the message to stdout.\nprint(message)\n\n# Append the message to the log file.\nwith open('/tmp/Greengrass_HelloWorld.log', 'a') as f:\n print(message, file=f)\n创建一个 S3存储桶用于存放 Greengrass 组件,存储桶名为 GREEGRASS-EXAMPLE-BUCKET。\n\naws s3 mb s3:// GREEGRASS-EXAMPLE-BUCKET \naws s3 cp hello_world.py \\\n s3://GREEGRASS-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py\n</code></pre>\n<p>设置 IAM 权限,允许核心设备的 ECSTaskRole 访问 S3 存储桶中的组件对象。</p>\n<p>从 Amazon 控制台进入 IoT 服务页面,点击 Greengrass 设备的组件,点击创建组件。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/bb65c910f56342188adec8801df0eb96_image.png\" alt=\"image.png\" /></p>\n<p>在创建组件页面中,选择 JSON 格式,输入组件配置信息。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/d120b93de5384c8fa54ab00e20e4c809_image.png\" alt=\"image.png\" /></p>\n<p>配置信息代码如下:</p>\n<pre><code class=\"lang-\">{\n "RecipeFormatVersion": "2020-01-25",\n "ComponentName": "com.example.HelloWorld",\n "ComponentVersion": "1.0.0",\n "ComponentDescription": "My first Greengrass component.",\n "ComponentPublisher": "Amazon",\n "ComponentConfiguration": {\n "DefaultConfiguration": {\n "Message": "world"\n }\n },\n "Manifests": [\n {\n "Platform": {\n "os": "linux"\n },\n "Lifecycle": {\n "Run": "python3 -u {artifacts:path}/hello_world.py '{configuration:/Message}'"\n },\n "Artifacts": [\n {\n "URI": "s3://GREENGRASS-DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py"\n }\n ]\n }\n ]\n}\n</code></pre>\n<p>在 Iot Greengrass 导航菜单,点击部署,进入部署页面。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/951ce218f4764fdf902aff2c85717531_image.png\" alt=\"image.png\" /></p>\n<p>输入部署名和,目标类型输入创建的 Greengrass 设备名,点击下一步。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/8404088e73cb42348f69a38343541815_image.png\" alt=\"image.png\" /></p>\n<p>选择已定义的 helloworld 组件,配置策略采用默认,完成部署创建。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/a9601f31157240f6a031ec1b63135dcb_image.png\" alt=\"image.png\" /></p>\n<p><img src=\"https://dev-media.amazoncloud.cn/0b041c62b30445468863609a63c4d823_image.png\" alt=\"image.png\" /></p>\n<p>部署完成后,可以在 Greengrass 设置的组件列表中看到已安装的组件。</p>\n<p>SSH 登录 Greengrass 设备,进入 Greengrass 容器,通过以下命令可以查看输出信息。</p>\n<p>tail -f /tmp/Greengrass_HelloWorld.log</p>\n<h3><a id=\"6__318\"></a><strong>6. 总结</strong></h3>\n<p>本文介绍了基于 ECS Anywhere 的 IoT 平台参考架构,利用 ECS Anywhere 在边缘设备上容器化部署 Greengrass,并在 Greengrass 上部署组件,而从简化边缘设备管理和应用部署,用户可基于此扩展功能、构建基于容器的云边一体 IoT 平台。</p>\n<h3><a id=\"_322\"></a><strong>本篇作者</strong></h3>\n<p><img src=\"https://dev-media.amazoncloud.cn/a058e9d1fe0e437289227f2999e41ec9_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"_326\"></a><strong>姜可</strong></h4>\n<p>亚马逊云科技资深解决方案架构师,负责协助客户业务系统上云的解决方案架构设计和咨询,现致力于 DevOps、IoT、机器学习相关领域的研究。在加入亚马逊云科技之前,曾在金融、制造、政府等行业耕耘多年,对相关行业解决方案和架构有很深的理解。</p>\n"}