基于Cloud Formation的ECS集群创建与更新DevOps工作流咨询
ECS集群DevOps流程(基于CloudFormation)
你的初始步骤方向是对的,但可以优化得更贴合CloudFormation的编排逻辑,下面是标准化的高阶流程和问题解答:
一、首次部署的正确步骤
- 先搞定基础环境:用CloudFormation创建ECS集群、配套的VPC/子网/安全组、负载均衡器(如果需要)这些底层资源——这些属于一次性初始化的资源,后续除非架构变更,一般不需要频繁修改。
- 构建并推送Docker镜像:把代码打包成镜像,推送到ECR或其他镜像仓库,记录完整的镜像URI(比如
123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:v1)。 - 定义并部署任务定义:用CloudFormation写任务定义模板,把镜像URI做成参数(避免硬编码),执行栈创建/更新,让CloudFormation帮你注册任务定义版本。
- 部署ECS服务:用CloudFormation创建ECS服务资源,服务模板里引用任务定义的ARN(生产环境建议指定明确版本,不要用
Latest),同时配置好服务的期望任务数、负载均衡关联等参数。
二、镜像新版本发布流程
完全不需要创建新服务或销毁旧服务,正确的操作流程是:
- 构建推送新版本镜像:生成带新标签的镜像(比如
v2),推送到镜像仓库。 - 更新任务定义版本:
- 如果你用CloudFormation管理任务定义,只需要更新模板里的镜像URI参数,执行
aws cloudformation update-stack,CloudFormation会自动注册新的任务定义版本。 - 也可以直接用CLI命令:
aws ecs register-task-definition --cli-input-json file://updated-task-def.json,基于旧版本修改镜像URI生成新版本。
- 如果你用CloudFormation管理任务定义,只需要更新模板里的镜像URI参数,执行
- 触发服务更新:
- 若服务由CloudFormation管理,更新服务模板中引用的任务定义版本,执行栈更新即可;如果之前服务配置了自动更新策略,CloudFormation会自动触发滚动更新。
- 也可以直接用CLI触发:
aws ecs update-service --cluster <集群名> --service <服务名> --task-definition <新任务定义ARN>。
三、滚动更新的实现
ECS原生支持滚动更新,结合CloudFormation配置即可实现无中断发布:
- 在CloudFormation的ECS服务资源中,配置
DeploymentConfiguration来控制更新节奏:DeploymentConfiguration: MaximumPercent: 200 # 更新期间允许运行的最大任务数为期望数的200%(比如期望2个任务,最多能跑4个) MinimumHealthyPercent: 100 # 更新期间至少保持100%的健康任务数(确保业务不中断) - 给任务定义里的容器配置健康检查,比如:
ECS会基于健康检查结果判断新任务是否就绪,只有新任务健康后才会终止旧任务。HealthCheck: Command: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"] Interval: 30 Timeout: 5 Retries: 3 - 如果更新出问题,要么用CloudFormation的回滚功能恢复到之前的栈状态,要么执行
aws ecs update-service指定旧版本任务定义快速回滚。
内容的提问来源于stack exchange,提问作者jimmy_terra
相关产品推荐
相关产品推荐

