在作为 Docker 容器 AWS IoT Greengrass V2 运行时部署容器化应用程序 - AWS 规范指引

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在作为 Docker 容器 AWS IoT Greengrass V2 运行时部署容器化应用程序

亚马逊 Web Services 的 Salih Bakir、Giuseppe Di Bella 和 Gustav Svalander

Summary

AWS IoT Greengrass Version 2,当部署为 Docker 容器时,本机不支持运行 Docker 应用程序容器。此模式向您展示如何基于启用 Docker-in-Docker (DinD) 功能的最新版本创建自定义容器镜像。 AWS IoT Greengrass V2 借助 DinD,您可以在环境中运行容器化应用程序。 AWS IoT Greengrass V2

您可以将此模式部署为独立解决方案,也可以将其与 Amazon ECS Anywhere 等容器编排平台集成。在这两种部署模式中,您都可以保持包括 AWS IoT SiteWise 边缘处理 AWS IoT Greengrass V2 功能在内的全部功能,同时支持基于容器的可扩展部署。

先决条件和限制

先决条件

  • 活跃 AWS 账户的.

  • 有关一般 AWS IoT Greengrass Version 2 先决条件,请参阅 AWS IoT Greengrass Version 2 文档中的先决条件

  • Docker Engine,在 Linux、macOS 或 Windows 上安装和配置。

  • Docker Compose(如果你使用 Docker Compose 命令行界面 (CLI) 来运行 Docker 镜像)。

  • 一个 Linux 操作系统。

  • 带有支持虚拟化的主机服务器的虚拟机管理程序。

  • 系统要求:

    • 2 GB 内存(最小值)

    • 5 GB 可用磁盘空间(最小)

    • 对于 AWS IoT SiteWise Edge,这是一款具有 16 GB 内存和 50 GB 可用磁盘空间的 x86_64 四核 CPU。有关 AWS IoT SiteWise 数据处理的更多信息,请参阅 AWS IoT SiteWise 文档中的数据处理包要求

产品版本

  • AWS IoT Greengrass Version 2 版本 2.5.3 或更高版本

  • Docker-in-Docker 版本 1.0.0 或更高版本

  • Docker Compose 版本 1.22 或更高版本

  • Docker Engine 版本 20.10.12 或更高版本

限制

架构

目标技术堆栈

  • 数据源 — 生成数据进行处理的物联网设备、传感器或工业设备

  • AWS IoT Greengrass V2— 作为具有 D-in-D功能的 Docker 容器运行,部署在边缘基础架构上

  • 容器化应用程序 — 作为嵌套 Docker 容器在 AWS IoT Greengrass V2 环境中运行的自定义应用程序

  • (可选)Amazon ECS Anywhere — 管理容器部署的 AWS IoT Greengrass V2 容器编排

  • 其他 AWS 服务 — AWS IoT Core AWS IoT SiteWise、以及其他 AWS 服务 用于数据处理和管理

目标架构

下图显示了使用 Amazon ECS Anywhere(一种容器管理工具)的目标部署架构示例。

使用 Amazon ECS Anywhere 部署架构。

下图显示了如下工作流:

1:容器映像存储 — Amazon ECR 存储边缘处理所需的容器映像和任何自定义应用程序容器。 AWS IoT Greengrass

23:容器部署 — Amazon ECS Anywhere 将 AWS IoT Greengrass 容器映像从 Amazon ECR 部署到边缘站点,管理容器生命周期和部署过程。

4:组件部署 — 已部署的 AWS IoT Greengrass 核心会根据其配置自动部署其相关组件。组件包括 AWS IoT SiteWise 容器化环境中的 Edge 和其他必要的边缘处理组件。

5:数据摄取 — 完全配置完毕后, AWS IoT Greengrass 开始从边缘位置的各种 IoT 数据源提取遥测和传感器数据。

6:数据处理和云集成 — 容器化 AWS IoT Greengrass 核心使用其部署的组件(包括用于工业数据的 AWS IoT SiteWise 边缘)在本地处理数据。然后,它将处理后的数据发送到 AWS Cloud 服务部门进行进一步分析和存储。

工具

AWS 服务

其他工具

  • Docker 是一组平台即服务(PaaS)产品,它们利用操作系统级的虚拟化技术在容器中提供软件。

  • Docker Compose 是一款工具,用于定义和运行多容器应用程序。

  • Docker Engin e 是一种开源容器化技术,用于构建和容器化应用程序。

代码存储库

此模式的代码可在 GitHub AWS IoT Greengrass v2 Docker-in-Docker 存储库中找到。

操作说明

Task说明所需技能

克隆并导航到存储库。

要克隆存储库,请使用以下命令:

git clone https://github.com/aws-samples/aws-iot-greengrass-v2-docker-in-docker.git

要导航到该docker目录,请使用以下命令:

cd aws-iot-greengrass-v2-docker-in-docker/docker

DevOps 工程师,AWS DevOps

构建 Docker 映像。

要使用默认(最新)版本构建 Docker 镜像,请运行以下命令:

docker build -t x86_64/aws-iot-greengrass:latest .

或者,要使用特定版本构建 Docker 镜像,请运行以下命令:

docker build --build-arg GREENGRASS_RELEASE_VERSION=2.12.0 -t x86_64/aws-iot-greengrass:2.12.0 .

要验证构建,请运行以下命令:

docker images | grep aws-iot-greengrass

 

AWS DevOps, DevOps 工程师,应用程序开发人员

(可选)推送到 Amazon ECR。

  1. 要创建存储库,请运行以下命令:

    aws ecr create-repository --repository-name aws-iot-greengrass-dind --region us-east-1

  2. 要进行身份验证,请运行以下命令:

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <ACCOUNT-ID>.dkr.ecr.us-east-1.amazonaws.com

  3. 要标记和推送,请运行以下命令:

    docker tag x86_64/aws-iot-greengrass:latest <ACCOUNT-ID>.dkr.ecr.us-east-1.amazonaws.com/aws-iot-greengrass-dind:latest

    docker push <ACCOUNT_ID>.dkr.ecr.us-east-1.amazonaws.com/aws-iot-greengrass-dind:latest

应用程序开发人员、AWS DevOps、 DevOps 工程师
Task说明所需技能

选择身份验证方法。

请选择以下选项之一:

  • 选项 1(推荐):IAM 角色 — 如果在亚马逊 EC2、亚马逊 ECS 或 Amazon EKS 上运行且具有适当的 IAM 角色,则使用。无需其他配置。

  • 选项 2:环境变量-用于测试和开发。

  • 选项 3:凭证文件-不建议用于生产环境。

  • 选项 4:旧版env.cfg文件。

AWS 管理员

配置身份验证方法。

对于您选择的身份验证方法,请使用以下配置指南:

  • 选项 2(环境变量)-准备AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY、和可选AWS_SESSION_TOKEN

  • 选项 3(凭证文件)-创建凭据目录和文件:

    • (a) 运行以下命令:

      mkdir -p ~/greengrass-v2-credentials

    • (b) 在以下位置创建以下文件~/greengrass-v2-credentials/credentials

      [default]

      aws_access_key_id=YourAccessKey

      aws_secret_access_key=YourSecretKey

    • (c) 按如下方式保护文件:

      chmod 600 ~/greengrass-v2-credentials/credentials

  • 选项 4 (env.cfg)-按如下方式在docker目录中创建env.cfg文件:

    GGC_ROOT_PATH=/greengrass/v2

    AWS_REGION=us-east-1

    PROVISION=true

    THING_NAME=MyGreengrassCore

    THING_GROUP_NAME=MyGreengrassCoreGroup

    TES_ROLE_NAME=GreengrassV2TokenExchangeRole

    TES_ROLE_ALIAS_NAME=GreengrassCoreTokenExchangeRoleAlias

    COMPONENT_DEFAULT_USER=ggc_user:ggc_group

AWS 管理员
Task说明所需技能

Configure docker-compose.yml

使用环境变量更新docker-compose.yml文件,如下所示:

  • 关键变量:PROVISION,AWS_REGIONTHING_NAMETHING_GROUP_NAMETES_ROLE_NAMETES_ROLE_ALIAS_NAME

  • 对于通过环境变量获得的证书,请取消注释以下内容:

    environment:

    - AWS_ACCESS_KEY_ID=YourKey

    - AWS_SECRET_ACCESS_KEY=YourSecret

  • 对于凭证文件,请取消对以下内容的注释:

    volumes:

    - ~/greengrass-v2-credentials:/root/.aws/:ro

  • 对于日志持久性,请添加以下内容:

    volumes:

    - ./logs:/greengrass/v2/logs

DevOps 工程师

启动并验证容器。

要从前台开始,请运行以下命令:

docker-compose up --build

或者,要在后台启动,请运行以下命令:

docker-compose up --build -d

要验证状态,请运行以下命令:

docker-compose ps

要监控日志,请运行以下命令:

docker-compose logs -f

DevOps 工程师
Task说明所需技能

使用 Docker CLI 运行容器。

  • 要在不进行预配置的情况下启动基本运行,请运行以下命令:

    docker run --init --privileged -it --name aws-iot-greengrass x86_64/aws-iot-greengrass:latest

  • 要使用环境变量启动运行,请运行以下命令:

    docker run --init --privileged -it --name aws-iot-greengrass -e PROVISION=true -e AWS_REGION=us-east-1 -e AWS_ACCESS_KEY_ID=YourKey -e AWS_SECRET_ACCESS_KEY=YourSecret -e THING_NAME=MyGreengrassCore -e THING_GROUP_NAME=MyGreengrassCoreGroup -p 8883:8883 x86_64/aws-iot-greengrass:latest

  • 要使用凭据文件启动运行,请运行以下命令:

    docker run --init --privileged -it --name aws-iot-greengrass -v ~/greengrass-v2-credentials:/root/.aws:ro -e PROVISION=true -e AWS_REGION=us-east-1 -e THING_NAME=MyGreengrassCore -p 8883:8883 x86_64/aws-iot-greengrass:latest

  • 要使用env.cfg文件启动运行,请运行以下命令:

    docker run --init --privileged -it --name aws-iot-greengrass -v ~/greengrass-v2-credentials:/root/.aws:ro --env-file env.cfg -p 8883:8883 x86_64/aws-iot-greengrass:latest

  • 要使用永久日志启动运行,请运行以下命令:

    docker run --init --privileged -it --name aws-iot-greengrass -v \$(pwd)/logs:/greengrass/v2/logs x86_64/aws-iot-greengrass:latest

DevOps 工程师

验证容器。

  • 要检查容器的状态,请运行以下命令:

    docker ps | grep aws-iot-greengrass

  • 要监控日志,请运行以下命令:

    docker logs -f aws-iot-greengrass

DevOps 工程师
Task说明所需技能

部署应用程序。

  • 要部署应用程序容器,请运行以下命令:

    docker run -d --name my-app nginx:alpine

  • 要验证部署,请运行以下命令:

    docker ps

  • 要访问日志,请运行以下命令:

    cd /greengrass/v2/logs && cat greengrass.log

应用程序开发人员

访问和测试 Docker-in-Docker。

  1. 要在容器中打开外壳,请运行以下命令:

    docker exec -it aws-iot-greengrass sh

  2. 要验证 Docker,请运行以下命令:

    docker --version

    docker ps

  3. 要进行测试 Docker-in-Docker,请运行以下命令:

    docker run --rm hello-world

DevOps 工程师
Task说明所需技能

设置 Amazon ECS 集群。

  • 要创建 Amazon ECS 集群,请运行以下命令:

    aws ecs create-cluster --cluster-name greengrass-cluster --region us-east-1

  • 要创建 SSM 激活,请运行以下命令:

    aws ssm create-activation --default-instance-name greengrass-edge --iam-role GreengrassECSAnywhereRole --registration-limit 10 --region us-east-1

  • 要在边缘设备上安装 SSM 代理,请运行以下命令:

    curl -o install.sh https://s3.amazonaws.com/aws-ssm-downloads/latest/linux_amd64/install.sh

    chmod +x install.sh

    ./install.sh activation-code activation-id us-east-1

AWS 管理员

部署 Amazon ECS 任务。

  • greengrass-task-definition.json使用任务配置进行创建,包括containerDefinitions使用privileged:true、环境变量/var/lib/docker/greengrass/v2.Register任务的卷装载。运行如下命令:

    aws ecs register-task-definition --cli-input-json file://greengrass-task-definition.json

  • 要创建服务,请运行以下命令:

    aws ecs create-service --cluster greengrass-cluster --service-name greengrass-service --task-definition greengrass-dind --desired-count 1 --launch-type EXTERNAL --region us-east-1

  • 要验证部署,请运行以下命令:

    aws ecs describe-services --cluster greengrass-cluster --services greengrass-service --region us-east-1

AWS 管理员
Task说明所需技能

停止容器。

  • 要使用 Docker Compose 停止容器,请运行以下命令:

    docker-compose stop

    docker-compose down

    docker-compose down -v

  • 要使用 Docker CLI 停止容器(移除卷),请运行以下命令:

    docker stop aws-iot-greengrass

    docker rm aws-iot-greengrass

  • 要使用强制移除来停止容器,请运行以下命令:

    docker rm -f aws-iot-greengrass

DevOps 工程师

问题排查

问题解决方案

容器启动失败,出现权限错误。

  1. 要确保容器使用所需的--privileged标志运行 Docker-in-Docker,请运行以下命令:

    docker run --init --privileged -it --name aws-iot-greengrass x86_64/aws-iot-greengrass:latest

  2. docker-compose.yml文件中,设置以下内容:

    privileged: true

警告

--privileged向容器授予扩展权限。

由于凭据错误,置备失败。

要验证凭据配置是否正确,请使用以下步骤:

  1. 检查 IAM 角色:

    aws sts get-caller-identity

  2. 验证环境变量:

    docker exec -it aws-iot-greengrass sh -c 'echo \$AWS_ACCESS_KEY_ID'

  3. 检查凭证文件:

    docker exec -it aws-iot-greengrass sh -c 'cat /root/.aws/credentials'

确保 IAM 权限包括iot:CreateThingiot:CreatePolicyiot:AttachPolicyiam:CreateRole、和iam:AttachRolePolicy

无法连接到容器内的 Docker 守护程序。

  1. 检查 Docker 守护程序的状态:

    docker exec -it aws-iot-greengrass sh -c 'ps aux | grep dockerd'

  2. 验证 Docker 套接字是否存在:

    docker exec -it aws-iot-greengrass sh -c 'ls -la /var/run/docker.sock'

  3. 如果需要,可以手动启动:

    docker exec -it aws-iot-greengrass sh -c 'dockerd > /var/log/docker.log 2>&1 &'

容器的磁盘空间不足。

  1. 检查磁盘空间:

    df -h

  2. 清理 Docker 资源:

    docker system prune -a --volumes

  3. 移除旧的 Greengrass 神器:

    docker exec -it aws-iot-greengrass sh -c 'rm -rf /greengrass/v2/work/*'

确保最小磁盘空间:5 GB 用于基本操作,50 GB 用于 AWS IoT SiteWise 边缘操作

构建问题。

  1. 确保你在docker目录中:

    cd docker && pwd

  2. 验证是否Dockerfile存在:

    ls -la Dockerfile

  3. 检查 Docker 是否已安装并正在运行:

    docker --version && docker ps

网络连接问题。

  1. 测试 DNS 解析:

    docker exec -it aws-iot-greengrass sh -c 'nslookup google.com'

  2. 测试 AWS 连通性:

    docker exec -it aws-iot-greengrass sh -c 'curl https://iot.us-east-1.amazonaws.com'

验证防火墙是否允许出站 HTTPS (443) 和 MQTT (8883) 流量。

Greengrass 组件无法部署。

  1. 查看 Greengrass 日志:

    docker exec -it aws-iot-greengrass sh -c 'cat /greengrass/v2/logs/greengrass.log'

  2. 验证 TES 角色配置:

    aws iot describe-role-alias --role-alias TES_ROLE_ALIAS_NAME

检查目录中特定于组件的/greengrass/v2/logs/日志。

容器启动后立即退出。

  1. 检查容器日志中是否存在错误:

    docker logs aws-iot-greengrass

  2. 使用交互式 shell 运行以进行调试:

    docker run --init --privileged -it --entrypoint sh x86_64/aws-iot-greengrass:latest

验证是否正确设置了所有必需的环境变量PROVISION=true。确保在启动容器时使用该--init标志。

相关资源

AWS resources

其他资源

附加信息

  • 要进行 AWS IoT SiteWise 边缘数据处理,Docker 必须在 AWS IoT Greengrass 环境中可用。

  • 要运行嵌套容器,必须使用管理员级别的凭 AWS IoT Greengrass 据运行该容器。