O provedor de capacidade Terraform ECS não resulta em novas instâncias ECS sob demanda

O provedor de capacidade Terraform ECS não resulta em novas instâncias ECS sob demanda

Pelo que liaquiOs provedores de capacidade do ECS devem (geralmente) evitar que as tarefas falhem imediatamente nos limites de recursos, colocando-as em um estado de "Provisionamento" e criando uma nova instância do EC2

Isso significa, por exemplo, se você chamar a API RunTask e as tarefas não forem colocadas em uma instância devido a recursos insuficientes (o que significa que nenhuma instância ativa tinha memória, vCPUs, portas, ENIs e/ou GPUs suficientes para executar as tarefas ),em vez de falhar imediatamente, a tarefa entrará no estado de provisionamento(observe, no entanto, que a transição para o provisionamento só acontece se você tiver habilitado o dimensionamento gerenciado para o provedor de capacidade; caso contrário, as tarefas que não conseguirem encontrar capacidade falharão imediatamente, como acontecia anteriormente).

Configurei um cluster ECS, com grupo de escalonamento automático e provedor de capacidade ECS no terraform. O grupo de escalonamento automático é definido min_size = 1e imediatamente inicia uma única instância... então estou confiante de que minha configuração de inicialização está correta.

No entanto, quando chamo "RunTask" repetidamente por meio da API (tarefas com memory=128), recebo tarefas que não iniciam imediatamente com reason RESOURCE:MEMORY. Além disso, nenhuma nova instância é iniciada.

Não consigo descobrir o que configurei incorretamente.


Tudo isso foi configurado no 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",
  ]
}

Responder1

Parece que isso se deve a um erro que cometi ao executar "RunTask" na API (documentado aqui). Eu tinha especificado launchTypee não capacityProviderStrategy.

Da documentação do RunTask:

Ao usar o escalonamento automático de cluster, você deve especificar capacityProviderStrategye não launchType.

Parece que o resultado disso é que as tarefas serão iniciadas se houver capacidade, mas falharão imediatamente se houver capacidade insuficiente e não darão ao escalonamento automático uma chance de responder.

Consegui fazê-lo funcionar simplesmente excluindo launchTypeporque default_capacity_provider_strategyestava definido no cluster.

informação relacionada