用途
本技能面向 Amazon ECS 服务的部署实践,目标是在尽量不中断服务的前提下安全、高效地发布新版本。文档给出四种部署思路的对比与实现方式:滚动更新、蓝绿部署、金丝雀发布和 GitOps 工作流,并涵盖部署断路器与回滚策略。
部署策略对比
文档以表格形式给出各策略的停机时间、回滚速度、复杂度和适用场景:
- 滚动更新:零停机、回滚速度中等、复杂度低,适合大多数工作负载。
- 蓝绿部署:零停机、回滚瞬时、复杂度高,适合关键服务。
- 金丝雀发布:零停机、回滚快速、复杂度高,用于风险缓解。
滚动更新(默认)
通过 Terraform 的 aws_ecs_service 资源中的 deployment_configuration 配置,maximum_percent = 200 表示部署期间允许任务数达到期望值的两倍,minimum_healthy_percent = 100 表示保持 100% 健康任务。deployment_circuit_breaker 可开启 enable 和 rollback,实现自动检测失败与自动回滚。
行为流程为:注册新任务定义、按 maximum_percent 启动新任务、新任务通过健康检查、旧任务被排空并停止,直到所有任务更新完成。
文档提供了 boto3 的滚动更新函数 deploy_rolling_update,步骤包括:获取当前任务定义、复制并注册新的任务定义修订版本(移除仅响应字段后更新容器镜像)、调用 update_service 并设置 forceNewDeployment=True。同时提供 wait_for_deployment 函数,通过轮询 describe_services 输出部署的 rolloutState 与 runningCount/desiredCount,判断 COMPLETED 或 FAILED,默认超时 600 秒,每 15 秒检查一次。
蓝绿部署(CodeDeploy)
架构上使用 ALB 关联两个目标组(蓝色与绿色),每个目标组对应一个 ECS Service。Terraform 示例定义了 blue 和 green 两个 aws_lb_target_group(端口 8080、HTTP、target_type 为 ip、健康检查路径 /health)、两个监听器(prod 443 转发到 blue,test 8443 转发到 green,并通过 lifecycle ignore_changes 交由 CodeDeploy 管理)、ECS 服务(deployment_controller 类型为 CODE_DEPLOY)、CodeDeploy 应用(compute_platform 为 ECS)与部署组。
部署组包含 auto_rollback_configuration(事件为 DEPLOYMENT_FAILURE 与 DEPLOYMENT_STOP_ON_REQUEST)、blue_green_deployment_config(deployment_ready_option 超时动作为 CONTINUE_DEPLOYMENT,成功后 5 分钟终止蓝色实例)、deployment_style(deployment_option 为 WITH_TRAFFIC_CONTROL、deployment_type 为 BLUE_GREEN),以及 ecs_service 与 load_balancer_info(target_group_pair_info 中的 prod/test 流量路由与两个目标组)。
触发方式:通过 boto3 的 codedeploy.create_deployment,传入 applicationName、deploymentGroupName 以及 AppSpecContent。AppSpec 中 Resources 为 TargetService,类型 AWS::ECS::Service,属性包含 TaskDefinition 与 LoadBalancerInfo(ContainerName、ContainerPort)。
金丝雀发布
使用 ALB 加权路由:在 aws_lb_listener_rule 的 forward 动作中,为稳定组与金丝雀组分别设置权重(示例为 90/10)。文档提供 shift_traffic 函数,通过 elbv2.modify_rule 的 ForwardConfig 调整两个目标组的权重。渐进式发布的示例顺序为 10%、25%、50%、100%,每一阶段之间需要监控指标(文档未给出具体指标或判定标准)。
部署断路器
工作原理:ECS 监控部署健康状态,检测重复的任务失败,自动停止部署,并可选择回滚到上一版本。配置方式为 deployment_circuit_breaker 中 enable = true、rollback = true。触发条件包括:任务无法进入 RUNNING 状态、健康检查反复失败、任务启动后很快崩溃。
GitOps 工作流
提供 GitHub Actions 示例流水线,触发条件为推送到 main 分支。步骤依次为:checkout、配置 AWS 凭据、登录 Amazon ECR、构建并推送镜像(使用 github.sha 作为标签)、使用 amazon-ecs-render-task-definition 渲染任务定义、使用 amazon-ecs-deploy-task-definition 部署到 ECS(指定 service、cluster,并设置 wait-for-service-stability: true)。
回滚策略
手动回滚:rollback_to_previous 函数获取当前任务定义,解析 family 与 revision,将 revision 减一得到上一版本,再通过 update_service 更新服务。
自动回滚:通过部署断路器的 rollback = true 启用。
最佳实践
文档列出的实践包括:生产环境始终启用带回滚的断路器;对需要瞬时回滚的关键服务使用蓝绿部署;在容器、任务和 ALB 多个层级实现健康检查;使用镜像摘要而非标签以保证可复现性;在 ECR 中使用不可变镜像标签;使用 CloudWatch 告警监控部署;定期测试回滚流程;保留旧任务定义以便快速回滚。
相关技能
文档提到相关技能包括 boto3-ecs(SDK 模式)、terraform-ecs(基础设施即代码)、ecs-troubleshooting(部署调试)。详细参考方向包括蓝绿部署配置、CI/CD 流水线(GitHub Actions、CodePipeline)与监控(CloudWatch、告警)。