選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

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

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

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

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

由 MAHESH RAGHUNANDANAN (AWS)、James Radtke (AWS) 和 Jomcy Pappachen (AWS) 建立

Summary

此模式說明如何建立持續整合和持續交付 (CI/CD) 管道,以使用建議的 DevSecOps 實務自動建置和部署 Java 應用程式至 Amazon Web Services (AWS) 雲端上的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集。此模式使用以 Spring Boot Java 架構開發的問候語應用程式,並使用 Apache Maven。

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

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

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

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

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

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

  • 在 Amazon EKS 叢集中安裝和設定 Kubernetes Cluster Autoscaler。如需詳細資訊,請參閱《Amazon EKS 文件》中的 Cluster Autoscaler。 

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

重要備註

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

產品版本

  • Helm 3.4.2 版或更新版本

  • Apache Maven 3.6.3 版或更新版本

  • BridgeCrew Checkov 2.2 版或更新版本

  • Aqua Security Trivy 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 Reviewer 會自動檢閱程式碼、根據 Java 的最佳實務進行分析,並向開發人員提供建議。

  3. 將 PR 合併至基礎分支後,會建立 Amazon EventBridge 事件。

  4. EventBridge 事件會啟動 CodePipeline 管道,這會啟動 。

  5. CodePipeline 執行 CodeSecurity Scan 階段 (持續安全性)。

  6. CodeBuild 會啟動安全掃描程序,其中使用 Checkov 掃描 Dockerfile 和 Kubernetes 部署 Helm 檔案,並根據增量程式碼變更掃描應用程式原始碼。應用程式原始碼掃描由 CodeGuru Reviewer Command Line Interface (CLI) 包裝函式執行。

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

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

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

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

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

  12. Docker 映像會使用 Helm Chart 以容器工作負載 (Pod) 部署至 Amazon EKS。

  13. 應用程式 Pod 是使用 Amazon CodeGuru Profiler Agent 設定的,會將應用程式的分析資料 (CPU、堆積用量和延遲) 傳送至 Amazon CodeGuru Profiler,以協助開發人員了解應用程式的行為。

工具

AWS 服務

  • AWS CloudFormation 可協助您設定 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 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 Security Trivy 是全方位的掃描器,除了處理組態問題之外,還可找出容器映像、檔案系統和 Git 儲存庫中的漏洞。

Code

此模式的程式碼可在 GitHub aws-codepipeline-devsecops-amazoneks 儲存庫中使用。

最佳實務

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

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

  • 如果您有整體應用程式,建議您盡可能將應用程式分成微型服務。Microservices 更具彈性,可讓您更輕鬆地將應用程式部署為容器,而且可讓您更清楚地了解應用程式的整體建置和部署。

史詩

任務描述所需的技能

複製 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 檔案,請依序執行下列命令。

    cd aws-codepipeline-devsecops-amazoneks python -m zipfile -c cicdstack.zip * python -m zipfile -t cicdstack.zip
    注意

    如果python命令失敗並指出找不到 Python,請python3改用 。

  4. cicdstack.zip檔案上傳至您先前在 S3 儲存貯體中建立的程式碼資料夾。

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

建立 AWS CloudFormation 堆疊。

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

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

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

    • CodeCommitRepositoryBranchName:您的程式碼將駐留的分支名稱 (預設為主要)

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

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

    • CodeCommitRepositoryS3BucketObjKeycode/cicdstack.zip

    • ECRRepositoryName:要建立的 Amazon ECR 儲存庫名稱

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

  5. 檢閱區段中,驗證範本和堆疊詳細資訊,然後選擇建立堆疊。接著會建立堆疊,包括 CodeCommit 和 Amazon ECR 儲存庫。

  6. 請注意 CodeCommit 和 Amazon ECR 儲存庫的名稱,這是 Java CI/CD 管道設定所需的名稱。

AWS DevOps、DevOps

驗證 CloudFormation 堆疊部署。

  1. 在 CloudFormation 主控台的 Stacks 下,驗證您部署的 CloudFormation 堆疊狀態。堆疊的狀態應為 CREATE COMPLETE

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

DevOps 工程師

刪除 S3 儲存貯體。

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

AWS DevOps、DevOps

設定環境

任務描述所需的技能

複製 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 檔案,請依序執行下列命令。

    cd aws-codepipeline-devsecops-amazoneks python -m zipfile -c cicdstack.zip * python -m zipfile -t cicdstack.zip
    注意

    如果python命令失敗並指出找不到 Python,請python3改用 。

  4. cicdstack.zip檔案上傳至您先前在 S3 儲存貯體中建立的程式碼資料夾。

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

建立 AWS CloudFormation 堆疊。

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

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

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

    • CodeCommitRepositoryBranchName:您的程式碼將駐留的分支名稱 (預設為主要)

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

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

    • CodeCommitRepositoryS3BucketObjKeycode/cicdstack.zip

    • ECRRepositoryName:要建立的 Amazon ECR 儲存庫名稱

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

  5. 檢閱區段中,驗證範本和堆疊詳細資訊,然後選擇建立堆疊。接著會建立堆疊,包括 CodeCommit 和 Amazon ECR 儲存庫。

  6. 請注意 CodeCommit 和 Amazon ECR 儲存庫的名稱,這是 Java CI/CD 管道設定所需的名稱。

AWS DevOps、DevOps

驗證 CloudFormation 堆疊部署。

  1. 在 CloudFormation 主控台的 Stacks 下,驗證您部署的 CloudFormation 堆疊狀態。堆疊的狀態應為 CREATE COMPLETE

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

DevOps 工程師

刪除 S3 儲存貯體。

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

AWS DevOps、DevOps
任務描述所需的技能

設定 Java 應用程式的 Helm Chart。

  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 Pod 的服務類型設定為 LoadBalancer

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

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

  3. 您可以將 autoscaling 參數變更為 ,以啟用 Kubernetes Horizontal Pod Autoscalerenabled: true

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

您可以變更 values.<ENV>.yaml 檔案中的值,其中 <ENV>是您的開發、生產、UTA 或 QA 環境,為 Kubernetes 工作負載啟用不同的功能。

DevOps

驗證 Helm Chart 是否有語法錯誤。

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

    helm --version

    如果未安裝 Helm v3,請進行安裝

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

    helm lint . -f values.dev.yaml

    這將檢查 Helm Chart 是否有任何語法錯誤。

DevOps 工程師

設定 Helm Chart

任務描述所需的技能

設定 Java 應用程式的 Helm Chart。

  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 Pod 的服務類型設定為 LoadBalancer

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

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

  3. 您可以將 autoscaling 參數變更為 ,以啟用 Kubernetes Horizontal Pod Autoscalerenabled: true

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

您可以變更 values.<ENV>.yaml 檔案中的值,其中 <ENV>是您的開發、生產、UTA 或 QA 環境,為 Kubernetes 工作負載啟用不同的功能。

DevOps

驗證 Helm Chart 是否有語法錯誤。

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

    helm --version

    如果未安裝 Helm v3,請進行安裝

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

    helm lint . -f values.dev.yaml

    這將檢查 Helm Chart 是否有任何語法錯誤。

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

建立 CI/CD 管道。

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

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

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

    • CodeBranchName:CodeCommit 儲存庫的分支名稱,您的程式碼位於其中

    • EKSClusterName:EKS 叢集的名稱 (非 EKSCluster ID)

    • EKSCodeBuildAppName:應用程式 Helm Chart 的名稱 (aws-proserve-java-greeting)

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

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

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

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

    • EnvType:環境 (例如,dev、test 或 prod)

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

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

  5. 檢閱區段中,驗證 AWS CloudFormation 範本和堆疊詳細資訊,然後選擇下一步

  6. 選擇建立堆疊。 

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

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

AWS DevOps

設定 Java CI/CD 管道

任務描述所需的技能

建立 CI/CD 管道。

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

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

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

    • CodeBranchName:CodeCommit 儲存庫的分支名稱,您的程式碼位於其中

    • EKSClusterName:EKS 叢集的名稱 (非 EKSCluster ID)

    • EKSCodeBuildAppName:應用程式 Helm Chart 的名稱 (aws-proserve-java-greeting)

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

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

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

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

    • EnvType:環境 (例如,dev、test 或 prod)

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

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

  5. 檢閱區段中,驗證 AWS CloudFormation 範本和堆疊詳細資訊,然後選擇下一步

  6. 選擇建立堆疊。 

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

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

AWS DevOps
任務描述所需的技能

開啟 Aqua Security 整合。

上傳 Trivy 報告的 Docker 映像漏洞調查結果至 Security Hub 時需要此步驟。由於 AWS CloudFormation 不支援 Security Hub 整合,因此此程序必須手動完成。

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

  2. 搜尋 Aqua Security,然後選取 Aqua Security:Aqua Security

  3. 選擇接受問題清單

AWS 管理員、DevOps 工程師

啟用 Security Hub 和 Aqua Security 之間的整合

任務描述所需的技能

開啟 Aqua Security 整合。

上傳 Trivy 報告的 Docker 映像漏洞調查結果至 Security Hub 時需要此步驟。由於 AWS CloudFormation 不支援 Security Hub 整合,因此此程序必須手動完成。

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

  2. 搜尋 Aqua Security,然後選取 Aqua Security:Aqua Security

  3. 選擇接受問題清單

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

允許 CodeBuild 在 Amazon EKS 叢集中執行 Helm 或 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 Shell 指令碼。

  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_auth ConfigMap 已設定 ,並授予存取權。

DevOps

設定 CodeBuild 以執行 Helm 或 kubectl 命令

任務描述所需的技能

允許 CodeBuild 在 Amazon EKS 叢集中執行 Helm 或 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 Shell 指令碼。

  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_auth ConfigMap 已設定 ,並授予存取權。

DevOps
任務描述所需的技能

確認 CI/CD 管道會自動啟動。

  1. 如果 Checkov 偵測到 Dockerfile 或 Helm Chart 中的漏洞,管道中的 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 Chart 的漏洞時失敗,必須從checkov命令中移除 --soft-fail選項。然後,開發人員或工程師可以修正漏洞,並將變更遞交至 CodeCommit 原始程式碼儲存庫。

  2. 與 CodeSecurity Scan 類似,建置階段使用 Aqua Security Trivy 來識別 HIGH 和 CRITICAL Docker 映像漏洞,然後再將應用程式推送至 Amazon ECR。在此範例中,我們不會讓 Docker 映像漏洞的管道失敗。在 檔案 中buildspec/buildspec.ymltrivy命令包含具有值 的 旗標 --exit-code 0,這就是回報 HIGH 或 CRITICAL 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 Security Trivy 報告的 Docker 映像漏洞會上傳至 Security Hub。在 AWS Security Hub 主控台上,導覽至問題清單。使用記錄狀態 = 作用中產品 = Aqua Security 篩選問題清單。這將列出 Security Hub 中的 Docker 映像漏洞。漏洞可能需要 15 分鐘到 1 小時才會出現在 Security Hub 上。

如需使用 CodePipeline 啟動管道的詳細資訊,請參閱AWS CodePipeline 文件》中的在 CodePipeline 中啟動管道手動啟動管道,以及依排程啟動管道

DevOps

核准部署。

  1. 建置階段完成後,會有部署核准閘道。檢閱者或發行管理員應檢查組建,如果符合所有要求,請予以核准。對於使用持續交付進行應用程式部署的團隊,建議採用此方法。

  2. 核准後,管道會啟動部署階段。

  3. 部署階段成功後,此階段的 CodeBuild 日誌會提供應用程式的 URL。使用 URL 來驗證應用程式的準備狀態。

DevOps

驗證應用程式分析。

部署完成且應用程式 Pod 部署在 Amazon EKS 之後,在應用程式中設定的 Amazon CodeGuru Profiler 代理程式會嘗試將應用程式的分析資料 (CPU、堆積摘要、延遲和瓶頸) 傳送至 Amazon CodeGuru Profiler。

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

AWS DevOps

驗證 CI/CD 管道

任務描述所需的技能

確認 CI/CD 管道會自動啟動。

  1. 如果 Checkov 偵測到 Dockerfile 或 Helm Chart 中的漏洞,管道中的 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 Chart 的漏洞時失敗,必須從checkov命令中移除 --soft-fail選項。然後,開發人員或工程師可以修正漏洞,並將變更遞交至 CodeCommit 原始程式碼儲存庫。

  2. 與 CodeSecurity Scan 類似,建置階段使用 Aqua Security Trivy 來識別 HIGH 和 CRITICAL Docker 映像漏洞,然後再將應用程式推送至 Amazon ECR。在此範例中,我們不會讓 Docker 映像漏洞的管道失敗。在 檔案 中buildspec/buildspec.ymltrivy命令包含具有值 的 旗標 --exit-code 0,這就是回報 HIGH 或 CRITICAL 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 Security Trivy 報告的 Docker 映像漏洞會上傳至 Security Hub。在 AWS Security Hub 主控台上,導覽至問題清單。使用記錄狀態 = 作用中產品 = Aqua Security 篩選問題清單。這將列出 Security Hub 中的 Docker 映像漏洞。漏洞可能需要 15 分鐘到 1 小時才會出現在 Security Hub 上。

如需使用 CodePipeline 啟動管道的詳細資訊,請參閱AWS CodePipeline 文件》中的在 CodePipeline 中啟動管道手動啟動管道,以及依排程啟動管道

DevOps

核准部署。

  1. 建置階段完成後,會有部署核准閘道。檢閱者或發行管理員應檢查組建,如果符合所有要求,請予以核准。對於使用持續交付進行應用程式部署的團隊,建議採用此方法。

  2. 核准後,管道會啟動部署階段。

  3. 部署階段成功後,此階段的 CodeBuild 日誌會提供應用程式的 URL。使用 URL 來驗證應用程式的準備狀態。

DevOps

驗證應用程式分析。

部署完成且應用程式 Pod 部署在 Amazon EKS 之後,在應用程式中設定的 Amazon CodeGuru Profiler 代理程式會嘗試將應用程式的分析資料 (CPU、堆積摘要、延遲和瓶頸) 傳送至 Amazon CodeGuru Profiler。

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

AWS DevOps

相關資源

其他資訊

CodeGuru Profiler 在功能方面不應與 AWS X-Ray 服務混淆。CodeGuru Profiler 偏好識別最昂貴的程式碼行,這可能會導致瓶頸或安全問題,並在它們成為潛在風險之前對其進行修正。AWS X-Ray 服務用於應用程式效能監控。

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

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

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。