ECSをスケジュールベースでスケールさせる

86件のシェア(ちょっぴり話題の記事)

はい、どーも!モバイルアプリケーションサービス部、改め、CX事業本部の吉田です。

今回はECSのサービスをスケジュールベースでオートスケーリングさせる方法を調べたので、これを紹介します。

ECSのサービスをオートスケーリングするには?

ECSのサービスをオートスケーリングする機能は、コンソールからかんたんに設定可能です。

ただしその場合は

  • CPU利用率
  • メモリ利用率
  • (あれば)ALBへのリクエスト数

といった項目のみです。つまりコンソールからはスケジュールベースでオートスケーリングをすることはできません

Application Auto Scalingでオートスケーリングさせよう

ただしApplication Auto Scalingをaws cliを使って設定することで、ECSのサービスもスケジュールベースでオートスケーリングさせることができます。

  • https://docs.aws.amazon.com/cli/latest/reference/application-autoscaling/index.html#cli-aws-application-autoscaling
  • https://docs.aws.amazon.com/ja_jp/autoscaling/application/userguide/application-auto-scaling-scheduled-scaling.html

スケジュールを登録するには、以下のようにします。

aws application-autoscaling put-scheduled-action \
--service-namespace ecs \
--resource-id service/nginx-cluster/nginx \
--scheduled-action-name nginx-scale-in \
--schedule "at(2019-08-13T08:20:00)" \
--scalable-dimension ecs:service:DesiredCount \
--scalable-target-action MinCapacity=3,MaxCapacity=3
  • service-namespace - 今回はECSに対してオートスケーリングをしたいのでecsを設定します。
  • resource-id - 対象のリソースを指定します。ECSのサービスであれば service/[クラスタ名]/[サービス名] です。
  • scheduled-action-name - 自分がわかりやすいスケジュール名を指定します。
  • schedule - スケジュールの実行時間です。UTCであることに注意しましょう。
  • scalable-dimension - 今回はサービスのDesired Countを変更したいので ecs:service:DesiredCount を指定します。
  • scalable-target-action - タスクの数を指定します。今回の例であればタスクを3つにしたいので MinCapacity=3,MaxCapacity=3 と指定しています。

登録できたか確認するには、以下のように describe-scheduled-actions コマンドを実行します。

aws application-autoscaling describe-scheduled-actions \
--service-namespace ecs

ここで登録したスケジュールの一覧を確認することができます。

次に、実際にスケジュールが実行されたかどうかを確認します。確認するには以下のように describe-scaling-activities コマンドを実行します。

aws application-autoscaling describe-scaling-activities \
--service-namespace ecs

また、実行されたスケジュールは、ECSサービスのイベントタグからも確認することができます。

まとめ

上記のようにApplication Auto Scalingを利用することで、ECSのサービスもかんたんにスケジュール ベースでオートスケールさせることができます。

もちろん、Fargateであってもオートスケーリングできます!

ちなみに put-scheduled-action には --start-time--end-time といったオプションがあります。

例えば、特定の日のある一定の時間帯のみ、インスタンス数を増やすといったことができるのかな?と思い設定しましたが、こちらはうまく動作してくれませんでした・・・

このような場合はスケールアウトとスケールインの2つのスケジュールを登録することで、上記のようなケースにも対応できると思います。