Amazon DVA-C02: 部署與 CI/CD (CodePipeline, CodeBuild, CodeDeploy, Elastic Beanstalk, 容器) — 學習指南

屬於 AWS Developer Associate DVA-C02 — 學習指南. 使用經過驗證的解答練習: Amazon 考試中心, 或參加限時模擬考試: ExamRoll.io.

使用 CodePipeline 與 CodeBuild 的 CI/CD 基礎:模式、API 與常見陷阱

設計具有明確階段的 pipeline:原始碼 (source)、建置 (build)、測試 (test)、核准 (approval)、部署 (deploy) 以及部署後驗證 (post-deploy verification)。CodePipeline 負責協調這些階段;請使用一個授予最小、限定範圍權限的 pipeline role,並為第三方整合設定 action role。透過 CodeCommit webhooks 或以程式化方式呼叫 StartPipelineExecution (AWS SDK: codepipeline.startPipelineExecution) 來觸發 pipeline。對於建置作業,建議使用 CodeBuild 專案,並透過 buildspec.yml 定義各個階段 (install, pre_build, build, post_build);當您需要臨時 (ad-hoc) 或批次建置時,可直接使用 StartBuild 或 StartBuildBatch 來叫用建置。對於映像檔建置,在 pre_build 階段使用 aws ecr get-login-password 並將其 pipe 給 docker login,然後執行 docker build/push 到 ECR,並擷取 image digest 以產生不可變的 artifact 參考。避免使用像 “latest” 這樣的浮動標籤 (floating tags);應改為產出參照 image digest 的 task definition 或 manifest 檔案,以確保部署的確定性 (deterministic)。注意常見的陷阱:長時間執行的腳本中 ECR 身份驗證 token 過期、CodeBuild IAM 政策權限不足以推送到 ECR 或呼叫 AWS API,以及將 ARN 硬式編碼 (hard-coding)。調整建置流程,將 artifact 上傳到 S3 或 pipeline 的 artifact store,並使用環境變數和 Parameter Store/Secrets Manager 來管理敏感的、僅在執行期需要的值,而不是將機敏資訊寫死在建置產出的 artifact 中。

部署策略:CodeDeploy、Lambda 別名與 Elastic Beanstalk 組態選擇

選擇符合風險承受能力和回滾需求的部署模型。對於 Lambda,請使用版本 (versions) 和別名 (aliases);發佈一個新版本 (lambda.publishVersion),然後透過 CodeDeploy 建立一個部署 (codedeploy.createDeployment) 來更新別名,此部署需參照 Lambda 應用程式和部署群組,並包含流量轉移規則。使用 CodeDeploy 內建的組態,例如 CodeDeployDefault.LambdaCanary10Percent5Minutes,或使用自訂的流量路由 (traffic-routing) 來進行精確的金絲雀 (canary) 或線性 (linear) 流量轉移。對於 EC2 和本地 (on-prem) 應用程式,CodeDeploy 支援藍/綠 (blue/green) 部署,並提供生命週期掛鉤 (lifecycle hooks) 以在流量導入前進行驗證,以及在健康狀態檢查失敗時自動回滾。Elastic Beanstalk 提供多種策略:All at Once (快速但風險高)、Rolling、Rolling with Additional Batch (較安全) 和 Immutable (最安全),您可以使用 eb deploy 或 update-environment API 並指定 DeploymentPolicy 和 OptionSettings 來變更這些策略。開發人員常見的陷阱包括:忘記設定應用程式健康狀態檢查 (例如 ALB target group health、EB health reporting),這會導致無法自動切換流量;以及 CodeDeploy 的 IAM 權限不足,無法叫用 Lambda 或更新 ECS。對於有資料庫支援的版本發佈,應考慮使用向後相容的 schema 變更,並在部署前使用功能開關 (feature toggles),以避免在同一個事務 (transaction) 中將程式碼和 schema 緊密耦合。

容器化 Pipeline、ECR、ECS/Fargate 與 EKS:建置、部署與不可變參考

一個穩健的容器化 pipeline 會在 CodeBuild 中建置映像檔,推送到 ECR,然後觸發部署到 ECS、Fargate 或 EKS。在 CodeBuild 中,執行

undefined

,接著執行

undefined

undefined

,並透過

undefined

來擷取 image digest。對於 ECS/Fargate,使用帶有 image digest 的 containerDefinitions 來註冊新的 task definition (ecs.registerTaskDefinition),然後更新服務 (ecs.updateService) 以使用新的 task definition,或設定 forceNewDeployment 來觸發替換;您也可以使用 CodeDeploy 進行 ECS 的藍/綠部署,在 ALB 層級進行流量轉移。對於 EKS,更新 Kubernetes manifest 以參照 image digest,並套用 kubectl set image 或使用宣告式的 GitOps 工具;CodeBuild 可以執行 aws eks update-kubeconfig 和 kubectl 指令。典型的陷阱包括:使用可變的標籤 (mutable tags) 導致部署到舊版本;未更新 task definition,使 ECS 無法部署新映像檔;Fargate 任務的 CPU/記憶體或 ENI 限制不足;以及忘記授予 CodeBuild 讀取已推送映像檔所需的 ecr:BatchGetImage 權限。

部署前驗證、回復與可觀測性:測試、掛鉤與操作安全措施

將自動化的單元測試、整合測試與煙霧測試整合到管線階段中。使用 CodeBuild 執行測試,並利用 AWS X-Ray 或 CloudWatch Logs 進行追蹤與結構化日誌記錄;在 SDK 中使用 PutAnnotation 為 X-Ray 追蹤加上註解,以便後續查詢能依使用者或請求屬性進行篩選。在部署前,採用 CodePipeline 中的手動核准動作或自動化驗證步驟:透過 CodeBuild 執行 Canary 檢查來測試已部署的端點,或叫用 CloudWatch Synthetics canaries 來執行腳本化驗證。使用 CodeDeploy 的生命週期掛鉤 (lifecycle hooks) (BeforeAllowTraffic, AfterAllowTraffic) 來執行健康檢查以及註冊/取消註冊的邏輯。實作自動回復觸發器:設定 CodeDeploy 在部署狀態非零或警報失敗時 (附加到部署群組的 CloudWatch 警報) 進行回復,而對於 Lambda,則使用別名搭配流量轉移 (traffic shifting),透過更新別名指向前一個版本來實現快速回復。開發人員的陷阱包括逾時設定不匹配 (Lambda 逾時比 SQS 可見性逾時短)、忘記為 ECS/CodeDeploy 正確設定 AppSpec 掛鉤,以及僅依賴部署 API 呼叫成功卻未驗證執行時期的行為。為部署加上指標與警報,並在產出物 (artifacts) 中使用不可變的識別碼以確保可追溯性。

實務問題:使用情境

情境:ExampleRetail 在 AWS 的開發/測試/生產帳戶中,執行一個微服務架構的線上商店。他們使用 CodeCommit 存放原始碼、CodePipeline/CodeBuild 進行 CI、ECR 存放映像檔、ECS/Fargate 搭配 ALB 提供服務,以及 Lambda 作為非同步的 worker。

挑戰:開發人員必須新增一個安全的自動化管線,用以部署新的結帳服務容器,此管線需具備 Canary 流量轉移與自動化部署前驗證,並在失敗時自動回復。

建議方法:

  1. 建立一個 CodeBuild 專案,用來建置 Docker 映像檔、執行單元測試、登入 ECR (aws ecr get-login-password | docker login --username AWS --password-stdin ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com)、推送映像檔,並產出一個包含映像檔 digest 的 JSON 產出物。
  2. 在 CodePipeline 中,新增一個部署階段,透過 ecs.registerTaskDefinition 並參考映像檔 digest 來註冊一個新的 ECS 任務定義,然後呼叫 codedeploy.createDeployment 來建立一個 CodeDeploy ECS 部署。此部署使用一個 AppSpec 來綁定新的任務定義,並設定 Canary 的 deploymentConfig (例如 CodeDeployDefault.ECSCanary10Percent5Minutes)。
  3. 新增一個基於 CodeBuild 的驗證動作或 CloudWatch Synthetics canary 作為部署後測試,用來呼叫關鍵的結帳端點並驗證回應;讓管線等待此驗證成功。
  4. 設定 CodeDeploy 的回復選項,並將一個 CloudWatch 警報 (例如 5xx 錯誤率或延遲) 綁定到部署群組,以便在超過閾值時自動中止並回復。

基本原理:建立不可變的映像檔、使用明確的映像檔 digest 註冊任務定義,並利用 CodeDeploy 的流量轉移加上自動化驗證,可以提供安全的 Canary 發布和快速的自動化回復,同時確保部署是可重現且可觀測的。


CloudFormation 與基礎設施即程式碼 (SAM · 所有領域 · 安全性、IAM、KMS 與機密管理 (Cognito

練習這些題目 → · 在 ExamRoll.io 上限時練習 →

Pass the whole exam — not just this question

You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.

通過考試 →

瀏覽 Amazon →

Related guides

一站式存取

一份訂閱。所有考試。

每個方案都可無限存取答案搜尋、練習測驗、AI 解釋和完整的資源庫 — 支援 20 多種語言。

每月
24.87
Just €0.83/day
包含所有內容:
  • 無限答案搜尋
  • 無限練習測驗
  • AI 驅動的解釋
  • 完整資源庫
  • 20 多種語言
  • 每週內容更新
  • 獎勵與推薦
  • 優先支援
開始免費試用

無需信用卡*

最佳價值
12 個月
179.87
Just €0.49/daySave 40%
包含所有內容:
  • 無限答案搜尋
  • 無限練習測驗
  • AI 驅動的解釋
  • 完整資源庫
  • 20 多種語言
  • 每週內容更新
  • 獎勵與推薦
  • 優先支援
開始免費試用

無需信用卡*

✓ 包含免費方案 · ✓ 隨時取消 · ✓ 所有方案解鎖完整產品