如何最大限度地减少 Terraform 的 ecs 自动缩放反应时间?

如何最大限度地减少 Terraform 的 ecs 自动缩放反应时间?

当您创建 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
  }
}

从这个例子中可以看出,我们可以尝试各种警报配置,直到达到预期的结果。

希望有帮助!

相关内容