困っていた内容
ターゲット追跡スケーリングポリシーを設定したオートスケーリングを ECS サービスに設定しています。
手動で ECS サービスのタスク数(必要数)を0
に変更しましたが、その後スケールアウトが実施されました。
オートスケーリングの「タスクの最小数」も「0」に設定していて、ターゲットのメトリクス値も低いので、スケールアウトは実行されない認識ですが、なぜタスク数が更新されたのでしょうか。
スケールアウトを回避する方法があれば併せて教えてください。
どう対応すればいいの?
スケーリングの一時停止をご利用ください。
ターゲット追跡スケーリングポリシーは、過去のメトリクス状況を含めてタスク数を調整するため、過去のリソース状況を参照し、意図しないスケーリング(タスク数の変更)が行われる場合があります。
例えば、一定の負荷があるサービスのタスク数を0
に手動変更した直後は、過去のメトリクス状況から必要なタスク数が計算され、スケールアウトされる場合があります。
参照される過去の期間の変更はサポートされていませんが、スケーリングの一時的な停止はサポートされています。
そのため、スケールアウトを回避したい場合は、スケーリングの一時停止をご利用ください。
なお、スケールアウトが発生した場合も、一定時間経過し、メトリクスからタスク数は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