为了节省 Fargate 成本,我想在夜间和周末缩减由大约 100 个 ECS 服务组成的开发环境。我已经通过 Terraform 设置了自动缩放来实现这一点:
resource "aws_appautoscaling_target" "service_to_target" {
for_each = local.services_for_offpeak_scaling
max_capacity = 1
min_capacity = 1
resource_id = "service/applications/${each.value}"
scalable_dimension = "ecs:service:DesiredCount"
service_namespace = "ecs"
}
// create a scheuled action to scale down all targets in local.services_for_offpeak_scaling at 10pm
resource "aws_appautoscaling_scheduled_action" "scale_service_down" {
for_each = aws_appautoscaling_target.service_to_target
name = "${each.key}-scale-down"
service_namespace = "ecs"
resource_id = each.value.resource_id
scalable_dimension = each.value.scalable_dimension
schedule = "cron(0 22 ? * MON-FRI *)"
timezone = "Europe/London"
scalable_target_action {
min_capacity = 0
max_capacity = 0
}
}
// create a scheuled action to scale up all targets in local.services_for_offpeak_scaling weekdays only
resource "aws_appautoscaling_scheduled_action" "scale_service_up" {
for_each = aws_appautoscaling_target.service_to_target
name = "${each.key}-scale-up"
service_namespace = "ecs"
resource_id = each.value.resource_id
scalable_dimension = each.value.scalable_dimension
schedule = "cron(0 6 ? * MON-FRI *)"
timezone = "Europe/London"
scalable_target_action {
min_capacity = 1
max_capacity = 1
}
depends_on = [aws_appautoscaling_scheduled_action.scale_service_down]
}
我的问题是
max_capacity
和min_capacity
在aws_appautoscaling_target
上的目的是什么?另外,ecs 服务定义中已经定义了所需的计数吗?它们不是都是多余的吗,因为一旦应用了缩放操作,它就会保持这种状态,直到其他缩放操作启动为止?
在设置此功能之前,我最初的想法是“晚上 10 点缩小规模,然后早上 6 点恢复到之前的状态”,但我不确定如何让它回到原来的状态,而无需明确说明设置新的缩放操作?
ECS 服务定义中定义的所需计数告诉 ECS 要部署多少个服务实例。您必须在此处定义一些内容,因为该值将用于服务的初始部署。
aws_appautoscaling_target
资源允许应用程序自动扩展更改 ECS 服务的所需计数属性以响应自动扩展事件。您在此资源中定义的最小/最大容量告诉它在创建资源时应用程序自动缩放应从什么初始值开始。
aws_appautoscaling_scheduled_action
资源定义了您的自动缩放事件。这些定义了触发最小/最大自动缩放值更改的条件。当其中一项事件触发时,它会更新 aws_appautoscaling_target
资源的最小/最大值,这反过来又会更新 ECS 服务上的所需计数值,进而导致 ECS 终止某些服务实例,或部署更多服务实例服务实例。
这感觉有点复杂/冗余,因为应用程序自动缩放可以与除 ECS 之外的许多其他 AWS 服务配合使用,因此他们必须使其相当通用。