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

# 結論

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

# やりたかったこと

ターゲットトラッキングポリシーは、CPU平均使用率や平均ネットワーク入力のしきい値を指定するだけで、それを維持できる台数にスケールしてくれる。
例えば、CPU平均使用率を30%に維持する、というポリシーだと、
スケールアウトのアラームのしきい値は
`3 分間 内の 3 データポイントに対する CPUUtilization (CPUUtilization) > 30`
スケールインのアラームのしきい値は
`15 分間 内の 15 データポイントに対する CPUUtilization (CPUUtilization) < 27`
となる。
ただし、この`3 分間 内の 3 データポイント`、`15 分間 内の 15 データポイント`の部分がコンソールからは変更不可になっている。

ターゲットトラッキングポリシーを作ってから、CloudWatchAlarmを作成して紐づけて見ようと思っても、コンソールだとポリシーが表示されない。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214614/79b8a6c4-419f-7834-7d3c-67bfc52617b4.png)
なので、CLIとかCFnを使ったらなんとかできるんじゃない？と思って、やってみた。

# やったこと

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

```yaml
  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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214614/39e0e078-c991-fc99-0775-167b92b59759.png)

TragetTracking-ほげほげが、ターゲットトラッキングポリシーを作成すると自動で作成されるアラーム。
inra-ec2-ほげほげが、Type: AWS::CloudWatch::Alarmで自作したアラーム。

自動生成アラームも自作アラームも、以下のようにターゲットトラッキングポリシーを発火できるように設定されている。
![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214614/062755da-a460-3f6f-9f1a-028b1c62e79d.png)


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

```bash
aws cloudwatch delete-alarms --alarm-names TargetTracking-xxxxxx-AlarmHigh-xxxxxxxxx
aws cloudwatch delete-alarms --alarm-names TargetTracking-xxxxxx-AlarmLow-xxxxxxxxx
```

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

…と思って、いざCPU使用率を上げても、いくら待ってもスケールしない…
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214614/726d6e13-3130-1be5-3d77-ba11dc62b304.png)

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

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