ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

ECSサービスのオートスケーリングを停止する

なにこれ

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 }'

以上です。