使用 AWS CDK 和 GitLab 在 Amazon ECS Anywhere 上設定混合工作負載的 CI/CD 管道 - AWS 方案指引

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

使用 AWS CDK 和 GitLab 在 Amazon ECS Anywhere 上設定混合工作負載的 CI/CD 管道

由 Rahul Sharad Gaikwad 醫生 (AWS) 建立

Summary

注意:AWS CodeCommit 不再提供給新客戶。AWS CodeCommit 的現有客戶可以繼續正常使用服務。進一步了解

Amazon ECS Anywhere 是 Amazon Elastic Container Service (Amazon ECS) 的延伸。它支援向 Amazon ECS 叢集註冊外部執行個體,例如現場部署伺服器或虛擬機器 (VM)。 功能有助於降低成本並減輕複雜的本機容器協同運作和操作。您可以使用 ECS Anywhere 在內部部署和雲端環境中部署和執行容器應用程式。它消除了您的團隊學習多個網域和技能集,或自行管理複雜軟體的需求。

此模式描述使用 step-by-step方法。 Amazon ECS Anywhere 然後,您可以使用 AWS CodePipeline 來設定持續整合和持續部署 (CI/CD) 管道。然後,您將 GitLab 程式碼儲存庫複寫至 AWS CodeCommit,並在 Amazon ECS 叢集上部署容器化應用程式。

此模式旨在協助使用現場部署基礎設施來執行容器應用程式,並使用 GitLab 管理應用程式程式碼庫的人員。您可以使用 AWS 雲端服務來管理這些工作負載,而不會干擾現有的現場部署基礎設施。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • 在內部部署基礎設施上執行的容器應用程式。

  • 您管理應用程式程式碼庫的 GitLab 儲存庫。如需詳細資訊,請參閱儲存庫 (GitLab)。

  • 安裝並設定 AWS Command Line Interface (AWS CLI)。如需詳細資訊,請參閱安裝或更新最新版本的 AWS CLI (AWS CLI 文件)。

  • AWS CDK Toolkit,全域安裝和設定。如需詳細資訊,請參閱安裝 AWS CDK (AWS CDK 文件)。

  • npm,在 TypeScript 中為 AWS CDK 安裝和設定。如需詳細資訊,請參閱下載並安裝 Node.js 和 npm (npm 文件)。

限制

產品版本

  • AWS CDK Toolkit 2.27.0 版或更新版本

  • npm 7.20.3 版或更新版本

  • Node.js 16.6.1 版或更新版本

架構

目標技術堆疊

  • AWS CDK

  • AWS CloudFormation

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Amazon ECS Anywhere

  • Amazon Elastic Container Registry (Amazon ECR)

  • AWS Identity and Access Management (IAM)

  • AWS System Manager

  • GitLab 儲存庫

目標架構

設定 Amazon ECS 叢集和 CI/CD 管道的架構圖。

此圖表代表此模式中描述的兩個主要工作流程,佈建 Amazon ECS 叢集並設定 CI/CD 管道,以設定和部署 CI/CD 管道,如下所示:

  1. 佈建 Amazon ECS 叢集

    1. 當您部署第一個 AWS CDK 堆疊時,它會在 AWS 上建立 CloudFormation 堆疊。

    2. 此 CloudFormation 堆疊會佈建 Amazon ECS 叢集和相關的 AWS 資源。

    3. 若要向 Amazon ECS 叢集註冊外部執行個體,您必須在 VM 上安裝 AWS Systems Manager Agent (SSM Agent),並將 VM 註冊為 AWS Systems Manager 受管執行個體。 

    4. 您還必須在 VM 上安裝 Amazon ECS 容器代理程式和 Docker,以向 Amazon ECS 叢集將其註冊為外部執行個體。

    5. 使用 Amazon ECS 叢集註冊和設定外部執行個體時,它可以在您的 VM 上執行多個容器,其已註冊為外部執行個體。

    6. Amazon ECS 叢集處於作用中狀態,可以透過容器執行應用程式工作負載。Amazon ECS Anywhere 容器執行個體會在內部部署環境中執行,但與雲端中的 Amazon ECS 叢集相關聯。

  2. 設定和部署 CI/CD 管道

    1. 當您部署第二個 AWS CDK 堆疊時,它會在 AWS 上建立另一個 CloudFormation 堆疊。

    2. 此 CloudFormation 堆疊會在 CodePipeline 和相關的 AWS 資源中佈建管道。

    3. 您可以將應用程式程式碼變更推送並合併至內部部署 GitLab 儲存庫。 

    4. GitLab 儲存庫會自動複寫至 CodeCommit 儲存庫。

    5. CodeCommit 儲存庫的更新會自動啟動 CodePipeline。 

    6. CodePipeline 從 CodeCommit 複製程式碼,並在 CodeBuild 中建立可部署的應用程式建置。

    7. CodePipeline 會建立 CodeBuild 組建環境的 Docker 映像,並將其推送至 Amazon ECR 儲存庫。

    8. CodePipeline 會啟動 CodeDeploy 動作,從 Amazon ECR 儲存庫提取容器映像。

    9. CodePipeline 在 Amazon ECS 叢集上部署容器映像。

自動化和擴展

此模式使用 AWS CDK 做為基礎設施做為程式碼 (IaC) 工具來設定和部署此架構。AWS CDK 可協助您協調 AWS 資源,並設定 Amazon ECS Anywhere 和 CI/CD 管道。

工具

AWS 服務

其他工具

  • Node.js 是一種事件驅動的 JavaScript 執行期環境,旨在建置可擴展的網路應用程式。

  • npm 是在 Node.js 環境中執行的軟體登錄檔,用於共用或借用套件和管理私有套件的部署。

  • Vagrant 是一種開放原始碼公用程式,用於建置和維護可攜式虛擬軟體開發環境。基於示範目的,此模式使用 Vagrant 來建立內部部署 VM。

程式碼儲存庫

此模式的程式碼可在 Amazon ECS Anywhere 的 GitHub CI/CD 管道中使用 AWS CDK 儲存庫。 Amazon ECS Anywhere

最佳實務

部署此模式時,請考慮下列最佳實務:

史詩

任務描述所需的技能

驗證 AWS CDK 版本。

輸入下列命令來驗證 AWS CDK Toolkit 的版本。

cdk --version

此模式需要 2.27.0 版或更新版本。如果您有較舊的版本,請遵循 AWS CDK 文件中的指示進行更新。

DevOps 工程師

驗證 npm 版本。

輸入下列命令來驗證 npm 的版本。

npm --version

此模式需要 7.20.3 版或更新版本。如果您有較舊的版本,請遵循 npm 文件中的指示進行更新。

DevOps 工程師

設定 AWS 登入資料。

輸入 aws configure命令並遵循提示來設定 AWS 登入資料。

$aws configure AWS Access Key ID [None]: <your-access-key-ID> AWS Secret Access Key [None]: <your-secret-access-key> Default region name [None]: <your-Region-name> Default output format [None]:
DevOps 工程師
任務描述所需的技能

複製 AWS CDK 程式碼儲存庫。

  1. 輸入下列命令,針對此模式使用 AWS CDK 儲存庫複製 Amazon ECS Anywhere 的 CI/CD 管道

    git clone https://github.com/aws-samples/amazon-ecs-anywhere-cicd-pipeline-cdk-sample.git
  2. 輸入下列命令,導覽至複製的目錄。

    cd amazon-ecs-anywhere-cicd-pipeline-cdk-sample
DevOps 工程師

引導環境。

輸入下列命令,將 CloudFormation 範本部署至您想要使用的帳戶和 AWS 區域。

cdk bootstrap <account-number>/<Region>

如需詳細資訊,請參閱 AWS CDK 文件中的引導

DevOps 工程師
任務描述所需的技能

安裝套件相依性並編譯 TypeScript 檔案。

輸入下列命令來安裝套件相依性並編譯 TypeScript 檔案。

$cd EcsAnywhereCdk $npm install $npm fund

這些命令會從範例儲存庫安裝所有套件。如需詳細資訊,請參閱 npm 文件中的 npm ci 和 npm 安裝。如果您在輸入這些命令時收到有關遺失套件的任何錯誤,請參閱此模式的故障診斷一節。

DevOps 工程師

建置專案。

若要建置專案程式碼,請輸入下列命令。

npm run build

如需建置和部署專案的詳細資訊,請參閱 AWS CDK 文件中的您的第一個 AWS CDK 應用程式

DevOps 工程師

部署 Amazon ECS Anywhere 基礎設施堆疊。

  1. 輸入下列命令來列出堆疊。

    $cdk list
  2. 確認輸出傳回 EcsAnywhereInfraStackECSAnywherePipelineStack堆疊。

  3. 輸入下列命令來部署EcsAnywhereInfraStack堆疊。

    $cdk  deploy EcsAnywhereInfraStack
DevOps 工程師

驗證堆疊建立和輸出。

  1. 登入 AWS 管理主控台,然後開啟位於 https://console.aws.amazon.com/cloudformation/ 的 CloudFormation 主控台。

  2. 堆疊頁面上,選取EcsAnywhereInfraStack堆疊。

  3. 確認堆疊狀態為 CREATE_IN_PROGRESSCREATE_COMPLETE

    設定 Amazon ECS 叢集可能需要一些時間。在堆疊建立完成之前,請勿繼續。

DevOps 工程師
任務描述所需的技能

設定您的 VM。

從 Vagrantfile 所在的根目錄輸入 vagrant up命令,以建立 Vagrant VM。如需詳細資訊,請參閱 Vagrant 文件

DevOps 工程師

將您的 VM 註冊為外部執行個體。

  1. 使用 vagrant ssh命令登入 Vagrant VM。如需詳細資訊,請參閱 Vagrant 文件

  2. 遵循 AWS CLI 安裝說明,並輸入下列命令,在 VM 上安裝 AWS CLI。 

    $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" \ > -o "awscliv2.zip" $sudo apt install unzip $unzip awscliv2.zip $sudo ./aws/install $aws configure AWS Access Key ID [None]: <your-access-key-ID> AWS Secret Access Key [None]: <your-secret-access-key> Default region name [None]: <your-Region-name> Default output format [None]:
  1. 建立啟用代碼和 ID,您可以用來向 AWS Systems Manager 註冊 VM,以及啟用外部執行個體。此命令的輸出包含啟用 ID 和啟用代碼值。

    aws ssm create-activation \ > --iam-role EcsAnywhereInstanceRole \ > | tee ssm-activation.json

    如果您在執行此命令時收到錯誤,請參閱疑難排解一節。

  2. 匯出啟用 ID 和程式碼值。

    export ACTIVATION_ID=<activation-ID> export ACTIVATION_CODE=<activation-code>
  3. 將安裝指令碼下載到您的 VM。

    curl --proto "https" -o "ecs-anywhere-install.sh" \ > "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh"
  4. 在 VM 上執行安裝指令碼。

    sudo bash ecs-anywhere-install.sh \ --cluster EcsAnywhereCluster \ --activation-id $ACTIVATION_ID \ --activation-code $ACTIVATION_CODE \ --region <region-name>

這會設定您的 VM 是 Amazon ECS Anywhere 外部執行個體,並在 Amazon ECS 叢集中註冊執行個體。如需詳細資訊,請參閱 Amazon ECS 文件中的向叢集註冊外部執行個體。如果您遇到任何問題,請參閱故障診斷一節。

DevOps 工程師

驗證 Amazon ECS Anywhere 和外部 VM 的狀態。

若要驗證您的 VM 是否已連線至 Amazon ECS 控制平面並執行,請使用下列命令。

$aws ssm describe-instance-information $aws ecs list-container-instances --cluster $CLUSTER_NAME
DevOps 工程師
任務描述所需的技能

在 CodeCommit 儲存庫中建立分支。

透過建立儲存庫的第一個遞交,在 CodeCommit 儲存庫main中建立名為 的分支。您可以遵循 AWS 文件在 CodeCommit 中建立遞交。下列是範例命令。

aws codecommit put-file \ --repository-name EcsAnywhereRepo \ --branch-name main \ --file-path README.md \ --file-content "Test" \ --name "Dev Ops" \ --email "devops@example.com" \ --commit-message "Adding README."
DevOps 工程師

設定儲存庫鏡像。

您可以在外部來源之間鏡像 GitLab 儲存庫。您可以選擇哪個儲存庫做為來源。分支、標籤和遞交會自動同步。在託管應用程式的 GitLab 儲存庫和 CodeCommit 儲存庫之間設定推送鏡。如需說明,請參閱設定從 GitLab 到 CodeCommit 的推播鏡 (GitLab 文件)。

注意

根據預設,鏡像會自動同步儲存庫。如果您想要手動更新儲存庫,請參閱更新鏡像 (GitLab 文件)。

DevOps 工程師

部署 CI/CD 管道堆疊。

輸入下列命令來部署EcsAnywherePipelineStack堆疊。

$cdk deploy EcsAnywherePipelineStack
DevOps 工程師

測試 CI/CD 管道。

  1. 進行應用程式程式碼變更,並將其推送至來源內部部署 GitLab 儲存庫。如需詳細資訊,請參閱推送選項 (GitLab 文件)。例如,編輯 ../application/index.html 檔案以更新應用程式版本值。

  2. 當程式碼複寫到 CodeCommit 儲存庫時,這會啟動 CI/CD 管道。執行以下任意一項:

    • 如果您使用自動鏡射來同步 GitLab 儲存庫與 CodeCommit 儲存庫,請繼續下一個步驟。

    • 如果您使用手動鏡像,請依照更新鏡像 (GitLab 文件) 中的指示,將應用程式程式碼變更推送至 CodeCommit 儲存庫。

  3. 在本機電腦上,於 Web 瀏覽器中輸入 http://localhost:80。這會開啟 NGINX 網頁,因為連接埠 80 會轉送至 Vagrantfile 中的 localhost。確認您可以檢視更新的應用程式版本值。這會驗證管道和映像部署。

  4. (選用) 如果您想要在 AWS 管理主控台中驗證部署,請執行下列動作:

    1. 開啟 Amazon ECS 主控台,網址為 https://console.aws.amazon.com/ecs/

    2. 從導覽列中選取要使用的「區域」。

    3. 在導覽窗格中,選擇叢集

    4. 叢集頁面上,選取 EcsAnywhereCluster 叢集。

    5. 選擇任務定義

    6. 確認容器正在執行。

DevOps 工程師
任務描述所需的技能

清除和刪除資源。

逐步解說此模式之後,您應該移除您建立的proof-of-concept資源。若要清除,請輸入下列命令。

$cdk destroy EcsAnywherePipelineStack $cdk destroy EcsAnywhereInfraStack
DevOps 工程師

故障診斷

問題解決方案

安裝套件相依性時遺失套件的錯誤。

輸入下列其中一個命令來解決遺失的套件。

$npm ci

$npm install -g @aws-cdk/<package_name>

當您在 VM 上執行 aws ssm create-activation命令時,您會收到下列錯誤。

An error occurred (ValidationException) when calling the CreateActivation operation: Nonexistent role or missing ssm service principal in trust policy: arn:aws:iam::000000000000:role/EcsAnywhereInstanceRole

EcsAnywhereInfraStack 堆疊尚未完全部署,且執行此命令所需的 IAM 角色尚未建立。在 CloudFormation 主控台中檢查堆疊狀態。在狀態變更為 後重試命令CREATE_COMPLETE

Amazon ECS 運作狀態檢查會傳回 UNHEALTHY,而您會在 Amazon ECS 主控台中叢集的服務區段中看到下列錯誤。

service EcsAnywhereService was unable to place a task because no container instance met all of its requirements. Reason: No Container Instances were found in your cluster.

輸入下列命令,在您的 Vagrant VM 上重新啟動 Amazon ECS 代理程式。

$vagrant ssh $sudo systemctl restart ecs $sudo systemctl status ecs

相關資源