Terraform

Terraform ECS 容量提供程序不會按需生成新的 ECS 實例

  • July 25, 2021

從我在這裡讀到的內容, ECS 容量提供者應該(通常)通過將任務置於“Provisioning”狀態並啟動新的 EC2 實例來防止任務立即因資源限製而失敗

這意味著,例如,如果您呼叫 RunTask API 並且由於資源不足(意味著沒有活動實例具有足夠的記憶體、vCPU、埠、ENI 和/或 GPU 來執行任務)而沒有將任務放置在實例上),而不是立即失敗,任務將進入配置狀態(但是請注意,只有在您為容量提供程序啟用託管擴展時才會轉換到配置;否則,找不到容量的任務將立即失敗,就像他們之前所做的那樣)。

我已經設置了一個 ECS 集群,在 terraform 中具有自動縮放組和 ECS 容量提供程序。自動縮放組設置為min_size = 1並立即啟動單個實例……所以我相信我的啟動配置很好。

但是,當我通過 API 反複呼叫“RunTask”(帶有 的任務memory=128)時,我得到的任務無法立即以 reason 啟動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",
 ]
}

看起來這歸結為我在 API 中執行“RunTask”時犯的一個錯誤(在此處記錄)。我已經指定launchType而不是capacityProviderStrategy.

從 RunTask 文件:

使用集群 Auto Scaling 時,必須指定capacityProviderStrategy而不是launchType.

似乎這樣做的結果是,如果有容量,任務將啟動,但如果容量不足,任務將立即失敗,並且不給自動縮放響應的機會。

我可以通過刪除來讓它工作,launchType因為它default_capacity_provider_strategy是在集群上設置的。

引用自:https://serverfault.com/questions/1070597