在 Amazon ECS 上部署適用於 Java 微服務的 CI/CD 管道 - AWS 方案指引

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

在 Amazon ECS 上部署適用於 Java 微服務的 CI/CD 管道

由維傑·湯普森(AWS)和桑卡爾桑格博特拉(AWS)創建

環境:PoC 或試點

技術: DevOps;容器與微服務

AWS 服務:AWS CodeBuild;Amazon EC2 容器註冊表;Amazon ECS;AWS Fargate;AWS CodePipeline

Summary

此模式會引導您完成使用 AWS 在現有 Amazon 彈性容器服務 (Amazon ECS) 叢集上為 Java 微服務部署持續整合和持續交付 (CI/CD) 管道的步驟。 CodeBuild當開發人員提交更改時,會啟動 CI/CD 管道,並在中啟動構建過程。 CodeBuild構建完成後,成品將被推送到 Amazon Elastic Container Registry (Amazon ECR),並從 Amazon ECR 獲取最新構建並推送到 Amazon ECS 服務。

先決條件和限制

先決條件

  • 在 Amazon ECS 上執行的現有 Java 微服務應用程式

  • 熟悉 AWS CodeBuild 和 AWS CodePipeline

架構

源, 技術, 堆棧

  • 在 Amazon ECS 上運行的 Java 微服務

  • Amazon ECR 中的代碼存儲庫

  • AWS Fargate

來源架構

在 Amazon ECS 上為 Java 微服務部署 CI/CD 管道的來源架構

目標技術堆疊

  • Amazon ECR

  • Amazon ECS

  • AWS Fargate

  • AWS CodePipeline

  • AWS CodeBuild

目標架構

在 Amazon ECS 上為 Java 微服務部署 CI/CD 管道的目標架構

自動化和規模

CodeBuild buildspec.yml檔案:

version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws --version - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email) - REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=build-$(echo $CODEBUILD_BUILD_ID | awk -F":" '{print $2}') build: commands: - echo Build started on `date` - echo building the Jar file - mvn clean install - echo Building the Docker image... - docker build -t $REPOSITORY_URI:$BUILD_TAG . - docker tag $REPOSITORY_URI:$BUILD_TAG $REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $REPOSITORY_URI:$BUILD_TAG - docker push $REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... - printf '[{"name":"%s","imageUri":"%s"}]' $DOCKER_CONTAINER_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json - cat imagedefinitions.json artifacts: files: - imagedefinitions.json - target/DockerDemo.jar

工具

AWS 服務

  • AWS CodeBuild 是全受管的建置服務,可協助您編譯原始程式碼、執行單元測試,以及產生準備好部署的成品。AWS 可持續 CodeBuild 擴展並同時處理多個組建,因此您的組建不會留在佇列中。

  • AWS 可 CodePipeline協助您快速建模和設定軟體發行的不同階段,並自動執行持續發行軟體變更所需的步驟。您可以將 AWS CodePipeline 與第三方服務整合 GitHub,或使用 AWS 服務 (例如 AWS CodeCommit 或 Amazon ECR)。

  • Amazon Elastic Container Registry (Amazon ECR) 是全受管的登錄,可讓開發人員輕鬆存放、管理和部署 Docker 容器映像。Amazon ECR 與 Amazon ECS 整合,以簡化您的 development-to-production 工作流程。Amazon ECR 在高可用性和可擴展的架構中託管您的映像,因此您可以可靠地為應用程式部署容器。與 AWS Identity and Access Management (IAM) 整合可提供每個儲存庫的資源層級控制。

  • Amazon Elastic Container Service (Amazon ECS) 可高度擴展、高效能的容器協調服務,支援 Docker 容器,並可讓您在 AWS 上輕鬆執行和擴展容器化應用程式。Amazon ECS 無需安裝和操作自己的容器協調軟體、管理和擴展虛擬機器叢集,或在這些虛擬機器上排程容器。

  • AWS Fargate 是 Amazon ECS 的運算引擎,可讓您執行容器,而不必管理伺服器或叢集。使用 AWS Fargate,您不再需要佈建、設定和擴展虛擬機器叢集來執行容器。這樣一來即無須選擇伺服器類型、決定何時擴展叢集,或最佳化叢集壓縮。

其他工具

  • Docker 是一個平台,可讓您在稱為容器的套件中建置、測試和交付應用程式。

  • Git 是一個分佈式版本控制系統,用於在軟件開發過程中跟踪源代碼的變化。它是專為協調程序員之間的工作,但它可以用來跟踪任何一組文件的變化。其目標包括速度、資料完整性,以及對分散式非線性工作流程的支援。您也可以使用 AWS CodeCommit 作為 Git 的替代方案。

史诗

任務描述所需技能

建立 CodeBuild 建置專案。

AWS 主 CodeBuild 控台中,建立建置專案並指定其名稱。

應用程式開發人員、AWS 系統管

選取來源。

此模式使用 Git 作為代碼存儲庫,因此請GitHub 從可用選項列表中進行選擇。選擇一個公共存儲庫或從您的 GitHub 帳戶。

應用程式開發人員、AWS 系統管

選取儲存庫。

選取您要從中建置程式碼的儲存庫。

應用程式開發人員、AWS 系統管

選取環境。

您可以從受管理映像清單中選取,或使用 Docker 選擇自訂映像檔。此模式使用下列受管理的映像檔:

  • Amazon Linux 2

  • 執行階段:標準

  • 圖片版本 1.0

應用程式開發人員、AWS 系統管

選擇服務角色。

您可以建立服務角色,或從現有角色清單中選取。

應用程式開發人員、AWS 系統管

新增環境變數。

在「其他組態」區段中,設定下列環境變數:

  • 預設 AWS 區域的 AW_ 預設區域

  • 使用者帳號的 AW_ 帳戶識別碼

  • 用於 Amazon ECR 私有儲存庫

  • 構建版本的 BUILD_TAG最新版本是此變量的值)

  • 工作中容器名稱的「碼頭 _ 容器名稱」

這些變量是buildspec.yml文件中的佔位符,並將與它們各自的值替換。

應用程式開發人員、AWS 系統管

創建一個構建規格文件。

您可以在pom.xml與此模式中提供的配置相同的位置創建一個buildspec.yml文件,或者使用在線 buildspec 編輯器並添加配置。依照提供的步驟,以適當的值設定環境變數。

應用程式開發人員、AWS 系統管

設定專案的人工因素。

(選擇性) 視需要設定成品的建置專案。

應用程式開發人員、AWS 系統管

設定 Amazon CloudWatch 日誌。

(選擇性) 視需要為建置專案設定 Amazon CloudWatch 日誌。此步驟為選用步驟,但建議使用。

應用程式開發人員、AWS 系統管

設定 Amazon S3 日誌。

(選用) 如果您想要存放日誌,請為建置專案設定 Amazon 簡單儲存服務 (Amazon S3) 日誌。

應用程式開發人員、AWS 系統管
任務描述所需技能

建立管道。

AWS 主 CodePipeline 控台上,建立管道並指定其名稱。如需建立管道的詳細資訊,請參閱 AWS CodePipeline 文件

應用程式開發人員、AWS 系統管

選取服務角色。

建立服務角色,或從現有服務角色清單中選取。如果您 CodePipeline 要建立服務角色,請提供角色的名稱,然後選取建立角色的選項。

應用程式開發人員、AWS 系統管

選擇人工因素商店。

進階設定中,如果您希望 Amazon S3 建立儲存貯體並將成品存放在儲存貯體中,請使用成品存放區的預設位置。或者,選取自訂位置並指定現有值區。您也可以選擇使用加密金鑰來加密成品。

應用程式開發人員、AWS 系統管

指定來源提供者。

對於來源提供者,請選擇 GitHub (版本 2)

應用程式開發人員、AWS 系統管

選取程式碼的儲存庫和分支。

如果您尚未登入,請提供要連線的連線詳細資訊 GitHub,然後選取存放庫名稱和分支名稱。

應用程式開發人員、AWS 系統管

變更偵測選項。

選擇 [在原始程式碼變更時啟動管線],然後移至下一頁。

應用程式開發人員、AWS 系統管

選取組建提供者。

對於建置供應商,請選擇 AWS CodeBuild,然後提供建置專案的 AWS 區域和專案名稱詳細資訊。

針對 [建置類型] 選擇 [單一組建]。

應用程式開發人員、AWS 系統管

選擇部署提供者。

對於部署供應商,請選擇 Amazon ECS。如果需要,請選擇叢集名稱、服務名稱、映像定義檔 (如果有的話) 以及部署逾時值。選擇 Create pipeline (建立管道)

應用程式開發人員、AWS 系統管

相關資源