通过AWS SDK for Node.js调整ECS Fargate服务自动扩缩容最小任务数
解决ECS高峰时段保持指定任务数的方案
问题核心是你只修改了ECS服务的desiredCount,但ECS的自动扩缩容策略由Application Auto Scaling管理,它会根据配置的最小/最大容量和指标自动调整任务数,所以单独改desiredCount会被策略覆盖。要实现高峰时段固定10个任务,需要同时调整自动扩缩容的最小容量,具体方案如下:
核心思路
- 高峰时段(早7点-下午1点):
- 修改Application Auto Scaling的**可扩展目标(Scalable Target)**的最小容量为10
- 将ECS服务的
desiredCount设为10
这样自动扩缩容策略不会将任务数缩到10以下,同时如果需求激增,仍可根据策略扩容到最大容量(如果需要完全固定10个,也可以把最大容量也设为10)
- 高峰结束后:
- 将可扩展目标的最小容量改回原有值(比如原来的2)
- 让自动扩缩容策略恢复正常调整任务数
实现代码(TypeScript)
1. 修改Application Auto Scaling的最小/最大容量
import AWS from 'aws-sdk'; const applicationAutoScaling = new AWS.ApplicationAutoScaling({ apiVersion: '2016-02-06', region: process.env.AWS_REGION }); // 修改可扩展目标的容量范围 static updateScalableTargetCapacity = async (minCapacity: number, maxCapacity: number) => { const params: AWS.ApplicationAutoScaling.UpdateScalableTargetRequest = { ServiceNamespace: 'ecs', ResourceId: `service/${process.env.AWS_ECS_CLUSTER}/${process.env.AWS_ECS_SERVICE}`, ScalableDimension: 'ecs:service:DesiredCount', MinCapacity: minCapacity, MaxCapacity: maxCapacity }; const ret = await applicationAutoScaling.updateScalableTarget(params).promise(); return ret; };
2. 高峰时段设置任务数的完整函数
// 高峰时段设置:固定最小10个任务 static setPeakMode = async () => { // 先修改自动扩缩容的最小容量为10 await this.updateScalableTargetCapacity(10, process.env.AWS_ECS_MAX_TASKS || 20); // 这里填你的原有最大容量 // 再设置ECS服务的desiredCount为10 const ecs = new AWS.ECS({ apiVersion: '2014-11-13', region: process.env.AWS_REGION }); const ecsParams: AWS.ECS.UpdateServiceRequest = { cluster: process.env.AWS_ECS_CLUSTER, service: process.env.AWS_ECS_SERVICE, desiredCount: 10, forceNewDeployment: false // 如果不需要强制重新部署可以设为false }; await ecs.updateService(ecsParams).promise(); console.log('已进入高峰模式,保持至少10个任务运行'); };
3. 高峰结束后恢复自动扩缩容的函数
// 恢复正常模式:改回原有最小容量 static setNormalMode = async () => { const originalMinCapacity = 2; // 替换成你原来的最小任务数 const originalMaxCapacity = 20; // 替换成你原来的最大任务数 // 修改自动扩缩容的最小容量回原值 await this.updateScalableTargetCapacity(originalMinCapacity, originalMaxCapacity); // 可选:让自动扩缩容自动调整desiredCount,也可以不设置,让策略自己调整 const ecs = new AWS.ECS({ apiVersion: '2014-11-13', region: process.env.AWS_REGION }); const ecsParams: AWS.ECS.UpdateServiceRequest = { cluster: process.env.AWS_ECS_CLUSTER, service: process.env.AWS_ECS_SERVICE, desiredCount: originalMinCapacity // 或者不设置,让策略根据指标调整 }; await ecs.updateService(ecsParams).promise(); console.log('已恢复正常模式,自动扩缩容策略生效'); };
关键注意事项
- 权限配置:执行代码的IAM角色需要添加以下权限:
application-autoscaling:UpdateScalableTargetecs:UpdateService
- 定时触发:可以用AWS EventBridge(原CloudWatch Events)创建定时规则,每天早7点触发
setPeakMode函数,下午1点触发setNormalMode函数 - 完全固定任务数:如果需要高峰时段完全保持10个任务(不允许扩容),可以在
setPeakMode中将MaxCapacity也设为10,这样自动扩缩容策略不会调整任务数
内容的提问来源于stack exchange,提问作者Ton Vital
相关产品推荐
相关产品推荐

