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

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

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

由馬赫什·拉格南(AWS),詹姆斯·拉德克(AWS)和喬姆西·帕佩亨(AWS)創建

代碼存儲庫:aws-cicd-java-eks

環境:生產

技術:容器和微服務; CloudNative DevOps; 現代化

工作負載:所有其他工作

AWS 服務:AWS CloudFormation; AWS CodeCommit; AWS CodePipeline; Amazon EC2 容器註冊表; Amazon EKS

Summary

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

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

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • 已安裝和設定 AWS Command Line Interface (AWS CLI) (AWS CLI) 第 2 版。如需有關這方面的詳細資訊,請參閱 AWS CLI 文件中的安裝、更新和解除安裝 AWS CLI 第 2 版

  • AWS CLI 第 2 版必須使用建立 Amazon EKS 叢集的相同 IAM 角色進行設定,因為只有該角色獲得授權,才能將其他 IAM 角色新增到 aws-authConfigMap. 如需設定 AWS CLI 的資訊和步驟,請參閱 AWS CLI 文件中的組態基礎知識

  • 可完整存取 AWS 的 AWS Identity and Access Management (IAM) 角色和許可 CloudFormation。有關這方面的詳細資訊,請參閱 AWS CloudFormation 文件中的使用 IAM 控制存取

  • 現有的 Amazon EKS 叢集,其中包含 EKS 叢集中工作者節點的 IAM 角色名稱和 IAM 角色 Amazon 資源名稱 (ARN) 的詳細資訊。

  • Kubernetes 叢集自動配置器 (已在您的 Amazon EKS 叢集中安裝和設定)。如需詳細資訊,請參閱 Amazon EKS 文件中的叢集自動配置器。 

  • 存取 GitHub 儲存庫中的程式碼。

重要備註

AWS Security Hub 已啟用為程式碼中 AWS CloudFormation 範本的一部分。根據預設,啟用 Security Hub 之後,會提供 30 天的免費試用期,之後會產生與此 AWS 服務相關的費用。如需有關定價的詳細資訊,請參閱 AWS Security Hub 定價

產品版本

  • 頭盔版本 3.4.2 或更新版本

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

  • BridgeCrew 切科夫 2.2 版或更高版本

  • 水族安全三維版本 0.37 或更高版本

架構

技術堆疊

  • AWS CodeBuild

  • AWS CodeCommit

  • Amazon CodeGuru

  • AWS CodePipeline

  • Amazon Elastic Container Registry

  • Amazon Elastic Kubernetes Service

  • Amazon EventBridge

  • AWS Security Hub

  • Amazon Simple Notification Service (Amazon SNS)

目標架構

""

該圖顯示以下工作流程:

  1. 開發人員更新 CodeCommit 存儲庫的基底分支中的 Java 應用程序代碼,該代碼創建了一個提取請求(PR)。

  2. 提交 PR 後,Amazon 審核者會自動 CodeGuru 審核程式碼、根據 Java 的最佳實務進行分析,並向開發人員提供建議。

  3. 將 PR 合併到基本分支之後,就會建立 Amazon EventBridge 事件。

  4. 該 EventBridge 事件啟動 CodePipeline 管道,並啟動。

  5. CodePipeline 執行 CodeSecurity 掃描階段(連續安全性)。

  6. CodeBuild 啟動使用 Checkov 掃描 Dockerfile 和 Kubernetes 部署 Helm 檔案的安全性掃描程序,並根據增量程式碼變更掃描應用程式原始碼。應用程式原始程式碼掃描是由CodeGuru 審核者命令列介面 (CLI) 包裝函式執行。

  7. 如果安全性掃描階段成功,就會啟動「建置」階段 (持續整合)。

  8. 在「建置」階段中, CodeBuild 建置成品、將成品封裝至 Docker 映像、使用 Aqua Security Trivy 掃描映像中是否有安全漏洞,然後將映像儲存在 Amazon ECR 中。

  9. 從步驟 8 檢測到的漏洞已上傳到 Security Hub,供開發人員或工程師進一步分析。Security Hub 提供修復弱點的概觀和建議。

  10. CodePipeline 管道內各個階段的電子郵件通知會透過 Amazon SNS 傳送。

  11. 持續整合階段完成後, CodePipeline 進入部署階段 (持續交付)。

  12. Docker 映像會使用頭盔圖表,以容器工作負載 (網繭) 的形式部署至 Amazon EKS。

  13. 應用程式網繭設定了 Amazon 效能分 CodeGuru 析工具代理程式,該代理程式會將應用程式的效能分析資料 (CPU、堆集使用量和延遲) 傳送至 Amazon CodeGuru Profiler,以協助開發人員瞭解應用程式的行為。

工具

AWS 服務

  • AWS 可 CloudFormation協助您設定 AWS 資源、快速且一致地佈建 AWS 資源,並在 AWS 帳戶和區域的整個生命週期中進行管理。

  • AWS CodeBuild 是全受管的建置服務,可協助您編譯原始程式碼、執行單元測試,以及產生準備好部署的成品。

  • AWS CodeCommit 是一種版本控制服務,可協助您以私密方式存放和管理 Git 儲存庫,而無需管理自己的原始檔控制系統。

  • Amazon CodeGuru Profiler 會從您的即時應用程式收集執行階段效能資料,並提供可協助您微調應用程式效能的建議。

  • Amazon CodeGuru Reviewer 使用程式分析和機器學習來偵測開發人員難以找到的潛在缺陷,並提供改善 Java 和 Python 程式碼的建議。

  • AWS 可 CodePipeline協助您快速建模和設定軟體發行的不同階段,並自動執行持續發行軟體變更所需的步驟。

  • Amazon Elastic Container Registry (Amazon ECR) 是安全、可擴展且可靠的受管容器映像登錄服務。

  • Amazon Elastic Kubernetes Service (Amazon EKS) 可協助您在 AWS 上執行 Kubernetes,而無需安裝或維護自己的 Kubernetes 控制平面或節點。

  • Amazon EventBridge 是無伺服器事件匯流排服務,可協助您將應用程式與來自各種來源的即時資料連接起來。例如,AWS Lambda 函數、使用 API 目的地的 HTTP 叫用端點,或其他 AWS 帳戶中的事件匯流排。

  • AWS Identity and Access Management (IAM) 可透過控制誰經過身份驗證和授權使用 AWS 資源,協助您安全地管理對 AWS 資源的存取。

  • AWS Security Hub 提供您在 AWS 中安全狀態的全面檢視。它也可協助您根據安全產業標準和最佳實務來檢查 AWS 環境。

  • Amazon Simple Notification Service (Amazon SNS) 可協助您協調和管理發佈者和客戶之間的訊息交換,包括 Web 伺服器和電子郵件地址。

  • Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可協助您儲存、保護和擷取任何數量的資料。

其他服務

  • Helm 是 Kubernetes 的開源軟件包管理器。

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

  • BridgeCrew Checkov 是一種靜態代碼分析工具,用於掃描基礎結構作為代碼(IaC)文件,以查找可能導致安全性或合規性問題的錯誤配置。

  • Aqua 安全 Trivy 是一個全面的掃描器,用於容器映像,文件系統和 Git 存儲庫中的漏洞,除了配置問題。

Code

此模式的代碼可在 GitHub aws-codepipeline-devsecops-amazoneks存儲庫中找到。

最佳實務

  • IAM 實體在此解決方案的所有階段都遵循了最低特權原則。如果您想要使用其他 AWS 服務或第三方工具來擴充解決方案,建議您遵循最低權限原則。

  • 如果您有多個 Java 應用程式,建議您為每個應用程式建立個別的 CI/CD 管線。

  • 如果您有一個整體應用程序,我們建議盡可能將應用程序分解為微服務。微型服務更具彈性,可讓您更輕鬆地將應用程式部署為容器,並提供應用程式整體建置與部署的能見度。

史诗

任務描述所需技能

克隆存 GitHub 儲庫。

若要複製存放庫,請執行下列命令。

git clone https://github.com/aws-samples/aws-codepipeline-devsecops-amazoneks
應用 DevOps 程式開發人員、

建立 S3 儲存貯體並上傳程式碼。

  1. 登入 AWS 管理主控台,開啟 Amazon S3 主控台,然後在計劃部署此解決方案的 AWS 區域建立 S3 儲存貯體。如需詳細資訊,請參閱 Amazon S3 文件中的建立儲存貯體。

  2. 在 S3 儲存貯體中,建立名為code.

  3. 導覽至您複製儲存庫的位置。若要使用 .zip 副檔名 (cicdstack.zip) 建立整個程式碼的壓縮版本,並驗證 .zip 檔案,請依序執行下列命令。

    注意:如果命python令失敗並指出未找到 Python,請python3改用。

    cd aws-codepipeline-devsecops-amazoneks python -m zipfile -c cicdstack.zip * python -m zipfile -t cicdstack.zip
  4. cicdstack.zip檔案上傳到您先前在 S3 儲存貯體中建立的程式碼資料夾。

AWS DevOps、 DevOps 工程師、雲端管理員、 DevOps

建立 AWS CloudFormation 堆疊。

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

  2. 在 [指定範本] 中,選擇 [上傳範本檔案]、[上傳cf_templates/codecommit_ecr.yaml檔案],然後選擇 [下一步]。

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

    • CodeCommitRepositoryBranchName:您的代碼將駐留的分支名稱(默認為 main)

    • CodeCommitRepositoryName:要創建的 CodeCommit 存儲庫的名稱。

    • CodeCommitRepositoryS3Bucket:您在其中建立程式碼資料夾的 S3 儲存貯體的名稱

    • CodeCommitRepository中三 BucketObjKeycode/cicdstack.zip

    • ECR RepositoryName:要創建的 Amazon ECR 回購的名稱

  4. 選擇 [下一步],使用 [設定堆疊] 選項的預設設定,然後選擇 [下一步]。

  5. 在「複查」區段中,確認範本和堆疊詳細資料,然後選擇「建立堆疊」。然後會建立堆疊,包括 CodeCommit 和 Amazon ECR 儲存庫。

  6. 請記下 Java CI/CD 管道設定所需的儲存庫 CodeCommit 和 Amazon ECR 儲存庫的名稱。

AWS DevOps, DevOps

驗證 CloudFormation 堆疊部署。

  1. 在 CloudFormation 主控台的 [堆] 下,確認您已部署的 CloudFormation 堆疊狀態。堆疊的狀態應為「建立完成」。

  2. 此外,從主控台驗證 Amazon ECR 是 CodeCommit 否已佈建且已準備就緒。

DevOps 工程師

刪除 S3 儲存貯體。

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

AWS DevOps, DevOps
任務描述所需技能

設定 Java 應用程式的頭盔圖表。

  1. 在複製 GitHub 存放庫的位置中,導覽至資料夾helm_charts/aws-proserve-java-greeting。在此資料夾中,values.dev.yaml檔案包含有關 Kubernetes 資源組態的相關資訊,您可以針對容器部署到 Amazon EKS 進行修改。提供您的 AWS 帳戶 ID、AWS 區域和 Amazon ECR 儲存庫名稱,以更新 Docker 儲存庫參數。

    image: repository: <account-id>.dkr.ecr.<region>.amazonaws.com/<app-ecr-repo-name>
  2. Java 網繭的服務類型已設定為LoadBalancer

    service: type: LoadBalancer port: 80 targetPort: 8080 path: /hello initialDelaySeconds: 60 periodSeconds: 30

    若要使用不同的服務 (例如,NodePort),您可以變更參數。如需詳細資訊,請參閱 Kubernetes 文件。

  3. 您可以將參數變更為,以啟動 Kubernetes 水平網繭自動配置器autoscaling enabled: true

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

您可以透過變更values.<ENV>.yaml檔案 (開發、生產、UAT 或 QA 環境的位置<ENV>) 中的值,為 Kubernetes 工作負載啟用不同的功能。

DevOps

驗證 Helm 圖表的語法錯誤。

  1. 從終端機執行下列命令,確認 Helm v3 已安裝在本機工作站中。

    helm --version

    如果沒有安裝頭盔 v3,請安裝它

  2. 在終端機中,導覽至 Helm 圖表目錄 (helm_charts/aws-proserve-java-greeting),然後執行下列命令。

    helm lint . -f values.dev.yaml

    這將檢查頭盔圖表的任何語法錯誤。

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

建立 CI/CD 管線。

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

  2. 在 [指定範本] 中,選擇 [上傳範本檔案]、上傳cf_templates/build_deployment.yaml範本,然後選擇 [下一步]。

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

    • CodeBranchName:代碼所在的 CodeCommit 回購分支名稱

    • EKSClusterName:您的 EKS 叢集的名稱 (而非識別碼) EKSCluster

    • EKS CodeBuildAppName:應用程序的名稱頭盔圖()aws-proserve-java-greeting

    • EKS WorkerNodeRole ARN:Amazon EKS 工作者節點 IAM 角色的 ARN

    • EKS WorkerNodeRoleName:指派給 Amazon EKS 工作者節點的 IAM 角色的名稱

    • EcrDockerRepository:將儲存您程式碼的 Docker 映像檔的 Amazon ECR 存放庫的名稱

    • EmailRecipient:需要傳送組建通知的電子郵件地址

    • EnvType:環境(例如,開發,測試或生產)

    • SourceRepoName:代碼所在的 CodeCommit 存儲庫的名稱

  4. 選擇下一步。使用 [設定堆疊選項] 中的預設設定,然後選擇 [下一步]。

  5. 在「檢閱」區段中,確認 AWS CloudFormation 範本和堆疊詳細資料,然後選擇「下一步」。

  6. 選擇建立堆疊。 

  7. 在 CloudFormation 堆疊部署期間,您在參數中提供之電子郵件地址的擁有者會收到訂閱 SNS 主題的訊息。若要訂閱 Amazon SNS,擁有者必須選擇訊息中的連結。

  8. 建立堆疊之後,開啟堆疊的 [出] 索引標籤,然後記錄EksCodeBuildkubeRoleARN輸出金鑰的 ARN 值。稍後將需要此 IAM ARN 值,才能為 CodeBuild IAM 角色提供權限,以便在 Amazon EKS 叢集中部署工作負載。

AWS DevOps
任務描述所需技能

開啟 Aqua 安全性整合功能。

要將 Trivy 報告的 Docker 映像漏洞發現項目上傳到 Security Hub,需要執行此步驟。由於 AWS CloudFormation 不支援 Security Hub 整合,因此必須手動完成此程序。

  1. 開啟 AWS Security Hub 主控台,然後瀏覽至整合

  2. 搜尋「水上安全」,然後選擇「水上安全:水上安全」。

  3. 選擇接受搜尋結果

AWS 管理員、 DevOps 工程師
任務描述所需技能

CodeBuild 允許在 Amazon EKS 叢集中執行頭盔或 kubectl 命令。

若 CodeBuild 要經過驗證,才能在 EKS 叢集中使用 Helm 或kubectl命令,您必須將 IAM 角色新增至. aws-auth ConfigMap 在此情況下,請新增 IAM 角色的 ARNEksCodeBuildkubeRoleARN,這是為 CodeBuild 服務建立的 IAM 角色,可存取 EKS 叢集並在其上部署工作負載。這是一次性的活動。

重要事項:必須先完成下列程序,才能進行中的部署核准階段 CodePipeline。

  1. 在您的 Amazon Linux 或 macOS 環境中打開cf_templates/kube_aws_auth_configmap_patch.sh外圍程序腳本。

  2. 透過執行下列命令向 Amazon EKS 叢集進行驗證。

    aws eks --region <aws-region> update-kubeconfig --name <eks-cluster-name>
  3. 使用下列命令執行 shell 指令碼,並<rolearn-eks-codebuild-kubectl>以您先前記錄EksCodeBuildkubeRoleARN的 ARN 值取代。

    bash cf_templates/kube_aws_auth_configmap_patch.sh <rolearn-eks-codebuild-kubectl> 

aws_authConfigMap已設定,並授與存取權。

DevOps
任務描述所需技能

確認 CI/CD 管線是否自動啟動。

  1. 如果 Checkov 偵測到 Dockerfile 或 Helm 圖表中的漏洞,管道中的 CodeSecurity 掃描階段通常會失敗。不過,這個範例的目的在於建立識別潛在安全性弱點的程序,而不是透過 CI/CD 管道 (通常是處理序) 修正。 DevSecOps 在檔案中buildspec/buildspec_secscan.yamlcheckov命令會使用--soft-fail旗標來避免管線失敗。

    - echo -e "\n Running Dockerfile Scan" - checkov -f code/app/Dockerfile --framework dockerfile --soft-fail --summary-position bottom - echo -e "\n Running Scan of Helm Chart files" - cp -pv helm_charts/$EKS_CODEBUILD_APP_NAME/values.dev.yaml helm_charts/$EKS_CODEBUILD_APP_NAME/values.yaml - checkov -d helm_charts/$EKS_CODEBUILD_APP_NAME --framework helm --soft-fail --summary-position bottom - rm -rfv helm_charts/$EKS_CODEBUILD_APP_NAME/values.yaml

    若要讓管線在報告 Dockerfile 和 Helm 圖表的弱點時失敗,必須從命令中移除該--soft-failcheckov選項。然後,開發人員或工程師可以修復這些漏洞並將更改提交到 CodeCommit 源代碼存儲庫。

  2. 與 CodeSecurity 掃描類似,構建階段使用 Aqua 安全 Trivy 在推送應用程序之前識別高和關鍵 Docker 圖像漏洞。到 Amazon ECR。在此示例中,我們不會因 Docker 映像漏洞導致管道失敗。在檔案中buildspec/buildspec.yml,該trivy命令包含--exit-code帶有值的旗標 0,這就是為什麼在報告 HIGH 或 CRITIAL Docker 映像弱點時管道不會失敗的原因。

    - AWS_REGION=$AWS_DEFAULT_REGION AWS_ACCOUNT_ID=$AWS_ACCOUNT_ID trivy -d image --no-progress --ignore-unfixed --exit-code 0 --severity HIGH,CRITICAL --format template --template "@securityhub/asff.tpl" -o securityhub/report.asff $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$CODEBUILD_RESOLVED_SOURCE_VERSION

    若要讓管道在報告HIGH, CRTICAL弱點時失敗,請--exit-code將的值變更為1

    然後,開發人員或工程師可以修復這些漏洞並將更改提交到 CodeCommit 源代碼存儲庫。

  3. Aqua 安全 Trivy 回報的 Docker 映像漏洞已上傳到 Security Hub。在 AWS Security Hub 主控台上,導覽至發現項目。使用「記錄狀態」=「活動」和「產品 = Aqua 安全性」過濾發現項 這將列出 Security Hub 中的 Docker 映像漏洞。Security Hub 心可能需要 15 分鐘 — 1 小時才會出現弱點。

有關使用啟動管道的詳細資訊 CodePipeline,請參閱 AWS CodePipeline 文件中 CodePipeline的啟動管道、手動啟動管道和按排程啟動管道。

DevOps

核准部署。

  1. 建置階段完成之後,就會有部署核准閘門。審核者或發行管理員應該檢查組建,如果滿足所有需求,則核准它。對於使用持續交付進行應用程式部署的團隊,這是建議使用的方法。

  2. 核准後,管線會啟動「部署」階段。

  3. 部署階段成功之後,此階段的 CodeBuild 記錄會提供應用程式的 URL。使用 URL 來驗證應用程式的準備程度。

DevOps

驗證應用程式分析。

部署完成並將應用程式網繭部署到 Amazon EKS 後,應用程式中設定的 Amazon 效能分 CodeGuru 析工具代理程式會嘗試將應用程式的效能分析資料 (CPU、堆積摘要、延遲和瓶頸) 傳送至 Amazon 效能分析工具。 CodeGuru

對於應用程式的初始部署,Amazon 效能分 CodeGuru 析工具需要大約 15 分鐘的時間來視覺化分析資料。

AWS DevOps

相關資源

其他資訊

CodeGuru 就功能而言,效能分析工具不應與 AWS X-Ray 服務混淆。 CodeGuru Profiler 最適合識別最昂貴的代碼行,這可能會導致瓶頸或安全問題,並在它們成為潛在風險之前加以修復。AWS X-Ray 服務適用於應用程式效能監控。

在此模式中,事件規則與預設事件匯流排相關聯。如果需要,您可以擴充模式以使用自訂事件匯流排。

此病毒碼會使用 CodeGuru Reviewer 做為應用程式程式碼的靜態應用程式安全性測試 (SAST) 工具。您也可以將此管線用於其他工具,例如 SonarQube 或 Checkmarx。您可以在中新增任何這些工具的對應掃描設定指示buildspec/buildspec_secscan.yaml,以取代的掃描指示 CodeGuru。