При создании политики автомасштабирования ECS вместе с ней появляются два сигнала тревоги: один для увеличения масштаба ("out"), другой для уменьшения ("in").
В созданных мною масштабированиях, которые я вижу, загрузка процессора (или интересующая метрика) проверяется каждую минуту, и автоматическое масштабирование запускается только тогда, когда три последовательные точки данных превышают порог.
Это означает, что если я увижу всплеск трафика, пройдет три минуты, прежде чем произойдет масштабирование. (На самом деле, в среднем нарушение порога происходит в середине интервала выборки, поэтому задержка составляет три с половиной минуты)
Я могу настроить частоту выборки и необходимое количество точек данных через веб-интерфейс консоли AWS.
Однако я хотел бы управлять своей инфраструктурой с помощью Terraform.
Как я могу использовать Terraform, но без ручного кликерства, чтобы сократить время между (а) первым нарушением порога и (б) моментом времени, когда я начинаю масштабирование? (Также: является ли это глупой попыткой? Не иду ли я по пути awk-basscards?)
Насколько я могу судить, это похоже на катание по льду: создание политик автомасштабирования (что я могу делать через Terraform) автоматически создает два сигнала тревоги и возвращает ручки к ним (см. https://docs.aws.amazon.com/autoscaling/application/APIReference/API_PutScalingPolicy.html), но Terraform не раскрывает эти ручки (см. https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/appautoscaling_policy#attributes-reference). Возможно ли это в Terraform? Требует ли это героических усилий?
Вы определенно можете добиться этого с помощью Terraform. Есть несколько способов добиться этого, но я остановлюсь на том, который дает вам больше гибкости.
Предположим, у вас уже определен ресурс aws_autoscaling_group
, после этого вам нужно определить политики масштабирования для ASG и CloudWatch
сигналы тревоги, которые будут их вызывать.
Я обычно отслеживаю 3 различные метрики для автомасштабирования: MemoryReservation, CPUReservation и CPUUtilization.
resource "aws_autoscaling_policy" "my-cpu-scale-up" {
name = "my-cpu-scale-up"
scaling_adjustment = 1
adjustment_type = "ChangeInCapacity"
cooldown = 60
autoscaling_group_name = aws_autoscaling_group.[your-asg-resource].name
}
resource "aws_autoscaling_policy" "my-cpu-scale-down" {
name = "my-cpu-scale-down"
scaling_adjustment = -1
adjustment_type = "ChangeInCapacity"
cooldown = 300
autoscaling_group_name = aws_autoscaling_group.[your-asg-resource].name
}
resource "aws_cloudwatch_metric_alarm" "my-cpu-usage-high" {
alarm_name = "my-cpu-usage-high"
comparison_operator = "GreaterThanOrEqualToThreshold"
evaluation_periods = "2"
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = "60" // in seconds
statistic = "Average"
threshold = "70" // in %
alarm_description = "This metric monitors the cluster for high CPU usage"
alarm_actions = [
aws_autoscaling_policy.my-cpu-scale-up.arn
]
dimensions ={
AutoScalingGroupName= aws_autoscaling_group.[your-asg-resource].name
}
}
resource "aws_cloudwatch_metric_alarm" "my-cpu-usage-low" {
alarm_name = "my-cpu-usage-low"
comparison_operator = "LessThanOrEqualToThreshold"
evaluation_periods = "2"
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = "60"
statistic = "Average"
threshold = "20"
alarm_description = "This metric monitors my cluster for low CPU usage"
alarm_actions = [
aws_autoscaling_policy.my-cpu-scale-down.arn
]
dimensions ={
AutoScalingGroupName= aws_autoscaling_group.[your-asg-resource].name
}
}
Как вы можете видеть из этого примера, мы можем играть с конфигурацией сигналов тревоги, пока не добьемся желаемого результата.
Надеюсь, это поможет!