
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 = 1
e 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 launchType
e não capacityProviderStrategy
.
Da documentação do RunTask:
Ao usar o escalonamento automático de cluster, você deve especificar
capacityProviderStrategy
e nãolaunchType
.
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 launchType
porque default_capacity_provider_strategy
estava definido no cluster.