タスク数を 0 に変更してもオートスケーリングのスケールアウトが実行される挙動を回避するためには

2023.03.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

ターゲット追跡スケーリングポリシーを設定したオートスケーリングを ECS サービスに設定しています。
手動で ECS サービスのタスク数(必要数)をに変更しましたが、その後スケールアウトが実施されました。
オートスケーリングの「タスクの最小数」も「0」に設定していて、ターゲットのメトリクス値も低いので、スケールアウトは実行されない認識ですが、なぜタスク数が更新されたのでしょうか。
スケールアウトを回避する方法があれば併せて教えてください。

どう対応すればいいの?

スケーリングの一時停止をご利用ください。

ターゲット追跡スケーリングポリシーは、過去のメトリクス状況を含めてタスク数を調整するため、過去のリソース状況を参照し、意図しないスケーリング(タスク数の変更)が行われる場合があります。

例えば、一定の負荷があるサービスのタスク数をに手動変更した直後は、過去のメトリクス状況から必要なタスク数が計算され、スケールアウトされる場合があります。

参照される過去の期間の変更はサポートされていませんが、スケーリングの一時的な停止はサポートされています。
そのため、スケールアウトを回避したい場合は、スケーリングの一時停止をご利用ください。

なお、スケールアウトが発生した場合も、一定時間経過し、メトリクスからタスク数はが適切と判断されれば、自動的にスケールインの実施が期待されます。

スケールアウトの一時停止をやってみた

describe-scalable-targetsコマンドで、現在の設定状況とresource-idを確認します。

$ aws application-autoscaling describe-scalable-targets --service-namespace ecs
{
  "ScalableTargets": [
    {
      "ServiceNamespace": "ecs",
      "ResourceId": "service/hato-cluster/hato-service",
      "ScalableDimension": "ecs:service:DesiredCount",
      "MinCapacity": 0,
      "MaxCapacity": 2,
      "RoleARN": "arn:aws:iam::123456789012:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService",
      "CreationTime": "2023-01-01T01:01:01.008000+09:00",
      "SuspendedState": {
        "DynamicScalingInSuspended": false,
        "DynamicScalingOutSuspended": false,
        "ScheduledScalingSuspended": false
      }
    }
  ]
}

register-scalable-targetコマンドでDynamicScalingOutSuspended=true(スケールアウトを一時停止)を設定します。

$ aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --scalable-dimension "ecs:service:DesiredCount" \
  --resource-id "【resource-idの値】" \
  --suspended-state DynamicScalingOutSuspended=true

describe-scalable-targetsコマンドで設定された設定値を確認します。

$ aws application-autoscaling describe-scalable-targets --service-namespace ecs                                                     
{
  "ScalableTargets": [
    {
      "ServiceNamespace": "ecs",
      "ResourceId": "service/hato-cluster/hato-service",
      "ScalableDimension": "ecs:service:DesiredCount",
      "MinCapacity": 0,
      "MaxCapacity": 2,
      "RoleARN": "arn:aws:iam::123456789012:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService",
      "CreationTime": "2023-01-01T01:01:01.008000+09:00",
      "SuspendedState": {
        "DynamicScalingInSuspended": false,
        "DynamicScalingOutSuspended": true,
        "ScheduledScalingSuspended": false
      }
    }
  ]
}

スケールアウトの一時停止を解除する場合

register-scalable-targetコマンドでDynamicScalingOutSuspended=falseを設定します。

$ aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --scalable-dimension "ecs:service:DesiredCount" \
  --resource-id "【resource-idの値】" \
  --suspended-state DynamicScalingOutSuspended=false

参考資料