AWS
CloudWatch
AutoScaling
TargetTrackingPolicy

規定のしきい値じゃないターゲットトラッキングポリシーを作りたかった


結論

アラームを作成してターゲットトラッキングポリシーに紐付けることはできたが、動かなかった。


やりたかったこと

ターゲットトラッキングポリシーは、CPU平均使用率や平均ネットワーク入力のしきい値を指定するだけで、それを維持できる台数にスケールしてくれる。

例えば、CPU平均使用率を30%に維持する、というポリシーだと、

スケールアウトのアラームのしきい値は

3 分間 内の 3 データポイントに対する CPUUtilization (CPUUtilization) > 30

スケールインのアラームのしきい値は

15 分間 内の 15 データポイントに対する CPUUtilization (CPUUtilization) < 27

となる。

ただし、この3 分間 内の 3 データポイント15 分間 内の 15 データポイントの部分がコンソールからは変更不可になっている。

ターゲットトラッキングポリシーを作ってから、CloudWatchAlarmを作成して紐づけて見ようと思っても、コンソールだとポリシーが表示されない。

image (1).png

なので、CLIとかCFnを使ったらなんとかできるんじゃない?と思って、やってみた。


やったこと

CFnでターゲットトラッキングポリシーとアラームを作成して紐付けるようにテンプレートを書いた。

  targetPolicy:

Type: AWS::AutoScaling::ScalingPolicy
Properties:
AdjustmentType: ChangeInCapacity
AutoScalingGroupName:
Ref: autoScalingGroup
Cooldown: "120"
EstimatedInstanceWarmup: 120
PolicyType: TargetTrackingScaling
TargetTrackingConfiguration:
DisableScaleIn: false
PredefinedMetricSpecification:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 40.0
scaleOutAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
ActionsEnabled: true
AlarmActions:
- Ref: targetPolicy
AlarmDescription: String
ComparisonOperator: GreaterThanThreshold
DatapointsToAlarm: 2
Dimensions:
- Name: AutoScalingGroupName
Value:
Ref: autoScalingGroup
EvaluationPeriods: 2
MetricName: CPUUtilization
Namespace: AWS/EC2
Period: 60
Statistic: Average
Threshold: 25.0
TreatMissingData: missing
Unit: Percent
scaleInAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
ActionsEnabled: true
AlarmActions:
- Ref: targetPolicy
AlarmDescription: String
ComparisonOperator: LessThanThreshold
DatapointsToAlarm: 5
Dimensions:
- Name: AutoScalingGroupName
Value:
Ref: autoScalingGroup
EvaluationPeriods: 5
MetricName: CPUUtilization
Namespace: AWS/EC2
Period: 60
Statistic: Average
Threshold: 20.0
TreatMissingData: missing
Unit: Percent

実行したら、こんな感じで2種類のアラームが生成された。

image (2).png

TragetTracking-ほげほげが、ターゲットトラッキングポリシーを作成すると自動で作成されるアラーム。

inra-ec2-ほげほげが、Type: AWS::CloudWatch::Alarmで自作したアラーム。

自動生成アラームも自作アラームも、以下のようにターゲットトラッキングポリシーを発火できるように設定されている。

image (4).png

このままだとスケールアウト、スケールインそれぞれ2つのアラームが紐付いているので、ターゲットトラッキングポリシーが自動で生成したほうのアラームを削除する。

aws cloudwatch delete-alarms --alarm-names TargetTracking-xxxxxx-AlarmHigh-xxxxxxxxx

aws cloudwatch delete-alarms --alarm-names TargetTracking-xxxxxx-AlarmLow-xxxxxxxxx

これで柔軟なターゲットトラッキングポリシーが使えるぞ!!

…と思って、いざCPU使用率を上げても、いくら待ってもスケールしない…

image (3).png

内部の仕組みのためかなにか分からないが、自動生成したアラーム以外だとスケーリングポリシーが動いてくれないらしい。

もしやりかたが間違ってるよとかこうやれば動くよとかあったら、ぜひ教えてください。