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

関連情報