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

如何基于使用情况启停AWS Fargate任务以节约成本?

基于访问流量启停AWS Fargate任务以节约成本

要实现“无流量时停止Fargate任务、有访问时启动任务”的自动启停逻辑,核心是结合AWS负载均衡、监控和无服务器计算服务触发操作,以下是具体落地方案:

一、触发任务启动的逻辑

当用户访问应用时,若没有运行中的Fargate任务,负载均衡的目标组会处于不健康状态,此时通过监控触发Lambda函数启动任务:

  1. 配置ALB与ECS目标组

    • 创建应用负载均衡(ALB),关联ECS任务对应的目标组,设置合理的健康检查规则(比如检查HTTP 200响应,间隔30秒)。
    • 目标组无需预先注册任务,Fargate任务启动后会自动注册到目标组。
  2. 编写启动任务的Lambda函数
    用Python + Boto3调用ECS API启动任务,示例代码:

    import boto3
    
    ecs_client = boto3.client('ecs')
    
    def lambda_handler(event, context):
        try:
            run_response = ecs_client.run_task(
                cluster='你的ECS集群名称',
                taskDefinition='你的任务定义名称:版本号',
                launchType='FARGATE',
                networkConfiguration={
                    'awsvpcConfiguration': {
                        'subnets': ['subnet-xxxxxx'],
                        'securityGroups': ['sg-xxxxxx'],
                        'assignPublicIp': 'ENABLED' # 根据你的网络架构调整
                    }
                },
                count=1
            )
            return {'statusCode': 200, 'body': f"成功启动任务: {run_response['tasks'][0]['taskArn']}"}
        except Exception as e:
            return {'statusCode': 500, 'body': f"启动任务失败: {str(e)}"}
    
  3. 配置CloudWatch Alarm触发启动

    • 监控目标组的HealthyHostCount指标,当该指标连续5分钟为0时,触发CloudWatch Alarm。
    • 将Alarm的目标设置为上述Lambda函数,实现无任务时自动启动。

二、触发任务停止的逻辑

当应用长时间无流量时,通过监控访问请求或资源使用率,触发Lambda函数停止运行中的任务:

  1. 编写停止任务的Lambda函数
    先查询集群中运行的Fargate任务,再调用API停止任务,示例代码:

    import boto3
    
    ecs_client = boto3.client('ecs')
    
    def lambda_handler(event, context):
        try:
            # 获取集群中运行的Fargate任务
            task_list = ecs_client.list_tasks(
                cluster='你的ECS集群名称',
                launchType='FARGATE',
                desiredStatus='RUNNING'
            )
            
            if task_list['taskArns']:
                for task_arn in task_list['taskArns']:
                    ecs_client.stop_task(
                        cluster='你的ECS集群名称',
                        task=task_arn,
                        reason='检测到无流量访问,停止任务节约成本'
                    )
                return {'statusCode': 200, 'body': f"成功停止{len(task_list['taskArns'])}个任务"}
            else:
                return {'statusCode': 200, 'body': '未找到运行中的任务'}
        except Exception as e:
            return {'statusCode': 500, 'body': f"停止任务失败: {str(e)}"}
    
  2. 配置CloudWatch Alarm触发停止
    两种监控维度可选:

    • 基于ALB请求量:监控ALB的RequestCount指标,当连续10分钟请求数为0时触发Alarm,调用停止任务的Lambda。
    • 基于任务资源使用率:监控ECS任务的CPUUtilization或MemoryUtilization指标,当连续10分钟使用率低于5%时触发停止。

三、关键注意事项

  • 冷启动延迟:Fargate任务启动通常需要1-2分钟,首次访问的用户会遇到延迟,若对响应速度要求高,可考虑保留1个最小运行任务,或搭配Fargate Spot补充。
  • 权限配置:给Lambda函数的IAM角色配置最小权限,需包含ecs:RunTask、ecs:StopTask、ecs:ListTasks,以及CloudWatch Events的调用权限。
  • 避免循环触发:停止任务后目标组健康主机数变为0,可能再次触发启动Alarm,建议设置停止任务的Alarm阈值时间(比如10分钟)远长于启动Alarm的时间(比如5分钟),或在Lambda中添加额外判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:35:32