You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:06:40