【コスト削減】AWS オートスケーリンググループ内インスタンスの夜間休日停止

# 1. はじめに
- AWSの各種コスト削減を検討しており、開発環境については、夜間・休日は自動でインスタンスを停止するようにしたい。
- 単体で稼働しているインスタンスであればEventBridgeなどを用いて指定時刻での停止／開始が可能だが、今回はオートスケーリンググループの設定の中で稼働しているインスタンスに対して、同様のことができるかについて、設定方法を確認する。

# 2. やったこと
- オートスケーリンググループ(nginxをインストールしたインスタンスを通常時は2個稼働)を作成する。
- 作成したオートスケーリンググループをALBのターゲットグループとして設定する。
- オートスケーリンググループに対し、「予定されたアクション」の機能を用いて、夜間・休日はインスタンスを0個にする設定を行う。(インスタンスの「停止／開始」をするわけではなく、インスタンスの「終了／再作成」を実施する)

# 3. 構成図
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/2688f670-7e2c-9eed-250f-11ee3790fbf7.png)


# 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個のままとなる。
    - 祭日や年末年始連休などはさすがに諦める。

- オートスケーリンググループの、「オートスケーリング」の一番下に、「予定されたアクション」の設定箇所がある。

![asg01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d29ef71e-a9a7-97b9-8dea-fa9b53a51e64.png)
![asg02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/dd13671f-4c24-d953-90d6-0e4681c81656.png)







- 月～金の8:30AMにインスタンスを2個にするアクションを作成する。cron式の「30 8 * * 1-5」は、「月～金の8:30」の意味。

![asg03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/76023da8-3b3d-e5cc-c975-efcd9cae80de.png)

- 同様に、月～金の21:00PMにインスタンスを0個にするアクションを作成する。

![asg04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e6e18f26-4fb4-fdd0-6259-9d1b35653b0d.png)

- 結果として2つのアクションが登録される。

![asg05a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/9c0a6b93-1fa8-bee3-a2ab-6ce11df18ab8.png)

## 4.3 インスタンス数変化の動作確認

### 4.3.1 インスタンス終了時(2個⇒0個)
- インスタンスが2個起動している状態で、検証のためstop(capacity=0)のアクションを15:33PMに設定する。指定の時刻にアクションが実行されるが、今回オートスケーリンググループがALBと紐づいているため、まずConnectionDraining(デフォルト値 5分)状態になる。

![asg06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/68ec0777-d70d-cee8-c9c3-3434971065d6.png)

- 約6分後の15:39にインスタンスが終了となり、0個の状態になる。

![asg08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/13131539-771a-1b36-7271-ceea48e4672a.png)

### 4.3.2 インスタンス起動時(0個⇒2個)

- 起動しているインスタンスがない状態で、検証のためstart(capacity=2)のアクションを16:03PMに設定する。指定の時刻にアクションが実行され、PreInService状態を経て、30秒後には2個のインスタンス起動が完了する。また、ALB経由でのnginxへのhttpアクセスも問題なく可能となる。

![asg09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/3ab02cbc-da7f-0050-de9a-212342b9000d.png)

![asg10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/cbdfdfb3-0008-92ca-47ed-57c2b824d534.png)

# 5. 参考サイト

- [Amazon EC2 Auto Scaling のスケジュールされたスケーリング](https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/ec2-auto-scaling-scheduled-scaling.html)
    - AWS公式による本機能のマニュアル。
- [Cron Examples](https://crontab.guru/examples.html)
    - cron式の書き方のマニュアル。
- [EC2 Auto Scalingのスケジュールされたアクション](https://awstut.com/2022/03/06/auto-scaling-scheduled-action/)
    - 本機能の動作検証をCFn設定なども含めて実施。
- [Amazon AutoScalingによるEC2サーバの自動スケーリング](https://mikolabo.net/index.php/2021/11/09/autoscaling/)
    - 本記事では省略した、起動テンプレートやオートスケーリンググループの作成手順までを含めて手順を解説。

# 6. 所感
- オートスケールについては資格試験に出たりすることもあり、なんとなく知識としてはあったものの、実際に設定を行うことで仕様を再確認できた。
- 今回構成例にしたALB配下での利用に限らず、EKSのワーカーノードなどにもオートスケーリンググループが使用されていたりするため、可能なところには今回検証したような設定を行い、コスト削減につなげたい。