从我在这里读到的内容, ECS 容量提供者应该(通常)通过将任务置于“Provisioning”状态并启动新的 EC2 实例来防止任务立即因资源限制而失败
这意味着,例如,如果您调用 RunTask API 并且由于资源不足(意味着没有活动实例具有足够的内存、vCPU、端口、ENI 和/或 GPU 来运行任务)而没有将任务放置在实例上),而不是立即失败,任务将进入配置状态(但是请注意,只有在您为容量提供程序启用托管扩展时才会转换到配置;否则,找不到容量的任务将立即失败,就像他们之前所做的那样)。
我已经设置了一个 ECS 集群,在 terraform 中具有自动缩放组和 ECS 容量提供程序。自动缩放组设置为min_size = 1
并立即启动单个实例......所以我相信我的启动配置很好。
但是,当我通过 API 反复调用“RunTask”(带有 的任务memory=128
)时,我得到的任务无法立即以 reason 启动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",
]
}
看起来这归结为我在 API 中执行“RunTask”时犯的一个错误(在此处记录)。我已经指定
launchType
而不是capacityProviderStrategy
.从 RunTask 文档:
似乎这样做的结果是,如果有容量,任务将启动,但如果容量不足,任务将立即失败,并且不给自动缩放响应的机会。
我可以通过删除来让它工作,
launchType
因为它default_capacity_provider_strategy
是在集群上设置的。