Amazon-Web-Services

如何從 terraform 中最小化 ecs 自動縮放反應時間?

  • June 24, 2021

當您創建 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 中還有可能嗎?需要英勇的努力嗎?

您絕對可以使用 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
 }
}

正如你從這個例子中看到的,我們可以玩弄警報配置,直到我們達到預期的結果。

希望有幫助!

引用自:https://serverfault.com/questions/1067540