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

AWS ECS Fargate新镜像优雅部署方案咨询

ECS Fargate批处理优雅部署方案(适配长时任务)

针对你遇到的强制部署导致运行中批处理任务无法优雅完成、SIGTERM超时不足的问题,这里提供几个可落地的方案,适配Bitbucket Pipelines+AWS CLI的自动化流程:

方案一:蓝绿部署(服务级替换)

如果你的批处理是通过ECS服务管理的(比如服务负责调度任务),这种方式可以完全避免终止运行中任务:

  • 先基于新镜像注册更新后的任务定义
  • 创建一个全新的ECS服务(命名可加入版本/构建号,比如batch-service-v2),使用新任务定义,初始期望任务数设为0(如果是按需触发批处理)或和旧服务一致
  • 将旧服务的期望任务数设为0,这样旧服务不会再启动新任务,但已运行的任务会继续执行直到自然完成
  • 待旧服务所有任务执行完毕后,可选择删除旧服务

对应的AWS CLI命令(可直接放到Bitbucket Pipelines脚本中):

# 1. 注册新任务定义(从旧定义更新镜像,也可以用JSON文件传入)
aws ecs register-task-definition \
  --family your-batch-task-family \
  --container-definitions '[
    {"name": "batch-container", "image": "your-ecr-repo/your-image:new-tag", "essential": true}
  ]' \
  --launch-type FARGATE

# 2. 创建新服务
aws ecs create-service \
  --cluster your-cluster \
  --service-name batch-service-v$BITBUCKET_BUILD_NUMBER \
  --task-definition your-batch-task-family:latest \
  --desired-count 0 \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxx],securityGroups=[sg-xxxx],assignPublicIp=ENABLED}"

# 3. 停止旧服务的任务调度
aws ecs update-service \
  --cluster your-cluster \
  --service batch-service-v$(($BITBUCKET_BUILD_NUMBER-1)) \
  --desired-count 0

方案二:延长任务终止超时+独立启动新任务

如果你的批处理是直接触发单个ECS任务而非通过服务管理,可以通过调整任务的终止等待时间,同时直接启动新镜像的任务:

  • 更新任务定义,设置stopTimeout参数(最大值3600秒,即1小时),拉长SIGTERM到SIGKILL的等待窗口,匹配你的任务处理时长
  • 直接启动使用新镜像的任务,旧任务会在完成当前工作后自然退出,无需主动终止

更新任务定义的命令:

aws ecs register-task-definition \
  --family your-batch-task-family \
  --container-definitions '[
    {
      "name": "batch-container",
      "image": "your-ecr-repo/your-image:new-tag",
      "essential": true,
      "stopTimeout": 3600, # 按需调整,最大3600秒
      "command": ["your-batch-command"]
    }
  ]' \
  --launch-type FARGATE

启动新任务:

aws ecs run-task \
  --cluster your-cluster \
  --task-definition your-batch-task-family:latest \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxx],securityGroups=[sg-xxxx],assignPublicIp=ENABLED}"

方案三:自动化流程优化(Bitbucket Pipelines配置)

把上述步骤集成到bitbucket-pipelines.yml中,实现一键自动化部署:

pipelines:
  default:
    - step:
        name: Deploy Batch to ECS Fargate
        script:
          # 配置AWS凭证(建议用Bitbucket的环境变量存储)
          - aws configure set aws_access_key_id $AWS_ACCESS_KEY
          - aws configure set aws_secret_access_key $AWS_SECRET_KEY
          - aws configure set region $AWS_REGION
          
          # 注册新任务定义
          - aws ecs register-task-definition --family your-batch-task --cli-input-json file://task-def.json
          
          # 蓝绿部署:创建新服务+停止旧服务调度
          - NEW_SERVICE_NAME="batch-service-v$BITBUCKET_BUILD_NUMBER"
          - OLD_SERVICE_NAME="batch-service-v$(($BITBUCKET_BUILD_NUMBER-1))"
          - aws ecs create-service --cluster your-cluster --service-name $NEW_SERVICE_NAME --task-definition your-batch-task:latest --desired-count 0 --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[subnet-xxx],securityGroups=[sg-xxx],assignPublicIp=ENABLED}"
          - aws ecs update-service --cluster your-cluster --service $OLD_SERVICE_NAME --desired-count 0

关键提醒

  • 确保你的批处理代码能正确监听SIGTERM信号,收到信号后立刻停止接收新工作,完成当前任务后主动退出,不要依赖ECS的强制终止
  • 服务命名用版本/构建号区分,方便后续管理和清理旧服务
  • 如果用方案二,要确认任务的stopTimeout设置符合AWS的限制(最大3600秒),同时任务本身的处理逻辑不会无限挂起

内容的提问来源于stack exchange,提问作者kevinc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:32:09