なにこれ
AWSコンソールからECSサービスを設定する中にオートスケーリングの項目があります。こいつを停止・再開してみるのが本記事の目的です。オートスケーリングなんて普段止めることは中々ないと思いますが、デプロイの際に古いバージョンのコンテナを一度全部停止しておきたい場合には有効だと思います。自分はバッチサービスのデプロイの際に利用しています。
ECSサービスのオートスケーリングはどこで設定されている?
AWSコンソールから設定しているとよくわからないですが、 Application Auto Scalingというサービスで設定されています。Application Auto Scalingではメトリクスに基づくスケーリングだけでなくスケジュールスケーリングも設定可能です。 また、ECS以外にもAmazon EMRやDynamoDBなんかにも対応しているようです。
停止する
aws-cliのhelpから停止できそうなコマンドを探します。
> aws application-autoscaling help ... ... AVAILABLE COMMANDS o delete-scaling-policy o delete-scheduled-action o deregister-scalable-target o describe-scalable-targets o describe-scaling-activities o describe-scaling-policies o describe-scheduled-actions o help o put-scaling-policy o put-scheduled-action o register-scalable-target
それらしきコマンドがないなーと思っていたらこんなことが書いてありました。
o Suspend and resume scaling - Temporarily suspend and later resume automatic scaling by calling the RegisterScalableTarget API action for any Application Auto Scaling scalable target. You can suspend and resume (individually or in combination) scale-out activities that are triggered by a scaling policy, scale-in activities that are triggered by a scaling policy, and scheduled scaling.
どうも RegisterScalableTarget API (register-scalable-target)
を使うみたいです。公式ドキュメントもありました。2019/08から使えるようになったので比較的新しいですね。
あとはほぼドキュメントどおりですが、 --suspended-state
オプションで停止を指定します。
aws application-autoscaling register-scalable-target \ --service-namespace ecs \ --scalable-dimension ecs:service:DesiredCount \ --resource-id service/[クラスター名]/[サービス名] \ --suspended-state '{ "DynamicScalingInSuspended":true, "DynamicScalingOutSuspended":true, "ScheduledScalingSuspended":true }'
止まったかどうかを確認。
> aws application-autoscaling describe-scalable-targets --service-namespace ecs --resource-ids service/[クラスター名]/[サービス名] { "ScalableTargets": [ { "ServiceNamespace": "ecs", "ResourceId": "service/[クラスター名]/[サービス名]", "ScalableDimension": "ecs:service:DesiredCount", "MinCapacity": 0, "MaxCapacity": 10, "RoleARN": "arn:aws:iam::XXXXXXXXXXXX:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/[ロール名]", "CreationTime": 1594774601.748, "SuspendedState": { "DynamicScalingInSuspended": true, "DynamicScalingOutSuspended": true, "ScheduledScalingSuspended":true } } ] }
再開する
再開はSuspendedをfalseにしてあげます。
aws application-autoscaling register-scalable-target \ --service-namespace ecs \ --scalable-dimension ecs:service:DesiredCount \ --resource-id service/[クラスター名]/[サービス名] \ --suspended-state '{ "DynamicScalingInSuspended":false, "DynamicScalingOutSuspended":false, "ScheduledScalingSuspended":false }'
以上です。