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

如何每日夜间定时重启AWS Fargate持续运行任务?

实现AWS Fargate任务每日自动重启的简便方法

方法1:利用ECS服务的强制部署(推荐)

这是最稳妥的方式,完全依托ECS自身的部署机制来替换任务:

  • 提前确认你的ECS服务配置了合理的最小健康百分比和最大健康百分比(比如设为0和100,保证旧任务停掉后再启动新任务,避免资源浪费)。
  • 用EventBridge创建每日夜间的定时规则,触发一个Lambda函数执行强制部署:
    调用ECS的update-service API时加上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-task API停止:
    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-service API将服务的任务定义切换到新版本,ECS会自动部署新任务并替换旧任务。
    这种方式稍显繁琐,不如前两种直接,适合有特殊需求的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:42:46