使用 CI/CD 管道自動建置 Java 應用程式並將其部署到 Amazon EKS - AWS Prescriptive Guidance

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

使用 CI/CD 管道自動建置 Java 應用程式並將其部署到 Amazon EKS

由馬赫什拉古南(AWS)和喬姆西·帕帕亨(AWS)創建

環境:生產

技能:容器與微服務;雲端原生;DevOps;現代化

工作負載:所有其他工作負載

AWS 服務:AWS EC2 Container Registry;亞馬遜 EKS;Amazon CloudWatch;AWS CodeBuild;AWS CodeCommit;AWS CodePipeline;AWS Identity and Access Management;AWS CloudFormation

Summary

此模式說明如何建立持續整合和持續交付 (CI/CD) 管道,以自動將 Java 應用程式建立和部署到 Amazon Web Services (AWS) 雲端上的 Amazon Elastic Kubernetes 服務 (Amazon EKS) 叢集。這種模式使用與春季啟動 Java 框架開發的問候應用程序,並使用 Apache Maven。

您可以使用此模式的方法來建置 Java 應用程式的程式碼、將應用程式成品封裝為 Docker 映像、安全掃描映像,以及將映像上傳為 Amazon EKS 上的工作負載容器。如果您想要從緊密結合的單一架構遷移到微服務架構,則此模式的方法非常有用。此方法也可協助您監視和管理 Java 應用程式的整個生命週期,以確保更高層次的自動化,並有助於避免錯誤或錯誤。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • AWS Command Line Interface (AWS CLI) 版本 2,已安裝和設定。如需此項目的詳細資訊,請參閱安裝、更新和解除安裝 AWS CLI 版本 2的 AWS CLI 文件中。

  • AWS CLI 版本 2 必須使用建立 Amazon EKS 叢集的相同 IAM 使用者進行配置,因為只有他們有權將其他 IAM 使用者、群組或角色新增至aws-authConfigMap。如需設定 AWS CLI 的資訊和步驟,請參閱組態基礎概念的 AWS CLI 文件中。 

  • AWS Identity and Access Management (IAM) 角色和許可,可完整存取 AWS CloudFormation。如需此項目的詳細資訊,請參閱控制 IAM 的存取在 AWS CloudFormation 文件中。

  • 一個現有的 Amazon EKS 叢集。

  • Kubernetes 叢集自動縮放器,已安裝和配置在您的 Amazon EKS 叢集中。如需此項目的詳細資訊,請參閱Cluster Autoscaler在 Amazon EKS 文件中的文件。 

  • 所以此java-cicd-eks-cfn.zip檔案 (附加),下載到您的本機電腦。

限制

  • 這種模式的方法不會實作容器特定的記錄和監視工具,例如FluentdAmazon CloudWatchGrafana, 或Prometheus

  • 此方法不會將容器部署到跨多個帳戶的 Amazon EKS 叢集。

產品版本

  • 頭盔 3.4.2 版或更新版本

  • 阿帕奇 Maven 版本 3.6.3 或更高版本

Architecture

此圖顯示以下工作流程:

1. 使用者會將 Java 應用程式碼變更交付至 AWS CodeCommit 儲存庫。

2. 一個 Amazon CloudWatch Events 件事件是由新的提交產生的。

3. 雲端監控事件會啟動 AWS CodePipeline。

4. CodePipeline 運行構建階段(持續集成)。

5. CodeBuild 構建工件,將工件打包到 Docker 映像,使用 Aqua 安全三維掃描映像的安全漏洞,並將映像存儲在 Amazon Elastic Container Registry (Amazon ECR) 中。

6. 持續整合階段完成後,CodePipeline 會進入部署階段 (持續傳遞)。

7. Docker 映像會使用 Helm 圖將其作為容器工作負載部署到 Amazon EKS。

Tools

  • AWS CloudFormation— AWS CloudFormation 是一項服務,可協助您為 AWS 資源建立模型並進行設定。

  • AWS CodeBuild— CodeBuild 是在雲端的全受管組建服務。

  • AWS CodeCommit— CodeCommit 是代管的版本控制服務,可讓您私下存放和管理資產。                                   

  • AWS CodePipeline— CodePipeline 是一種持續交付服務,讓您能夠將發行軟體所需的步驟模型化、視覺化和自動化。

  • Amazon ECR— Amazon Elastic Container Registry (Amazon ECR) 是 AWS 受管容器映像登錄服務,具安全性、可擴展性和可靠性。 

  • Amazon EKS— Amazon Elastic Kubernetes Service (Amazon EKS) 是一項受管服務,讓您能夠在 AWS 執行 Kubernetes,而無須安裝、操作和維護您自己的 Kubernetes 控制窗格或節點。

  • AWS Identity and Access Management— IAM 是一項 Web 服務,可協助您安全地控制對 AWS 資源的存取。

  • Amazon S3— Amazon Simple Storage Service (Amazon S3) 是網際網路儲存服務。 

  • Aqua Security— Trivy 是一款簡單且全面的掃描器,除了配置問題之外,容器映像、檔案系統和 Git 存儲庫中的漏洞。 

  • Apache Maven— Apache Maven 是軟體專案管理和理解工具。 

  • 頭盔— 頭盔可協助您管理 Kubernetes 應用程式。 

Code

所以此java-cicd-eks-cfn.zip檔案 (附加) 包含此模式所需的建置指令碼、Helm 圖組態檔案以及 IAM 角色和政策。該代碼具有以下結構,包含 15 個目錄和 22 個文件。

├── README ├── app_code (Java application code) │ ├── app │ │ ├── Dockerfile (the Docker file to package the application artifact) │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ │ └── org │ │ │ └── aws │ │ │ └── samples │ │ │ └── greeting │ │ │ ├── Application.java │ │ │ └── GreetingController.java │ │ └── resources │ │ └── Images │ │ └── aws_proserve.jpg │ ├── app_code.zip (.zip format of the code to be uploaded to an S3 bucket, in case you need to create a CodeCommit repository and upload the code automatically by using cf_templates/codecommit.yaml) │ ├── aws-proserve-java-greeting (the application name and Helm charts) │ │ ├── Chart.yaml │ │ ├── templates │ │ │ ├── NOTES.txt │ │ │ ├── _helpers.tpl │ │ │ ├── deployment.yaml │ │ │ ├── hpa.yaml │ │ │ ├── ingress.yaml │ │ │ ├── service.yaml │ │ │ ├── serviceaccount.yaml │ │ │ └── tests │ │ │ └── test-connection.yaml │ │ └── values.dev.yaml (the values of Helm chart for a development environment) │ ├── buildspec.yml (build specifications for the build process) │ └── buildspec_deploy.yml (build specifications for the deployment process) ├── cf_templates (AWS CloudFormation template for the CI/CD stack setup) ├── build_deployment.yaml ├── codecommit.yaml └── kube_aws_auth_configmap_patch.sh

Epics

任務描述所需技能
建立 S3 儲存貯體。
  1. 登入 AWS 管理主控台,開啟 Amazon S3 主控台,然後建立 S3 儲存貯體。 

  2. 在 S3 儲存貯體中建立資料夾。我們建議將此資料夾命名為「程式碼」。

  3. 開啟java-cicd-eks-cfn.zip文件(附加)並上傳app_code/app_code.zipCode資料夾。

如需此項目的詳細資訊,請參閱建立儲存貯體在 Amazon S3 文件中。

AWS DevOps、DevOps
建立 AWS CloudFormation 堆疊。
  1. 開啟 AWS CloudFormation 主控台,然後選擇建立堆疊

  2. In指定範本中,選擇上傳範本檔案,請上傳cf_templates/codecommit.yaml檔案,然後選擇下一頁

  3. In指定堆疊詳細資訊,輸入堆疊名稱,然後提供下列輸入參數值:

  • CodeCommitRepositoryBranchName— 預設值是主分支名稱,但可以提供任何其他分支名稱。

  • CodeCommitRepositoryName— CodeCommit 儲存庫的名稱。

  • CodeCommitRepositoryS3Bucket— 您先前建立的 S3 儲存貯體的名稱。

  • CodeCommitRepositoryS3BucketObjKey— 此值為code/app_code.zip

    4. 選擇下一頁的預設設設設設設設設設設設定設定堆疊選項,然後選擇下一頁

    5. 在 中檢閱區段中,確認範本和堆疊詳細資訊,然後選擇建立堆疊。然後創建堆棧,這也創建 CodeCommit 和亞馬遜 ECR 存儲庫。 

AWS DevOps、DevOps
刪除 S3 儲存貯體。

清空並刪除您先前建立的 S3 儲存貯體。如需此項目的詳細資訊,請參閱刪除儲存貯體在 Amazon S3 文件中。 

AWS DevOps、DevOps
任務描述所需技能
設定 Java 應用程式的頭盔圖表。

開啟 app_code/aws-proserve-java-greeting 資料夾。所以此values.dev.yaml檔案 是可針對 Amazon EKS 的容器部署進行修改的輸入檔案。透過取代 AWS 帳戶 ID、AWS 區域和 Amazon ECR 存放庫資訊,使用下列參數變更 Docker 存放庫:

image: repository: <account-id>.dkr.ecr.<region>.amazonaws.com/aws-proserve-java-docker

爪哇的service類型設定為LoadBalancer。如果您需要將其變更為其他服務 (例如 NodePort),您可以修改下列參數:

service: type: LoadBalancer port: 80 targetPort: 8080 path: /hello

所以此Kubernetes 水平 Pod 自動升壓器可以透過修改下列參數來開啟:

autoscaling: enabled: false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80

這表示您可以開啟 Kubernetes 工作負載的不同功能,藉由變更.{ENV}.yaml檔案,其中ENV可以是您的開發、生產、UAT 或 QA 環境。

DevOps
任務描述所需技能
建立 CI/CD 管道。
  1. 開啟 AWS CloudFormation 主控台,然後選擇建立堆疊

  2. In指定範本中,選擇上傳範本檔案,請上傳cf_templates/build_deployment.yaml範本,然後選擇下一頁

  3. In指定堆疊詳細資訊下,請指定Stack name (堆疊名稱),然後為輸入參數提供下列值:

  • CodeBranchName— 預設值是 Java 應用程式程式碼、Docker 檔案和 Helm 圖表所在的主分支。 

  • EKSClusterName— Amazon EKS 叢集的名稱。 

  • EKSCodeBuildAppName— Java 應用程式的名稱。此模式使用aws-proserve-java-greeting

  • EcrDockerRepository— 您的亞馬遜 ECR 存儲庫的名稱。

  • EnvType— 您的環境類型。

  • SourceRepoName— CodeCommit 儲存庫的名稱。

    4. 選擇 Next (下一步)。使用預設設設設定設定堆疊 options,然後選擇下一頁

    5. 在 中檢閱區段中,驗證 AWS CloudFormation 式範本和堆疊詳細資料。選擇下一頁,然後選擇建立堆疊。 

   6. 建立堆疊之後,開啟輸出索引標籤,然後記錄EksCodeBuildkubeRoleARN輸出鍵。

AWD 開發
任務描述所需技能
允許 CodeBuild 在 Amazon EKS 叢集中執行頭盔或 kubectl 命令。
  1. CodeBuild 需要透過 Amazon EKS 叢集進行身份驗證,才能使用頭盔或kubectl命令。所以此aws-authAmazon EKS 叢集中的 ConfigMap 負責驗證 IAM 使用者、群組或角色,這些使用者、群組或角色必須新增至aws-authConfigMap。 

  2. 開啟cf_templates/kube_aws_auth_configmap_patch.sh殼層指令碼。

  3. 透過執行以下命令對 Amazon EKS 叢集進行驗證:aws eks --region <aws-region> update-kubeconfig --name <eks-cluster-name>

  4. 使用下列命令執行 shell 指令碼:bash cf_templates/kube_aws_auth_configmap_patch.sh <rolearn-eks-codebuild-kubectl> 請注意:Replace<rolearn-eks-codebuild-kubectl>的 ARN 值為EksCodeBuildkubeRoleARN你先前錄製的

  5. 所以此aws_authConfigMap 已配置並授予訪問權限。

DevOps
任務描述所需技能
確認 CI/CD 管道是否自動啟動。

當 Trivy 掃描 Docker 映像是否有弱點時,管道中的建置階段將會最初失敗。這是故意的,是由舊版本的spring-boot-starter-parent中的app_code/app/pom.xml檔案,可驗證 Docker 映像是否針對已知的應用程式和 Docker 常見弱點和曝光 (CVE) 進行測試。 

請依照下列步驟解決此組建失敗:

  1. 更新spring-boot-starter-parent版本更改為檔案中的最新版本app_code/app/pom.xml文件放在 CodeCommit 存儲庫中。您可以在 Maven 中找到最新版本彈簧啟動器父系儲存庫。

  2. 將變更提交至 CodeCommit 儲存庫。

  3. 管道會自動啟動,並且建置階段成功。

如需此項目的詳細資訊,請參閱啟動管道執行手動啟動管道,以及依排程啟動管道從 AWS 代碼管道文檔。

DevOps
核准部署。

建置階段完成後,就會有部署核准閘門。審核者或發行管理員應該檢查組建,如果符合所有需求,請核准它。 

核准後,管線會實作部署階段。

DevOps

相關資源

Attachments

attachment.zip