結論
アラームを作成してターゲットトラッキングポリシーに紐付けることはできたが、動かなかった。
やりたかったこと
ターゲットトラッキングポリシーは、CPU平均使用率や平均ネットワーク入力のしきい値を指定するだけで、それを維持できる台数にスケールしてくれる。
例えば、CPU平均使用率を30%に維持する、というポリシーだと、
スケールアウトのアラームのしきい値は
3 分間 内の 3 データポイントに対する CPUUtilization (CPUUtilization) > 30
スケールインのアラームのしきい値は
15 分間 内の 15 データポイントに対する CPUUtilization (CPUUtilization) < 27
となる。
ただし、この3 分間 内の 3 データポイント
、15 分間 内の 15 データポイント
の部分がコンソールからは変更不可になっている。
ターゲットトラッキングポリシーを作ってから、CloudWatchAlarmを作成して紐づけて見ようと思っても、コンソールだとポリシーが表示されない。
なので、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
TragetTracking-ほげほげが、ターゲットトラッキングポリシーを作成すると自動で作成されるアラーム。
inra-ec2-ほげほげが、Type: AWS::CloudWatch::Alarmで自作したアラーム。
自動生成アラームも自作アラームも、以下のようにターゲットトラッキングポリシーを発火できるように設定されている。
このままだとスケールアウト、スケールインそれぞれ2つのアラームが紐付いているので、ターゲットトラッキングポリシーが自動で生成したほうのアラームを削除する。
aws cloudwatch delete-alarms --alarm-names TargetTracking-xxxxxx-AlarmHigh-xxxxxxxxx
aws cloudwatch delete-alarms --alarm-names TargetTracking-xxxxxx-AlarmLow-xxxxxxxxx
これで柔軟なターゲットトラッキングポリシーが使えるぞ!!
…と思って、いざCPU使用率を上げても、いくら待ってもスケールしない…
内部の仕組みのためかなにか分からないが、自動生成したアラーム以外だとスケーリングポリシーが動いてくれないらしい。
もしやりかたが間違ってるよとかこうやれば動くよとかあったら、ぜひ教えてください。