Amazon DVA-C02: 部署与 CI/CD (CodePipeline, CodeBuild, CodeDeploy, Elastic Beanstalk, 容器) — 学习指南

属于 AWS Developer Associate DVA-C02 — 学习指南. 使用经过验证的答案练习: Amazon 考试中心, 或参加限时模拟考试: ExamRoll.io.

使用 CodePipeline 和 CodeBuild 的 CI/CD 基础:模式、API 和常见陷阱

设计具有清晰阶段的管道:源 (source)、构建 (build)、测试 (test)、审批 (approval)、部署 (deploy) 和部署后验证 (post-deploy verification)。CodePipeline 负责协调这些阶段;应使用一个授予最小化、范围限定权限的管道角色,并为第三方集成配置操作角色。通过 CodeCommit webhooks 或以编程方式调用 StartPipelineExecution (AWS SDK: codepipeline.startPipelineExecution) 来触发管道。对于构建任务,首选使用 CodeBuild 项目,并通过 buildspec.yml 定义各个阶段 (install, pre_build, build, post_build);当需要临时或批量构建时,可直接调用 StartBuild 或 StartBuildBatch。对于镜像构建,在 pre_build 阶段使用 aws ecr get-login-password 通过管道传递给 docker login,然后执行 docker build/push 到 ECR,并捕获镜像摘要 (image digest) 以生成不可变的构件引用。避免使用“latest”之类的浮动标签;应生成引用镜像摘要的任务定义 (task definition) 或清单文件 (manifest file),以确保部署的确定性。注意常见陷阱:长时间运行的脚本中 ECR 身份验证令牌过期、CodeBuild 用于推送到 ECR 或调用 AWS API 的 IAM 策略权限不足,以及硬编码 ARN。配置构建过程以将构件上传到 S3 或管道的构件存储中,并使用环境变量和 Parameter Store/Secrets Manager 来管理敏感的、仅在运行时需要的值,而不是将密钥烘焙到构建构件中。

部署策略:CodeDeploy、Lambda 别名和 Elastic Beanstalk 配置选项

选择与风险承受能力和回滚需求相匹配的部署模型。对于 Lambda,使用版本和别名;发布一个版本 (lambda.publishVersion),然后通过 CodeDeploy 创建一个引用该 Lambda 应用程序和部署组的部署 (codedeploy.createDeployment),以更新别名的流量切换规则。使用 CodeDeploy 内置配置(如 CodeDeployDefault.LambdaCanary10Percent5Minutes)或自定义流量路由,以实现精确的金丝雀 (canary) 或线性 (linear) 部署。对于 EC2 和本地应用程序,CodeDeploy 支持蓝/绿部署,并提供生命周期挂钩 (lifecycle hooks) 用于流量前验证,以及在健康检查失败时自动回滚。Elastic Beanstalk 提供多种策略:All at Once(快速,有风险)、Rolling、Rolling with Additional Batch(更安全)和 Immutable(最安全),您可以通过 eb deploy 或 update-environment API 指定 DeploymentPolicy 和 OptionSettings 来更改这些策略。常见的开发者陷阱包括:忘记配置应用程序健康检查(ALB 目标组健康状况、EB 健康报告),这会阻止流量自动切换;以及 CodeDeploy 调用 Lambda 或更新 ECS 的 IAM 权限不足。对于有数据库支持的版本发布,考虑使用向后兼容的模式变更和部署前功能开关 (feature toggles),以避免在同一事务中耦合代码和模式。

容器管道、ECR、ECS/Fargate 和 EKS:构建、部署和不可变引用

一个健壮的容器管道会在 CodeBuild 中构建镜像,推送到 ECR,然后触发部署到 ECS、Fargate 或 EKS。在 CodeBuild 中,执行 aws ecr get-login-password | docker login –username AWS –password-stdin ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com,然后执行 docker build -t repo:tag . 和 docker push,并通过 docker inspect –format=’{{index .RepoDigests 0}}’ image 捕获镜像摘要 (image digest)。对于 ECS/Fargate,在 containerDefinitions 中使用镜像摘要注册新的任务定义 (ecs.registerTaskDefinition),然后更新服务 (ecs.updateService) 以使用新的任务定义,或设置 forceNewDeployment 来触发替换;使用 CodeDeploy 在 ALB 层面进行流量切换,以实现 ECS 的蓝/绿部署。对于 EKS,更新 Kubernetes 清单文件以引用镜像摘要,并应用 kubectl set image 或使用声明式的 GitOps 工具;CodeBuild 可以运行 aws eks update-kubeconfig 和 kubectl 命令。典型陷阱:使用可变标签导致部署过时;未能更新任务定义导致 ECS 无法部署新镜像;Fargate 任务的 CPU/内存或 ENI 限制不足;以及忘记授予 CodeBuild 读取已推送镜像所需的 ecr:BatchGetImage 权限。

部署前验证、回滚与可观测性:测试、钩子和操作保障

将自动化的单元测试、集成测试和冒烟测试集成到管道阶段中。使用 CodeBuild 运行测试,并使用 AWS X-Ray 或 CloudWatch Logs 进行追踪和结构化日志记录;在 SDK 中使用 PutAnnotation 为 X-Ray 跟踪添加注解,以便下游查询可以按用户或请求属性进行筛选。对于部署前环节,采用 CodePipeline 中的手动批准操作或自动验证步骤:通过 CodeBuild 运行 Canary 检查来调用已部署的端点,或调用 CloudWatch Synthetics canaries 来运行脚本化验证。使用 CodeDeploy 生命周期钩子 (BeforeAllowTraffic, AfterAllowTraffic) 来运行健康检查和注册/注销逻辑。实现自动回滚触发器:配置 CodeDeploy,在部署状态非零或警报失败时(附加到部署组的 CloudWatch 警报)进行回滚,对于 Lambda,则使用带有流量转移的别名,通过更新别名指向前一个版本来实现快速回滚。开发人员的常见陷阱包括超时不匹配(Lambda 超时短于 SQS 可见性超时)、忘记为 ECS/CodeDeploy 正确设置 AppSpec 钩子,以及仅依赖部署 API 调用的成功而未验证运行时行为。为部署配置指标和警报,并在构件中使用不可变标识符以实现可追溯性。

实践问题:用例场景

场景:ExampleRetail 公司在 dev/test/prod 多个 AWS 账户中运行一个微服务架构的店面。他们使用 CodeCommit 进行源代码管理,CodePipeline/CodeBuild 进行 CI,ECR 存储镜像,ECS/Fargate 运行位于 ALB 后面的服务,并使用 Lambda 作为异步工作程序。

挑战:开发人员必须添加一个安全的自动化管道,用于部署新的结账服务容器,该管道需具备 Canary 流量转移和自动化的部署前验证功能,并在失败时自动回滚。

推荐方法:

  1. 创建一个 CodeBuild 项目,该项目构建 Docker 镜像、运行单元测试、登录到 ECR (aws ecr get-login-password | docker login –username AWS –password-stdin ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com)、推送镜像,并输出一个包含镜像摘要的 JSON 构件。
  2. 在 CodePipeline 中,添加一个部署阶段,该阶段通过 ecs.registerTaskDefinition 引用镜像摘要来注册一个新的 ECS 任务定义,然后通过调用 codedeploy.createDeployment 创建一个 CodeDeploy ECS 部署,其中 AppSpec 绑定了新的任务定义,并设置了用于 Canary 部署的 deploymentConfig(例如,CodeDeployDefault.ECSCanary10Percent5Minutes)。
  3. 添加一个基于 CodeBuild 的验证操作或 CloudWatch Synthetics canary 作为部署后测试,用于调用关键的结账端点并验证响应;让管道等待验证成功。
  4. 配置 CodeDeploy 回滚选项和一个与部署组关联的 CloudWatch 警报(例如,5xx 错误率或延迟),以便在超出阈值时自动中止并回滚。

基本原理:构建不可变镜像、使用明确的镜像摘要注册任务定义,并利用 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多种语言
  • 每周内容更新
  • 奖励与推荐
  • 优先支持
开始免费试用

无需信用卡*

✓ 包含免费计划 · ✓ 随时取消 · ✓ 所有计划均解锁完整产品