
Por lo que leíaquíLos proveedores de capacidad de ECS deberían (generalmente) evitar que las tareas fallen inmediatamente debido a los límites de recursos colocándolas en un estado de "Aprovisionamiento" y activando una nueva instancia EC2.
Esto significa, por ejemplo, si llama a la API RunTask y las tareas no se colocan en una instancia debido a recursos insuficientes (lo que significa que ninguna instancia activa tenía suficiente memoria, vCPU, puertos, ENI y/o GPU para ejecutar las tareas). ),en lugar de fallar inmediatamente, la tarea pasará al estado de aprovisionamiento(tenga en cuenta, sin embargo, que la transición al aprovisionamiento solo ocurre si ha habilitado el escalado administrado para el proveedor de capacidad; de lo contrario, las tareas que no puedan encontrar capacidad fallarán inmediatamente, como lo hicieron anteriormente).
Configuré un clúster ECS, con un grupo de escalado automático y un proveedor de capacidad ECS en terraform. El grupo de escalado automático está configurado min_size = 1
e inmediatamente activa una sola instancia... así que estoy seguro de que mi configuración de lanzamiento está bien.
Sin embargo, cuando llamo repetidamente a "RunTask" a través de la API (tareas con memory=128
), obtengo tareas que no se inician inmediatamente con un motivo RESOURCE:MEMORY
. Además, no se inician nuevas instancias.
No puedo entender qué he configurado mal.
Todo esto fue configurado en 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",
]
}
Respuesta1
Se ve así debido a un error que cometí al ejecutar "RunTask" en la API (documentado aquí). Lo había especificado launchType
y no capacityProviderStrategy
.
De la documentación de RunTask:
Cuando utiliza el escalado automático de clústeres, debe especificar
capacityProviderStrategy
y nolaunchType
.
Parece que el resultado de esto es que las tareas se iniciarán si hay capacidad, pero fallarán inmediatamente si no hay capacidad suficiente y no darán al escalado automático la oportunidad de responder.
Pude hacer que funcionara simplemente eliminándolo launchType
porque default_capacity_provider_strategy
estaba configurado en el clúster.