🐊

EC2 Auto Scaling で 動的スケーリングとスケジュールドスケーリングを両方設定したら意味が無いのか試してみた

2022/02/12に公開

動的スケーリングポリシーとは、CPU利用率などを元にスケーリングを行うポリシーです。

スケジュールドスケーリングポリシーとは、特定時刻にインスタンスを増やしたり減らしたり、○○分間隔で繰り替えしインスタンスを増やしたり減らしたり、というスケーリングを行うポリシーです。

スケーリングポリシーの概要については、以前まとめた記事がありますので、良かったらご参考ください。

https://zenn.dev/taroman_zenn/articles/8a07d4e08f8219

さて、Auto Scaling を学ぶために説明を読んでいて、ふと、こんな風に思いました。

「動的スケーリングポリシーとスケジュールドスケーリングポリシーって一緒に使ったら意味ないんか?」

動的スケーリングポリシーでは常にDesired Capacityを調整してくれていて、そこにスケジュールドスケーリングポリシーが横やりを入れても、すぐに元に戻されるはず...?

でもそんなことをわざわざ説明している記事が無い。

というわけで、多分考えた通りのことが起こるとは思うのですが、検証してみました。

動的スケーリングポリシーを設定したAuto Scalingグループを用意

まず、AutoScalingグループを以下の設定で作成しました。

  • min: 1
  • max: 2
  • Desired Capacity: 1

初期設定

動的スケーリングポリシーの中の、ターゲット追跡ポリシーを付与しました。

CPU利用率が50%をキープするように設定します。

特に何もインスタンスに負荷を掛けていないので、常にインスタンス数は1です。

スケジュールドスケーリングポリシーを設定

ここに、スケジュールドスケーリングポリシー設定します。

スケジュールドスケーリングポリシー設定

こんな感じ。

Desired Capacityを2, maxを2に設定します。minは1のままで行きます。

予測される結果は以下になります。

「2022/02/10 22:30になるとインスタンス数が2になるが、動的スケーリングポリシーによって数分以内にDesired Capacityが1に戻され、インスタンス数も1になる。」

結果を確認してみましょう。

結果

結論から言うと、予想通りの結果になりました。

CloudWatchのメトリクスで確認すると、以下のように表示されました。

メトリクス

メトリクスの時刻はUTC表示なので、22:30 - 9:00 = 13:30 となっています。

13:30にDesiredCapacityが2に上げられますが、10分後には1に戻っています。

それに伴い、インスタンス数も1になりました。

せっかくなので、どれくらいの時間で一連の動きが起こったかも、アクティビティから確認してみましょう。

ログ

(必要ないかもですが、id系は隠しています。)

10:30:02 にスケジュールドスケーリングポリシーが実行されています。2秒遅れですね。ちなみに、スケジュールドスケーリングポリシーはぴったりに実行されないよーという公式の説明もあります。

10:30:12に Desired Capacityが1から2に変更された旨が、Launching a new instance のログに書いてあります。スケジュールドスケーリングポリシーの実行→Desired Capacityの変更が10秒かかってますね。

10:30:14 に実際にインスタンスが起動されたようです。

10:36:21 に動的スケーリングポリシーによってDesired Capacityが2から1に変更されています。

13:36:27 にはインスタンスの停止と終了が行われています。

スケジュールドスケーリングポリシーによってDesired Capacityが2に変更されてから約6分で、インスタンスの終了までが行われていますね。今回はEC2の詳細モニタリングを有効にしていないので、そのせいもあるかもしれません。

動的スケーリングポリシーとスケジュールドスケーリングポリシーを同時に使うことはあるのか?

私は実運用したことがないので、本当のところは分かりません。

考えられるユースケースとしては

テレビで紹介される時刻が決まっていて、その時刻に合わせて前もってスケールアウトしておきたいとき、や

業務開始時間前にスケールアウトしておきたい

などでしょうか。

あらかじめスケールアウト、インをしておきたいときにはある程度使えるかもしれません。
前もって増やしておきたいとき、動的スケーリングポリシーによって戻されないようにする設定も入れる必要があるでしょうが、その辺りは分かっていません...

また、min, maxの値を変えるためだけに使うのであれば、動的スケーリングポリシーとの競合もしないので、使い勝手が良さそうです。

実運用でスケジュールドスケーリングポリシーを使うパターンがあれば、ぜひ聞いてみたいです。

最後に

AWSの細かいところを探れてよかったです!

またAWS関連で気になったところを記事にしていきます!

Discussion