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
相关产品推荐
相关产品推荐

