View a markdown version of this page

在做為 Docker 容器 AWS IoT Greengrass V2 執行時部署容器化應用程式 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在做為 Docker 容器 AWS IoT Greengrass V2 執行時部署容器化應用程式

Salih Bakir、Giuseppe Di Bella 和 Gustav Svalander,Amazon Web Services

總結

AWS IoT Greengrass Version 2作為 Docker 容器部署時, 原生不支援執行 Docker 應用程式容器。此模式示範如何根據 AWS IoT Greengrass V2 啟用 Docker-in-Docker (DinD) 功能的最新版本 建立自訂容器映像。使用 DinD,您可以在 AWS IoT Greengrass V2 環境中執行容器化應用程式。

您可以將此模式部署為獨立的解決方案,或將其與 Amazon ECS Anywhere 等容器協同運作平台整合。在任一部署模型中,您維護包括 AWS IoT SiteWise Edge 處理功能的完整 AWS IoT Greengrass V2 功能,同時啟用可擴展的容器型部署。

先決條件和限制

先決條件

  • 作用中 AWS 帳戶。

  • 如需一般 AWS IoT Greengrass Version 2 先決條件,請參閱 AWS IoT Greengrass Version 2 文件中的先決條件

  • 在 Linux、macOS 或 Windows 上安裝和設定 Docker Engine。

  • Docker Compose (如果您使用 Docker Compose 命令列界面 (CLI) 來執行 Docker 映像)。

  • Linux 作業系統。

  • 具有支援虛擬化之主機伺服器的 Hypervisor。

  • 系統需求:

    • 2 GB RAM (最低)

    • 5 GB 的可用磁碟空間 (最低)

    • 對於 AWS IoT SiteWise Edge,具有 16 GB RAM 和 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 引擎 20.10.12 版或更新版本

限制

Architecture

目標技術堆疊

  • 資料來源 – 產生資料處理資料的 IoT 裝置、感應器或工業設備

  • 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 是一種容器管理工具。

使用 Amazon ECS Anywhere 的部署架構。

該圖顯示以下工作流程:

1:容器映像儲存 – Amazon ECR 會存放 AWS IoT Greengrass 容器映像和邊緣處理所需的任何自訂應用程式容器。

2 3:容器部署 – 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 Edge) 在本機處理資料。然後,它會將處理的資料傳送至 AWS 雲端 服務,以進一步分析和儲存。

工具

AWS 服務

其他工具

  • Docker 是一組平台即服務 (PaaS) 產品,可在作業系統層級使用虛擬化在容器中交付軟體。

  • Docker Compose 是一種用於定義和執行多容器應用程式的工具。

  • Docker Engine 是一種開放原始碼容器化技術,用於建置和容器化應用程式。

程式碼儲存庫

此模式的程式碼可在 GitHub AWS IoT Greengrass v2 Docker-in-Docker 儲存庫中使用。

史詩

任務Description所需的技能

複製並導覽至儲存庫。

若要複製儲存庫,請使用下列命令:

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 工程師
任務Description所需的技能

選取身分驗證方法。

請選擇下列其中一個選項:

  • 選項 1 (建議):IAM 角色 – 如果在具有適當 IAM 角色的 Amazon EC2、Amazon ECS 或 Amazon EKS 上執行,請使用 。不需要額外的組態。

  • 選項 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 管理員
任務Description所需的技能

設定 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 工程師
任務Description所需的技能

使用 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 工程師
任務Description所需的技能

部署應用程式。

  • 若要部署應用程式容器,請執行下列命令:

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

  • 若要驗證部署,請執行下列命令:

    docker ps

  • 若要存取日誌,請執行下列命令:

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

應用程式開發人員

存取和測試 Docker-in-Docker。

  1. 若要在容器中開啟 Shell,請執行下列命令:

    docker exec -it aws-iot-greengrass sh

  2. 若要驗證 Docker,請執行下列命令:

    docker --version

    docker ps

  3. 若要測試 Docker-in-Docker,請執行下列命令:

    docker run --rm hello-world

DevOps 工程師
任務Description所需的技能

設定 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 Agent,請執行下列命令:

    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 管理員
任務Description所需的技能

停止容器。

  • 若要使用 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. 若要確保容器使用 Docker-in-Docker 所需的 --privileged旗標執行,請執行下列命令:

    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:CreatePolicyiam:CreateRoleiot:AttachPolicyiam: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, AWS IoT SiteWise 邊緣為 50 GB

建置問題。

  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 Edge 資料處理,Docker 必須在 AWS IoT Greengrass 環境中可用。

  • 若要執行巢狀容器,您必須使用管理員層級登入資料執行 AWS IoT Greengrass 容器。