当您创建 ECS 自动扩展策略时,会同时标记两个警报:一个用于扩大规模(“out”),一个用于缩小规模(“in”)。
我看到的创建的横向扩展似乎每分钟对 CPU 利用率(或感兴趣的指标)进行采样,并且仅当三个连续数据点突破阈值时才触发自动扩展。
这意味着,如果我看到流量激增,则需要三分钟才能进行扩展。 (事实上,平均而言,阈值突破将发生在采样间隔的中间,因此延迟为三分半钟。)
我可以通过 AWS 控制台 Web 界面调整采样率和所需的数据点数量。
但是,我想通过 Terraform 管理我的基础设施。
我如何使用 Terraform 而不使用手动点击来缩短 (a) 第一次突破阈值之间的时间;以及 (b) 我开始扩展的时间点?(另外:尝试这样做是愚蠢的吗?我是否要以 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 中是否仍有可能实现?是否需要付出巨大的努力?
答案1
您绝对可以使用 Terraform 实现这一点。有几种方法可以实现这一点,但我将重点介绍一种可以为您提供更多灵活性的方法。
假设您已经aws_autoscaling_group
定义了资源,之后您需要为 ASG 定义扩展策略以及CloudWatch
将触发这些策略的警报。我通常会跟踪 3 个不同的自动扩展指标:MemoryReservation、CPUReservation 和 CPUUtilization。
如何根据 CPUUtilization 设置自动缩放的示例。
我们的 ASG 的扩展策略:
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
}
CloudWatch 警报将触发我们的某项策略。
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
}
}
从这个例子中可以看出,我们可以尝试各种警报配置,直到达到预期的结果。
希望有帮助!