如何实现AWS CodeDeploy多应用同步部署与失败全量回滚?
AWS CodeDeploy 9服务同集群同步部署+失败全局回滚实现方案
CodeDeploy原生ECS部署场景下确实存在单部署组仅能绑定1个服务、单Application无法同时发起多服务部署的硬限制,不要尝试突破资源规则做非常规配置,直接通过部署编排层封装原生能力即可实现需求,落地路径如下:
- 前置资源配置
为集群内9个服务分别创建独立的CodeDeploy Application与对应部署组,每个部署组仅绑定自身对应的目标服务,所有部署组统一使用相同的部署策略(推荐全量一次发布的CodeDeployDefault.ECSAllAtOnce策略保证部署节奏对齐),关闭所有部署组自带的自动回滚规则,避免单个服务失败时先触发局部回滚,打乱全局回滚逻辑。 - 核心部署编排逻辑
不用从零写复杂的定制化部署系统,用Step Functions工作流或者轻量Lambda脚本做编排即可,核心逻辑只有三步:- 发起部署时,并行调用9次CodeDeploy的
CreateDeployment接口,给每个服务传入对应新版本的任务定义、AppSpec配置,把返回的9个部署ID统一记录到全局部署上下文(存在DynamoDB做持久化,避免编排进程丢状态)。 - 统一轮询所有9个部署的实时状态:通过
GetDeployment接口拉取每个部署的进度,只要检测到任意1个部署进入Failed状态、或者超过预设的部署超时时间仍未完成,立刻触发全局回滚流程;如果9个部署全部进入Succeeded状态,标记本次整体发布成功。 - 全局回滚触发时,遍历所有记录在案的部署ID,不管对应服务当前是部署失败、部署中、甚至已经部署成功的状态,全部给对应服务发起指向上一个已知稳定版本的新部署,等所有服务的回滚部署全部执行完成后,标记本次整体发布回滚完成。
- 发起部署时,并行调用9次CodeDeploy的
- 避坑提示
- 如果用蓝绿部署模式,不要让单个服务提前完成流量切流、终止旧版本任务集,要等9个服务的新版本预热、探针检查全部通过后,再统一执行切流和旧资源回收操作,进一步降低失败风险。
- 不要为了省事儿把多个服务的部署逻辑塞到同一个AppSpec或者同一个部署组里,这类违反产品限制的配置不仅会被API拦截,就算侥幸创建成功,后续也会出现状态识别错乱、流量错切的问题。
- 编排逻辑里要做幂等处理,避免重复发起部署、重复触发回滚导致状态混乱。
内容的提问来源于stack exchange,提问作者Senzi
相关产品推荐
相关产品推荐

