使用 AWS IoT Greengrass 管理 Docker 容器生命周期
关键要点
在这篇文章中,我们将讨论如何使用 AWS IoT Greengrass 的自定义组件来管理 Docker 容器的生命周期。Docker 容器共有五个生命周期阶段:创建、运行、暂停/恢复、停止和杀死。AWS IoT Greengrass 允许将这些容器与 AWS 服务或第三方服务连接,可以通过 MQTT 消息与 Docker Engine 互动,执行各种命令。
引言
在这篇文章中,我们将讨论如何使用 AWS IoT Greengrass 的自定义组件 来管理 Docker 容器的生命周期。Docker 容器的生命周期包含五个阶段:创建、运行、暂停/恢复、停止和杀死。自定义组件通过 Docker SDK for Python 与 Docker Engine 交互,根据用户发出的命令或应用程序发送的命令来管理容器进程。
AWS IoT Greengrass 是一个开源的物联网IoT边缘运行时和云服务,帮助您在设备上构建、部署和管理 IoT 应用程序。您可以使用 AWS IoT Greengrass 构建边缘应用,利用预构建的软件模块称为组件,将边缘设备连接到 AWS 服务或第三方服务。
AWS IoT Greengrass 组件 可以表示应用程序、运行时安装程序、库或任何您希望在设备上运行的代码。您可以配置 AWS IoT Greengrass 组件,从以下位置运行 Docker 容器:
存储位置描述Amazon Elastic Container Registry公共和私有镜像库公共 Docker Hub默认的公共 Docker 镜像库公共 Docker Trusted Registry受信任的公共 Docker 镜像库Amazon S3 桶AWS 的对象存储服务虽然 Greengrass 组件有自己的 生命周期 可供交互,但这些生命周期并不支持容器化进程。为了启动、停止、暂停和恢复在 AWS IoT Greengrass 上运行的 Docker 容器,您可以使用 Docker 的 pause 和 unpause 命令,通过在 Greengrass 核心设备上运行的 Greengrass 组件来完成。我们将称这个自定义生命周期组件为“生命周期组件”,它包含一个 Python 脚本,该脚本订阅 AWS IoT Core 的 MQTT 主题并与 Docker Engine 进行交互。
解决方案概述
以下是一个可能实现的工作流和架构示例。有了这些构建模块,您可以进一步扩展以适应您的特定用例。
用户在 Greengrass 核心设备上部署一个 Docker 容器组件和生命周期组件。应用程序向 AWS IoT Core 主题发布一个 MQTT 消息。该消息指定容器名称和要执行的操作。在这个示例中,我们向名为 env 的容器发送启动命令。自定义生命周期组件订阅了该主题。生命周期组件接收消息后,通过 Docker SDK for Python 与 Docker Engine 交互,并在指定的容器名称上执行所需命令。根据生命周期组件接收到的命令,Docker Engine 将暂停、恢复、启动或停止指定的容器。解决方案示意图
实施说明
前提条件
已安装并配置 AWS CLI。在您的设备上安装了 AWS Greengrass Core 安装说明。已安装并运行 Docker Engine。将 Docker 容器部署到 Greengrass Core 设备
请按照以下说明 运行 Docker 容器 的步骤,使用 AWS Greengrass,或者选择直接使用 Docker Engine 创建和运行容器。请确保为容器提供一个名称,这里我们使用 env 作为名称。
确保您的 Docker 容器正在运行,并且名称正确:
bashdocker container ls
创建自定义生命周期组件
为了创建 Greengrass 组件,我们需要编写包含代码的 Python 脚本,并定义一个 Greengrass 配方,以指定组件部署到 Greengrass Core 设备时的详细信息。
创建一个空文件夹和脚本文件 customlifecyclepy。
bashmkdir p /artifacts ampamp touch /artifacts/customlifecyclepy
在您喜欢的集成开发环境IDE中,打开 customlifecyclepy,并粘贴以下代码。确保保存文件。注意:以下代码片段在 MIT0 许可证下发布,可在 Github 找到。
python
Imports
import timeimport jsonimport tracebackimport dockerimport subprocessimport awsiotgreengrasscoreipcimport awsiotgreengrasscoreipcclient as clientfrom awsiotgreengrasscoreipcmodel import ( IoTCoreMessage QOS SubscribeToIoTCoreRequest)
TIMEOUT = 10ipcclient = awsiotgreengrasscoreipcconnect()topic = dockerqos = QOSATMOSTONCE
IPC Stream Handler
class StreamHandler(clientSubscribeToIoTCoreStreamHandler) def init(self) super()init()
def onstreamevent(self event IoTCoreMessage) gt None message = jsonloads(eventmessagepayloaddecode()) try client = dockerfromenv() name = message[name] command = message[command] if command == start container = clientcontainersget(name) containerstart() print(Starting container name) elif command == pause container = clientcontainersget(name) result = jsonloads(containerpause()) print(result) print(Pausing container name) elif command == unpause container = clientcontainersget(name) print(containerunpause()) print(Unpausing container name) elif command == stop container = clientcontainersget(name) containerstop() print(Stopping container name) else print(Error) except with tempfileTemporaryFile() as tmp tmpwrite(Docker Error)def onstreamerror(self error Exception) gt bool messagestring = Error! return Truedef onstreamclosed(self) gt None pass
Initiate Subscription
request = SubscribeToIoTCoreRequest()requesttopicname = topicrequestqos = qoshandler = StreamHandler()operation = ipcclientnewsubscribetoiotcore(handler)future = operationactivate(request)futureresponse = operationgetresponse()futureresponseresult(TIMEOUT)
while True timesleep(1)
operationclose()
创建一个桶,并使用以下命令获取桶的名称。
bashEPOCHTIME=(date s) ampamp S3BUCKET=lifecyclecomponentEPOCHTIME ampamp aws s3 mb s3//S3BUCKET
执行以下命令创建一个文件夹和文件以存放配方。
bashmkdir p /recipes ampamp touch /recipes/customlifecycle100json
打开创建的配方文件 customlifecycle100json,粘贴以下内容。用第3步中获取的桶名称替换 [YOUR BUCKET NAME]。
json{ RecipeFormatVersion 20200125 ComponentName Dockerlifecyclecomponent ComponentVersion 100 ComponentType awsgreengrassgeneric ComponentDescription 与 Docker 守护进程交互的组件。 ComponentPublisher Amazon ComponentConfiguration { DefaultConfiguration { accessControl { awsgreengrassipcmqttproxy { dockerlifecyclemqttproxy1 { policyDescription 允许访问订阅所有主题。 operations [ awsgreengrass#SubscribeToIoTCore ] resources [ ] } } } } } Manifests [ { Lifecycle { Install pip3 install awsiotsdk Run python3 u {artifactspath}/customlifecyclepy } Artifacts [ { Uri s3//[YOUR BUCKET NAME]/customlifecyclepy } ] } ]}
将组件工件上传到 Amazon 简单存储服务S3。
bashaws s3 cp recursive /artifacts/ s3//S3BUCKET/
然后,通过执行以下命令发布 Greengrass 组件。
bashcd /recipes ampamp aws greengrassv2 createcomponentversion inlinerecipe fileb//customlifecycle100json
您现在可以在 AWS IoT 控制台 gt Greengrass gt 组件 gt 我的组件 中查看此组件。
部署自定义生命周期组件
现在我们将使用 AWS CLI 将自定义生命周期组件部署到 Greengrass Core 设备。部署可以直接应用于物体或物体组。在此情况下,我们将直接将部署应用于 Greengrass Core 物体实体。
小熊加速器官网下载安装创建一个部署清单文件夹和文件,使用以下命令。
bashmkdir p /deployments ampamp touch /deployments/ggdeploymentjson
在您的 IDE 中,将以下内容复制并粘贴到 ggdeploymentjson 文件中。用 [targetARN] 替换您的 Thing ARN。您可以从 AWS IoT Core 控制台获取 Thing ARN。确保保存文件。
json{ targetArn [targetArn] deploymentName 自定义 Docker 生命周期的部署 components { Dockerlifecyclecomponent { componentVersion 100 } }}
使用以下命令创建部署。
bashcd /deployments ampamp aws greengrassv2 createdeployment cliinputjson file//ggdeploymentjson

验证组件现在是否在您的 Greengrass Core 设备上运行。可能需要几分钟才能初始化。
bashsudo /greengrass/v2/bin/greengrasscli component list
测试自定义生命周期组件
前往 AWS IoT Core 控制台,选择 MQTT 测试客户端。选择 发布到主题。在 主题名称 中输入 docker。在 消息有效负载 中,粘贴以下消息。命令语法将根据您容器的名称和当前状态而有所不同。
json{ commandstart nameenv}
验证容器的状态是否已更改。
bashdocker container ls
结论
在这篇博文中,我们探讨了如何使用 AWS IoT Greengrass 控制 Docker 容器的生命周期。这是通过一个自定义组件实现的,该组件订阅 AWS IoT Core 的 MQTT 主题,并利用消息内容对 Docker 守护进程执行命令。
要深入了解 AWS IoT Greengrass,包括如何构建 Greengrass 组件,请查看我们的 AWS IoT Greengrass V2 工作坊!
标签: AWS IoT AWS IoT Greengrass 物联网 IoT IoT 边缘