如何每日夜间定时重启AWS Fargate持续运行任务?
实现AWS Fargate任务每日自动重启的简便方法
方法1:利用ECS服务的强制部署(推荐)
这是最稳妥的方式,完全依托ECS自身的部署机制来替换任务:
- 提前确认你的ECS服务配置了合理的最小健康百分比和最大健康百分比(比如设为0和100,保证旧任务停掉后再启动新任务,避免资源浪费)。
- 用EventBridge创建每日夜间的定时规则,触发一个Lambda函数执行强制部署:
调用ECS的update-serviceAPI时加上forceNewDeployment=true参数,这个参数会让ECS忽略任务定义是否变化,直接重新部署所有运行中的任务,自动完成旧任务停止、新任务启动的流程。
Python版Lambda示例代码:import boto3 ecs_client = boto3.client('ecs') def lambda_handler(event, context): ecs_client.update_service( cluster='你的ECS集群名称', service='你的ECS服务名称', forceNewDeployment=True ) return {'statusCode': 200, 'body': '重启触发成功'}
方法2:定时停止旧任务,依赖服务自动补全
如果不想用部署机制,可以直接停止运行中的任务,让ECS服务自动启动新任务补位:
- 确保你的ECS服务的期望任务数设置为固定值(比如1),这样旧任务被停止后,服务会立刻启动新任务维持数量。
- 用EventBridge定时触发Lambda,先列出当前运行的任务,再逐个调用
stop-taskAPI停止:
Python版Lambda示例代码:
注意:这种方式可能会有短暂的服务中断,适合对可用性要求不高的场景。import boto3 ecs_client = boto3.client('ecs') def lambda_handler(event, context): # 获取目标服务下的运行中任务 running_tasks = ecs_client.list_tasks( cluster='你的ECS集群名称', serviceName='你的ECS服务名称', desiredStatus='RUNNING' )['taskArns'] # 逐个停止任务 for task_arn in running_tasks: ecs_client.stop_task( cluster='你的ECS集群名称', task=task_arn, reason='每日夜间定时重启' ) return {'statusCode': 200, 'body': '任务停止完成,服务将自动启动新任务'}
方法3:借助任务定义的微小更新触发部署
如果不想用forceNewDeployment参数,也可以通过修改任务定义的微小配置(比如加个无关紧要的环境变量)来触发部署:
- 在Lambda中先复制当前的任务定义,添加一个带时间戳的环境变量(比如
RESTART_TIMESTAMP=当前时间),注册为新的任务定义版本。 - 调用
update-serviceAPI将服务的任务定义切换到新版本,ECS会自动部署新任务并替换旧任务。
这种方式稍显繁琐,不如前两种直接,适合有特殊需求的场景。
内容的提问来源于stack exchange,提问作者Kai Sellgren
相关产品推荐
相关产品推荐

