
Von dem, was ich gelesen habeHierECS-Kapazitätsanbieter sollten (im Allgemeinen) verhindern, dass Aufgaben sofort an Ressourcengrenzen scheitern, indem sie sie in den Status „Provisioning“ versetzen und eine neue EC2-Instanz starten.
Dies bedeutet beispielsweise, dass, wenn Sie die RunTask-API aufrufen und die Aufgaben aufgrund unzureichender Ressourcen nicht auf einer Instanz platziert werden (d. h. keine aktive Instanz verfügte über ausreichend Speicher, vCPUs, Ports, ENIs und/oder GPUs, um die Aufgaben auszuführen),Anstatt sofort zu scheitern, wechselt die Aufgabe in den Bereitstellungsstatus(Beachten Sie jedoch, dass der Übergang zur Bereitstellung nur erfolgt, wenn Sie die verwaltete Skalierung für den Kapazitätsanbieter aktiviert haben. Andernfalls schlagen Aufgaben, die keine Kapazität finden können, sofort fehl, wie dies zuvor der Fall war.)
Ich habe einen ECS-Cluster mit Autoscaling-Gruppe und ECS-Kapazitätsanbieter in Terraform eingerichtet. Die Autoscaling-Gruppe ist eingerichtet min_size = 1
und startet sofort eine einzelne Instanz. Ich bin also zuversichtlich, dass meine Startkonfiguration in Ordnung ist.
Wenn ich jedoch „RunTask“ wiederholt über die API aufrufe (Aufgaben mit memory=128
), werden die Aufgaben mit der Begründung nicht sofort gestartet RESOURCE:MEMORY
. Außerdem werden keine neuen Instanzen gestartet.
Ich kann nicht herausfinden, was ich falsch konfiguriert habe.
Dies wurde alles in Terraform eingerichtet:
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",
]
}
Antwort1
Es sieht so aus, als ob dies auf einen Fehler zurückzuführen ist, den ich bei der Ausführung von "RunTask" in der API gemacht habe (hier dokumentiert). Ich hatte angegeben launchType
und nicht capacityProviderStrategy
.
Aus der RunTask-Dokumentation:
Wenn Sie Cluster Auto Scaling verwenden, müssen Sie
capacityProviderStrategy
und nicht angebenlaunchType
.
Dies scheint zur Folge zu haben, dass Aufgaben zwar gestartet werden, wenn die Kapazität vorhanden ist, bei unzureichender Kapazität jedoch sofort fehlschlagen und der automatischen Skalierung keine Chance gegeben wird, zu reagieren.
Ich konnte es einfach durch Löschen zum Laufen bringen, launchType
da default_capacity_provider_strategy
es im Cluster festgelegt war.