如何使用AWS CLI等待ECS服务更新的新任务进入RUNNING状态
ECS服务更新后阻塞等待任务RUNNING的实现方案
- 优先使用AWS CLI原生的
wait子命令实现阻塞等待,不需要自行编写任务筛选、状态轮询逻辑,命令会自动轮询服务状态直到部署完成,执行失败时会返回非0退出码,可直接被Jenkins识别为构建失败。
注意:你原命令中--task-definition参数传值有误,该参数不接受本地json文件路径,需要传入已注册到ECS的任务定义名称+版本号(格式如abc:15),你需要先执行任务定义注册命令,拿到返回的任务定义标识后再传入更新命令。
完整可直接用在Jenkins里的命令序列如下:# 1. 先注册本地的任务定义文件,拿到最新版本号 TASK_DEF_ARN=$(aws ecs register-task-definition --cli-input-json file://abc.json --query 'taskDefinition.taskDefinitionArn' --output text) # 2. 触发服务更新 aws ecs update-service --cluster xyz --service abc --task-definition $TASK_DEF_ARN --force-new-deployment # 3. 阻塞等待服务稳定:即PRIMARY部署下所有期望数量的任务都进入RUNNING状态 # 默认每15秒轮询一次,最长等待10分钟,超时直接返回错误 aws ecs wait services-stable --cluster xyz --services abc - 如果你的服务启动耗时较长,超过
wait命令默认的10分钟超时阈值,可以自行实现轮询逻辑,不需要调用list-tasks筛选新任务——直接查询服务的PRIMARY部署状态即可,避免误判旧任务的状态,逻辑更可靠,参考脚本如下:# 配置最长等待时间、轮询间隔,单位秒 MAX_WAIT=1800 POLL_INTERVAL=20 elapsed=0 while [ $elapsed -lt $MAX_WAIT ]; do # 查询当前主部署的状态、运行数、期望数 deploy_info=$(aws ecs describe-services --cluster xyz --services abc \ --query 'services[0].deployments[?status==`PRIMARY`].[rolloutState, runningCount, desiredCount]' \ --output text) rollout_state=$(echo $deploy_info | awk '{print $1}') running_cnt=$(echo $deploy_info | awk '{print $2}') desired_cnt=$(echo $deploy_info | awk '{print $3}') if [ "$rollout_state" = "COMPLETED" ] && [ "$running_cnt" -eq "$desired_cnt" ]; then echo "部署完成,共$running_cnt个任务已进入RUNNING状态" exit 0 fi if [ "$rollout_state" = "FAILED" ]; then echo "ECS服务部署失败" exit 1 fi echo "部署中,当前状态:$rollout_state,已启动任务数:$running_cnt/$desired_cnt,${POLL_INTERVAL}秒后重试..." sleep $POLL_INTERVAL elapsed=$((elapsed + POLL_INTERVAL)) done echo "等待部署超时,超过最长等待时间${MAX_WAIT}秒" exit 1
不推荐使用
list-tasks筛选新任务的方案:每次服务更新时新启动的任务都会归属到PRIMARY状态的部署分组,旧任务会在新部署稳定后逐步被终止,直接查询服务的部署字段不需要对比任务创建时间,不会出现把旧任务误判为新部署任务的问题,稳定性更高。
内容的提问来源于stack exchange,提问作者Springhills
相关产品推荐
相关产品推荐

