使用 AWS CDK 自動為微服務建置 CI/CD 管道和 Amazon ECS 叢集 - AWS 方案指引

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

使用 AWS CDK 自動為微服務建置 CI/CD 管道和 Amazon ECS 叢集

由 Varsha Raju (AWS) 建立

Summary

此模式說明如何自動建立持續整合和持續交付 (CI/CD) 管道,以及在 Amazon Elastic Container Service (Amazon ECS) 上建置和部署微服務的基礎基礎設施。如果您想要設定proof-of-concept CI/CD 管道,向組織展示 CI/CD、微服務和 DevOps 的優勢,您可以使用此方法。您也可以使用此方法來建立初始 CI/CD 管道,然後您可以根據組織的需求自訂或變更這些管道。 

模式的方法會建立生產環境和非生產環境,每個環境都有虛擬私有雲端 (VPC) 和設定為在兩個可用區域中執行的 Amazon ECS 叢集。這些環境由所有微服務共用,然後您為每個微服務建立 CI/CD 管道。這些 CI/CD 管道會從 AWS CodeCommit 中的來源儲存庫提取變更、自動建置變更,然後將變更部署到您的生產和非生產環境中。當管道成功完成其所有階段時,您可以使用 URLs生產和非生產環境中存取微服務。

先決條件和限制

先決條件

  • 作用中的 Amazon Web Services (AWS) 帳戶。

  • 包含 starter-code.zip 檔案 (已連接) 的現有 Amazon Simple Storage Service (Amazon S3) 儲存貯體。

  • AWS 雲端開發套件 (AWS CDK),已安裝並設定在您的 帳戶中。如需詳細資訊,請參閱 AWS CDK 文件中的 AWS CDK 入門

  • Python 3 和 pip,已安裝並設定。如需詳細資訊,請參閱 Python 文件

  • 熟悉 AWS CDK、AWS CodePipeline、AWS CodeBuild、CodeCommit、Amazon Elastic Container Registry (Amazon ECR)、Amazon ECS 和 AWS Fargate。

  • 熟悉 Docker。

  • 了解 CI/CD 和 DevOps。

限制

產品版本

  • 程式碼已使用 Node.js 16.13.0 版和 AWS CDK 1.132.0 版進行測試。

架構

AWS 雲端 architecture diagram showing CI/CD pipeline and deployment to production and non-production VPCs.

該圖顯示以下工作流程:

  1. 應用程式開發人員將程式碼遞交至 CodeCommit 儲存庫。

  2. 管道已啟動。

  3. CodeBuild 建置 Docker 映像並將其推送至 Amazon ECR 儲存庫

  4. CodePipeline 會將新映像部署到非生產 Amazon ECS 叢集中的現有 Fargate 服務。

  5. Amazon ECS 會將映像從 Amazon ECR 儲存庫提取至非生產 Fargate 服務。

  6. 測試是使用非生產 URL 執行。

  7. 發行管理員會核准生產部署。

  8. CodePipeline 會將新映像部署到生產 Amazon ECS 叢集中的現有 Fargate 服務

  9. Amazon ECS 會將映像從 Amazon ECR 儲存庫提取至生產 Fargate 服務。

  10. 生產使用者使用生產 URL 存取您的功能。

技術堆疊

  • AWS CDK

  • CodeBuild

  • CodeCommit: 

  • CodePipeline

  • Amazon ECR 

  • Amazon ECS 

  • Amazon VPC

自動化和擴展

您可以使用此模式的方法,為部署在共用 AWS CloudFormation 堆疊中的微服務建立管道。自動化可以在每個 VPC 中建立多個 Amazon ECS 叢集,也可以為部署在共用 Amazon ECS 叢集中的微服務建立管道。不過,這需要您提供新的資源資訊做為管道堆疊的輸入。

工具

  • AWS CDK – AWS Cloud Development Kit (AWS CDK) 是一種軟體開發架構,可用來定義程式碼中的雲端基礎設施,並透過 AWS CloudFormation 佈建雲端基礎設施。

  • AWS CodeBuild – AWS CodeBuild 是雲端中全受管的建置服務。CodeBuild 可編譯原始碼、執行單元測試,並產生可立即部署的成品。

  • AWS CodeCommit – AWS CodeCommit 是一種版本控制服務,可讓您在 AWS 雲端中私下存放和管理 Git 儲存庫。CodeCommit 讓您無需管理自己的來源控制系統或擔心擴展其基礎設施。

  • AWS CodePipeline – AWS CodePipeline 是一種持續交付服務,可用來建立模型、視覺化和自動化發行軟體所需的步驟。您可以使用快速模型化和設定軟體發行程序的不同階段。CodePipeline 會自動化持續發佈軟體變更所需的步驟。

  • Amazon ECS – Amazon Elastic Container Service (Amazon ECS) 是一種高度可擴展的快速容器管理服務,用於執行、停止和管理叢集上的容器。您可以在 AWS Fargate 管理的無伺服器基礎設施上執行任務和服務。或者,若要進一步控制您的基礎設施,您可以在您管理的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體叢集上執行任務和服務。

  • Docker – Docker 可協助開發人員封裝、運送和執行任何應用程式,做為輕量、可攜式且自給自足的容器。

Code

此模式的程式碼可在 cicdstarter.zipstarter-code.zip 檔案 (已連接) 中使用。

史詩

任務描述所需的技能
設定 AWS CDK 的工作目錄。
  1. 在本機電腦上建立名為 cicdproject 的目錄。

  2. cicdstarter.zip檔案 (已連接) 下載至 cicdproject目錄並解壓縮。這會建立名為 的資料夾cicdstarter

  3. 執行 cd <user-home>/cicdproject/cicdstarter 命令。 

  4. 執行 python3 -m venv .venv命令來設定 Python 虛擬環境。

  5. 執行 source ./.venv/bin/activate 命令。

  6. 執行 aws configure命令或使用下列環境變數來設定您的 AWS 環境: 

    • AWS_ACCESS_KEY_ID

    • AWS_SECRET_ACCESS_KEY 

    • AWS_DEFAULT_REGION

AWS DevOps、雲端基礎設施
任務描述所需的技能
建立共用基礎設施。
  1. 在您的工作目錄中,執行 cd cicdvpcecs命令。 

  2. 執行 pip3 install -r requirements.txt命令來安裝所有必要的 Python 相依性

  3. 執行 cdk bootstrap command以設定 AWS CDK 的 AWS 環境。 

  4. 執行 cdk synth --context aws_account=<aws_account_ID> --context aws_region=<aws-region> 命令。 

  5. 執行 cdk deploy --context aws_account=<aws_account_ID> --context aws_region=<aws-region> 命令。

  6. AWS CloudFormation 堆疊會建立下列基礎設施:

    • 名為 的非生產 VPC cicd-vpc-ecs/cicd-vpc-nonprod

    • 名為 的生產 VPC cicd-vpc-ecs/cicd-vpc-prod

    • 名為 的非生產 Amazon ECS 叢集 cicd-ecs-nonprod

    • 名為 的生產 Amazon ECS 叢集 cicd-ecs-prod

AWS DevOps、雲端基礎設施
監控 AWS CloudFormation 堆疊。
  1. 登入 AWS 管理主控台,開啟 AWS CloudFormation 主控台,然後從清單中選擇cicd-vpc-ecs堆疊。 

  2. 在堆疊詳細資訊窗格中,選擇事件索引標籤,並監控堆疊建立的進度。

AWS DevOps、雲端基礎設施
測試 AWS CloudFormation 堆疊。
  1. 建立 cicd-vpc-ecs AWS CloudFormation 堆疊之後,請確定已建立 cicd-vpc-ecs/cicd-vpc-nonprodcicd-vpc-ecs/cicd-vpc-prod VPCs。 

  2. 確定已建立 cicd-ecs-nonprodcicd-ecs-prod Amazon ECS 叢集。

重要

請務必記錄兩個 VPCs IDs 和兩個 VPCs 中預設安全群組的安全群組 IDs。

AWS DevOps、雲端基礎設施
任務描述所需的技能
建立微服務的基礎設施。
  1. 為您的微服務命名。例如,此模式使用 myservice1做為微服務的名稱。

  2. 在您的工作目錄中執行 cd <working-directory>/cdkpipeline命令。

  3. 執行 pip3 install -r requirements.txt 命令。

  4. 執行此模式額外資訊區段中可用的完整cdk synth命令。

  5. 執行此模式額外資訊區段中可用的完整cdk deploy命令。

注意

您也可以使用 目錄中cdk.json的 檔案來提供這兩個命令的值。

AWS DevOps、雲端基礎設施
監控 AWS CloudFormation 堆疊。

開啟 AWS CloudFormation 主控台並監控myservice1-cicd-stack堆疊的進度。最後,狀態會變更為 CREATE_COMPLETE

AWS DevOps、雲端基礎設施
測試 AWS CloudFormation 堆疊。
  1. 在 AWS CodeCommit 主控台上,驗證名為 的儲存庫myservice1是否存在,並包含入門程式碼。

  2. 在 AWS CodeBuild 主控台上,驗證名為 的建置專案myservice1是否存在。

  3. 在 Amazon ECR 主控台上,驗證名為 的 Amazon ECR 儲存庫myservice1是否存在。

  4. 在 Amazon ECS 主控台上,驗證非生產和生產 Amazon ECS 叢集中myservice1是否存在名為 的 Fargate 服務。

  5. 在 Amazon Elastic Compute Cloud (Amazon EC2) 主控台上,確認已建立非生產和生產 Application Load Balancer。記錄 ALBs的 DNS 名稱。

  6. 在 AWS CodePipeline 主控台上,驗證名為 的管道myservice1是否存在。它必須具有 SourceDeploy-NonProdBuildDeploy-Prod階段。管道也應該有 in progress 狀態。

  7. 監控管道,直到所有階段都完成為止。 

  8. 手動核准用於生產。

  9. 在瀏覽器視窗中,輸入 ALBs的 DNS 名稱。

  10. 應用程式應該會顯示在Hello World非生產和生產 URLs中。

使用管道。
  1. 開啟您先前建立的 CodeCommit 儲存庫,並開啟 index.js 檔案。 

  2. 使用 Hello CI/CD 取代 Hello World

  3. 儲存變更並將其遞交至主分支。

  4. 驗證管道是否啟動,以及變更是否經過 BuildDeploy-NonProdDeploy-Prod 階段。 

  5. 手動核准生產。

  6. 生產和非生產 URLs 現在都應該顯示 Hello CICD

AWS DevOps、雲端基礎設施
為每個微服務重複此史詩。

重複此史詩中的任務,為每個微服務建立 CI/CD 管道。

AWS DevOps、雲端基礎設施

相關資源

其他資訊

cdk synth 命令

cdk synth --context aws_account=<aws_account_number> --context aws_region=<aws_region> --context vpc_nonprod_id=<id_of_non_production VPC> --context vpc_prod_id=<id_of_production_VPC> --context ecssg_nonprod_id=< default_security_group_id_of_non-production_VPC> --context ecssg_prod_id=<default_security_group_id_of_production_VPC> --context code_commit_s3_bucket_for_code=<S3 bucket name> --context code_commit_s3_object_key_for_code=<Object_key_of_starter_code> --context microservice_name=<name_of_microservice>

cdk deploy command

cdk deploy --context aws_account=<aws_account_number> --context aws_region=<aws_region> --context vpc_nonprod_id=<id_of_non_production_VPC> --context vpc_prod_id=<id_of_production_VPC> --context ecssg_nonprod_id=< default_security_group_id_of_non-production_VPC> --context ecssg_prod_id=<default_security_group_id_of_production_VPC> --context code_commit_s3_bucket_for_code=<S3 bucket name> --context code_commit_s3_object_key_for_code=<Object_key_of_starter_code> --context microservice_name=<name_of_microservice>

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip