1. はじめに
- AWSの各種コスト削減を検討しており、開発環境については、夜間・休日は自動でインスタンスを停止するようにしたい。
- 単体で稼働しているインスタンスであればEventBridgeなどを用いて指定時刻での停止/開始が可能だが、今回はオートスケーリンググループの設定の中で稼働しているインスタンスに対して、同様のことができるかについて、設定方法を確認する。
2. やったこと
- オートスケーリンググループ(nginxをインストールしたインスタンスを通常時は2個稼働)を作成する。
- 作成したオートスケーリンググループをALBのターゲットグループとして設定する。
- オートスケーリンググループに対し、「予定されたアクション」の機能を用いて、夜間・休日はインスタンスを0個にする設定を行う。(インスタンスの「停止/開始」をするわけではなく、インスタンスの「終了/再作成」を実施する)
3. 構成図
4. 手順
4.1 事前準備
- オートスケーリンググループの設定によって起動されている2個のインスタンス(nginx)に対し、インターネットからALB経由でアクセスできる検証環境を作成する。
- 起動テンプレートの作成
- AMI: nginxをインストールしたAmazon Linux 2023
- インスタンスタイプ: t2.micro
- オートスケーリンググループの作成
- 起動テンプレート: 上記の起動テンプレート
- キャパシティ: 希望する/最小/最大 全てを「2」に設定
- ALBの作成
- ターゲットグループ: 上記のオートスケーリンググループ
- 起動テンプレートの作成
4.2 オートスケーリンググループに対する「予定されたアクション」の設定
-
以下の動作仕様になるように「予定されたアクション」を設定する。
- 平日(月~金)の8:30AMにインスタンスを2個に、21:00PMにインスタンスを0個の状態にする。
- 上記の設定により、土日は金曜21:00PMに0個になった後、月曜8:30AMまで0個のままとなる。
- 祭日や年末年始連休などはさすがに諦める。
-
オートスケーリンググループの、「オートスケーリング」の一番下に、「予定されたアクション」の設定箇所がある。
- 月~金の8:30AMにインスタンスを2個にするアクションを作成する。cron式の「30 8 * * 1-5」は、「月~金の8:30」の意味。
- 同様に、月~金の21:00PMにインスタンスを0個にするアクションを作成する。
- 結果として2つのアクションが登録される。
4.3 インスタンス数変化の動作確認
4.3.1 インスタンス終了時(2個⇒0個)
- インスタンスが2個起動している状態で、検証のためstop(capacity=0)のアクションを15:33PMに設定する。指定の時刻にアクションが実行されるが、今回オートスケーリンググループがALBと紐づいているため、まずConnectionDraining(デフォルト値 5分)状態になる。
- 約6分後の15:39にインスタンスが終了となり、0個の状態になる。
4.3.2 インスタンス起動時(0個⇒2個)
- 起動しているインスタンスがない状態で、検証のためstart(capacity=2)のアクションを16:03PMに設定する。指定の時刻にアクションが実行され、PreInService状態を経て、30秒後には2個のインスタンス起動が完了する。また、ALB経由でのnginxへのhttpアクセスも問題なく可能となる。
5. 参考サイト
-
Amazon EC2 Auto Scaling のスケジュールされたスケーリング
- AWS公式による本機能のマニュアル。
-
Cron Examples
- cron式の書き方のマニュアル。
-
EC2 Auto Scalingのスケジュールされたアクション
- 本機能の動作検証をCFn設定なども含めて実施。
-
Amazon AutoScalingによるEC2サーバの自動スケーリング
- 本記事では省略した、起動テンプレートやオートスケーリンググループの作成手順までを含めて手順を解説。
6. 所感
- オートスケールについては資格試験に出たりすることもあり、なんとなく知識としてはあったものの、実際に設定を行うことで仕様を再確認できた。
- 今回構成例にしたALB配下での利用に限らず、EKSのワーカーノードなどにもオートスケーリンググループが使用されていたりするため、可能なところには今回検証したような設定を行い、コスト削減につなげたい。