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

AWS ECS多服务部署:如何规避容量提供商数量限制?

问题:同一ECS集群部署多服务,规避Capacity Provider数量限制

现有Terraform部署框架代码

resource "aws_launch_template" "engine" {
  image_id      = "ami-05339d597592d45cf" # Amazon ECS-Optimized Amazon Linux 2 (AL2) x86_64 AMI

  vpc_security_group_ids = [var.security_group_id]
  iam_instance_profile {
  }
}

resource "aws_autoscaling_group" "asg" {
  launch_template {
    id = aws_launch_template.engine[each.key].id
  }
}

resource "aws_ecs_capacity_provider" "provider" {
  auto_scaling_group_provider {
    auto_scaling_group_arn = aws_autoscaling_group.asg[each.key].arn

    managed_scaling {
    }
  }
}

resource "aws_ecs_cluster_capacity_providers" "providers" {
  cluster_name       = aws_ecs_cluster.cluster.name
  capacity_providers = [for provider in aws_ecs_capacity_provider.provider : provider.name]
}

resource "aws_ecs_cluster" "cluster" {
  name = var.module_name
}

resource "aws_ecs_task_definition" "task_definition" {
}

resource "aws_ecs_service" "service" {
  capacity_provider_strategy {
    capacity_provider = var.capacity_providers[each.value.instance_type].name
  }
  network_configuration {
  }
}

认知与实际遭遇

  • 认为ASG管理的1台EC2只能承载1个服务的1个任务,资源会被完全占用;
  • 误以为1个ASG仅能对应1个服务,且ECS集群最多注册6个Capacity Provider;
  • 尝试复用已在用的Capacity Provider部署新服务(ASG期望容量1、最大容量10),但新服务无法启动,Provider未触发实例扩容。

实际配置代码

resource "aws_autoscaling_group" "asg" {
  for_each = local.instance_types

  name                = "${var.module_name}-${each.key}"
  vpc_zone_identifier = [var.subnet_id]

  desired_capacity          = 1
  min_size                  = 0
  max_size                  = 10
  health_check_grace_period = 300
  health_check_type         = "EC2"

  launch_template {
    id = aws_launch_template.engine[each.key].id
  }
}

resource "aws_ecs_capacity_provider" "provider" {
  for_each = local.instance_types

  name = "${var.module_name}-${replace(each.key, ".", "_")}"
  auto_scaling_group_provider {
    auto_scaling_group_arn = aws_autoscaling_group.asg[each.key].arn

    managed_scaling {
      status                    = "ENABLED"
      target_capacity           = 100
      minimum_scaling_step_size = 1
      maximum_scaling_step_size = 100
    }
  }
}

resource "aws_ecs_service" "service" {
  for_each = var.accounts

  name                               = "${var.module_name}-${each.key}"
  cluster                            = var.cluster_id
  task_definition                    = aws_ecs_task_definition.task_definition[each.key].arn
  desired_count                      = 1
  deployment_maximum_percent         = 100
  deployment_minimum_healthy_percent = 0

  capacity_provider_strategy {
    weight            = 1
    capacity_provider = var.capacity_providers[each.value.instance_type].name
  }
  network_configuration {
    subnets         = [var.subnet_id]
    security_groups = [var.security_group_id]
  }

  tags = var.tags
}

实际问题

需要在同一ECS集群部署多个服务,但当前认知下每个服务需独立Capacity Provider(对应独立ASG),受限于6个的数量上限;且部署两个不同任务定义的服务时,第二个服务因EC2资源不足无法启动,集群仅运行1台EC2实例。

请教如何在同一ECS集群中部署多服务,同时规避Capacity Provider数量限制?


解决方案

1. 澄清关键认知错误

  • EC2实例可承载多任务:只要实例CPU、内存等资源未耗尽,就能运行多个不同服务的任务。需检查任务定义的资源预留值,避免过度占用实例资源。
  • 单个ASG/Capacity Provider可对应多服务:网传“1个ASG仅对应1个服务”错误,同一个Capacity Provider可被多个ECS服务共用,只需服务的容量策略指向该Provider即可。

2. 调整Capacity Provider与ASG配置

  • 按实例类型聚合ASG:无需为每个服务创建独立ASG和Capacity Provider,只需为每种实例类型各创建一组,所有使用该类型实例的服务共用这组资源。
  • 优化Managed Scaling参数:当前target_capacity=100会让ECS尽量把实例资源推满,导致后续服务无资源可用。建议将target_capacity调整为70-80,预留部分资源供多任务调度;同时将ASG的desired_capacity设为0,让ECS根据任务需求自动扩容。

3. 修改Terraform代码实现复用

调整Capacity Provider与ASG配置

# 按实例类型创建ASG,同类型实例共用一组
resource "aws_autoscaling_group" "asg" {
  for_each = local.instance_types

  name                = "${var.module_name}-instance-${each.key}"
  vpc_zone_identifier = [var.subnet_id]

  desired_capacity          = 0 # 交由ECS自动管理容量
  min_size                  = 0
  max_size                  = 10
  health_check_grace_period = 300
  health_check_type         = "EC2"

  launch_template {
    id = aws_launch_template.engine[each.key].id
  }
}

# 按实例类型创建Capacity Provider
resource "aws_ecs_capacity_provider" "provider" {
  for_each = local.instance_types

  name = "${var.module_name}-cp-${replace(each.key, ".", "_")}"
  auto_scaling_group_provider {
    auto_scaling_group_arn = aws_autoscaling_group.asg[each.key].arn

    managed_scaling {
      status                    = "ENABLED"
      target_capacity           = 70 # 预留资源给多任务
      minimum_scaling_step_size = 1
      maximum_scaling_step_size = 100
      warm_pool_size            = 1 # 可选,预热实例提升调度速度
    }

    managed_termination_protection = "ENABLED"
  }
}

# 关联所有Capacity Provider到集群,并设置默认策略
resource "aws_ecs_cluster_capacity_providers" "providers" {
  cluster_name       = aws_ecs_cluster.cluster.name
  capacity_providers = [for cp in aws_ecs_capacity_provider.provider : cp.name]
  default_capacity_provider_strategy {
    capacity_provider = aws_ecs_capacity_provider.provider[local.default_instance_type].name
    weight            = 1
  }
}

修改ECS Service配置,共用Capacity Provider

resource "aws_ecs_service" "service" {
  for_each = var.accounts

  name                               = "${var.module_name}-${each.key}"
  cluster                            = aws_ecs_cluster.cluster.id
  task_definition                    = aws_ecs_task_definition.task_definition[each.key].arn
  desired_count                      = 1
  deployment_maximum_percent         = 100
  deployment_minimum_healthy_percent = 0

  # 所有服务共用对应实例类型的Capacity Provider
  capacity_provider_strategy {
    weight            = 1
    capacity_provider = aws_ecs_capacity_provider.provider[each.value.instance_type].name
  }

  network_configuration {
    subnets         = [var.subnet_id]
    security_groups = [var.security_group_id]
  }

  tags = var.tags
}

4. 额外优化建议

  • 检查任务定义资源配置:确保每个任务的CPU、内存请求值合理,避免单个任务占用过多实例资源。例如t2.medium实例有2vCPU和4GB内存,若任务仅请求0.5vCPU和1GB内存,可同时运行多个任务。
  • 验证扩容触发条件:若复用Provider时未扩容,需检查任务资源请求总和是否超过当前实例可用资源,或调整target_capacity让ECS及时触发扩容。
  • 使用容量策略权重:若有多种实例类型的Capacity Provider,可通过权重设置调度优先级,无需为每个服务单独创建Provider。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:10:01