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

通过AWS SDK for Node.js调整ECS Fargate服务自动扩缩容最小任务数

解决ECS高峰时段保持指定任务数的方案

问题核心是你只修改了ECS服务的desiredCount,但ECS的自动扩缩容策略由Application Auto Scaling管理,它会根据配置的最小/最大容量和指标自动调整任务数,所以单独改desiredCount会被策略覆盖。要实现高峰时段固定10个任务,需要同时调整自动扩缩容的最小容量,具体方案如下:

核心思路

  1. 高峰时段(早7点-下午1点):
    • 修改Application Auto Scaling的**可扩展目标(Scalable Target)**的最小容量为10
    • 将ECS服务的desiredCount设为10
      这样自动扩缩容策略不会将任务数缩到10以下,同时如果需求激增,仍可根据策略扩容到最大容量(如果需要完全固定10个,也可以把最大容量也设为10)
  2. 高峰结束后:
    • 将可扩展目标的最小容量改回原有值(比如原来的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:UpdateScalableTarget
    • ecs:UpdateService
  • 定时触发:可以用AWS EventBridge(原CloudWatch Events)创建定时规则,每天早7点触发setPeakMode函数,下午1点触发setNormalMode函数
  • 完全固定任务数:如果需要高峰时段完全保持10个任务(不允许扩容),可以在setPeakMode中将MaxCapacity也设为10,这样自动扩缩容策略不会调整任务数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:53:13