如何基于使用情况启停AWS Fargate任务以节约成本?
基于访问流量启停AWS Fargate任务以节约成本
要实现“无流量时停止Fargate任务、有访问时启动任务”的自动启停逻辑,核心是结合AWS负载均衡、监控和无服务器计算服务触发操作,以下是具体落地方案:
一、触发任务启动的逻辑
当用户访问应用时,若没有运行中的Fargate任务,负载均衡的目标组会处于不健康状态,此时通过监控触发Lambda函数启动任务:
配置ALB与ECS目标组
- 创建应用负载均衡(ALB),关联ECS任务对应的目标组,设置合理的健康检查规则(比如检查HTTP 200响应,间隔30秒)。
- 目标组无需预先注册任务,Fargate任务启动后会自动注册到目标组。
编写启动任务的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)}"}配置CloudWatch Alarm触发启动
- 监控目标组的
HealthyHostCount指标,当该指标连续5分钟为0时,触发CloudWatch Alarm。 - 将Alarm的目标设置为上述Lambda函数,实现无任务时自动启动。
- 监控目标组的
二、触发任务停止的逻辑
当应用长时间无流量时,通过监控访问请求或资源使用率,触发Lambda函数停止运行中的任务:
编写停止任务的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)}"}配置CloudWatch Alarm触发停止
两种监控维度可选:- 基于ALB请求量:监控ALB的
RequestCount指标,当连续10分钟请求数为0时触发Alarm,调用停止任务的Lambda。 - 基于任务资源使用率:监控ECS任务的
CPUUtilization或MemoryUtilization指标,当连续10分钟使用率低于5%时触发停止。
- 基于ALB请求量:监控ALB的
三、关键注意事项
- 冷启动延迟: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
相关产品推荐
相关产品推荐

