Terraform ECS 容量提供程序无法按需生成新的 ECS 实例

Terraform ECS 容量提供程序无法按需生成新的 ECS 实例

据我所读这里ECS 容量提供商应(通常)将任务置于“配置”状态并启动新的 EC2 实例,以防止任务因资源限制而立即失败

例如,如果您调用 RunTask API,并且由于资源不足(即没有活动实例具有足够的内存、vCPU、端口、ENI 和/或 GPU 来运行任务),则无法将任务放置在实例上,该任务不会立即失败,而是进入配置状态(但请注意,仅当您为容量提供商启用了托管扩展时,才会发生向配置的转换;否则,找不到容量的任务将立即失败,就像以前一样)。

我在 Terraform 中设置了一个 ECS 集群,其中包含自动缩放组和 ECS 容量提供程序。设置了自动缩放组后min_size = 1,它会立即启动一个实例……因此我相信我的启动配置没有问题。

但是,当我通过 API 反复调用“RunTask”(带有 的任务memory=128)时,任务无法立即启动,原因RESOURCE:MEMORY。而且没有启动任何新实例。

我不明白我配置错误了什么。


这一切都是在 Terraform 中设置的:

resource "aws_ecs_cluster" "ecs_cluster" {
  name = local.cluster_name


  setting {
    name  = "containerInsights"
    value = "enabled"
  }
  tags = var.tags
  capacity_providers = [aws_ecs_capacity_provider.capacity_provider.name]

  # I added this in an attempt to make it spin up new instance 
  default_capacity_provider_strategy {
    capacity_provider = aws_ecs_capacity_provider.capacity_provider.name
  }

}

resource "aws_ecs_capacity_provider" "capacity_provider" {
  name = "${var.tags.PlatformName}-stack-${var.tags.Environment}"

  auto_scaling_group_provider {
    auto_scaling_group_arn         = aws_autoscaling_group.autoscaling_group.arn
    managed_termination_protection = "DISABLED"

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

  tags = var.tags
}

#Compute
resource "aws_autoscaling_group" "autoscaling_group" {
  name                      = "${var.tags.PlatformName}-${var.tags.Environment}"
  # If we're not using it, lets not pay for it
  min_size                  = "1"
  max_size                  = var.ecs_max_size
  launch_configuration      = aws_launch_configuration.launch_config.name
  health_check_grace_period = 60
  default_cooldown          = 30
  termination_policies      = ["OldestInstance"]
  vpc_zone_identifier       = local.subnets
  protect_from_scale_in     = false

  tag {
    key                 = "Name"
    value               = "${var.tags.PlatformName}-${var.tags.Environment}"
    propagate_at_launch = true
  }

  tag {
    key                 = "AmazonECSManaged"
    value               = ""
    propagate_at_launch = true
  }

  dynamic "tag" {
    for_each = var.tags
    content {
      key = tag.key
      propagate_at_launch = true
      value = tag.value
    }
  }

  enabled_metrics = [
    "GroupDesiredCapacity",
    "GroupInServiceInstances",
    "GroupMaxSize",
    "GroupMinSize",
    "GroupPendingInstances",
    "GroupStandbyInstances",
    "GroupTerminatingInstances",
    "GroupTotalInstances",
  ]
}

答案1

这看起来像是我在 API 中执行“RunTask”时犯了一个错误(记录在这里)。我已经指定了launchType,但没有capacityProviderStrategy

来自 RunTask 文档:

当您使用集群自动扩展时,必须指定capacityProviderStrategy和 而不是launchType

这样做的结果似乎是,如果容量足够,任务就会启动,但如果容量不足,任务就会立即失败,并且不给自动缩放做出响应的机会。

我只需删除它就可以让它工作,launchType因为default_capacity_provider_strategy它已在集群上设置。

相关内容