
私が読んだところによるとここ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