開発用AWS RDSインスタンスを Instance Schedulerを使って自動起動・停止してコスト削減する

最近、AWS費用削減のため、Instance Schedulerを使ったRDSの自動起動・停止の仕組みを導入しました。
Instance Schedulerは、EC2とRDSインスタンスの起動および停止スケジュールを設定できるソリューションです。
今回は、RDSを自動起動・停止するために必要な一連の設定手順についてまとめていこうと思います。

なお、手順については、AWSナレッジセンターの下記記事を参考にさせていただきつつ、ところどころ必要に応じて変更しています。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/stop-start-instance-scheduler/

# 事前準備
Instance Schedulerを使うには、Instance Scheduler CLIのセットアップが必要になります。また、Instance Scheduler CLIの利用するにあたり、AWS CLIの認証情報が必要になりますので、AWS CLIの設定も合わせて行う必要があります。
※AWS CLIとInstance Scheduler CLIが設定済みの方は、事前準備はスキップして大丈夫です。

### AWS CLIのセットアップ
こちらはAWSの日本語ドキュメントが充実しているので、そちらを引用させていただきます。

- AWS CLI バージョン 1 のインストール  
  https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html
- AWS CLIの設定  
  https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration

### Instance Scheduler CLIのセットアップ
下記ページにダウンロードリンクがあるので、こちらからパッケージ「scheduler-cli.zip」をダウンロードし、解凍します。
https://docs.aws.amazon.com/solutions/latest/instance-scheduler/appendix-a.html#install
![Instance_Scheduler_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/06ed4319-050f-4c31-3fe9-5eae3ff35d9c.png)
解凍後、パッケージのディレクトリへ移動し、下記コマンドでインストールします。

```:.bash
# 解凍したパッケージのディレクトリへ移動
$ cd ~/Downloads/scheduler-cli

# インストール
$ python setup.py install

# scheduler-cliコマンドが使えることを確認
$ scheduler-cli --version
scheduler-cli v1.2.0
```

# Instance Schedulerの設定
### Instance Schedulerのスタック作成
それでは、ここからInstance Schedulerを設定していきます。
Instance Schedulerテンプレートが下記に用意されているので、下記ページにアクセスし、AWSコンソールにログインした上で「Launch Solution」をクリックして起動します。
https://docs.aws.amazon.com/solutions/latest/instance-scheduler/deployment.html#step1
![Instance_Scheduler_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/0bddcf59-459f-38d5-3057-6ea5ec3dc7c2.png)

デフォルトでは、バージニア北部（us-east-1）で開かれるので、右上のメニューから自身が利用したいリージョンに変更します。今回は東京（ap-northeast-1）で作成しますので、リージョン変更してから「次へ」をクリックします。

![Instance_Scheduler_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/629423c1-e782-26ee-5438-45fb868f6270.png)

「スタックの詳細を指定」画面では、パラメータを選択・設定していきます。今回は下記のパラメータをデフォルト値から変更しています。

- スタックの名前：RDSInstanceScheduler
- Service(s) to schedule：RDS
- Create RDS instance snapshot：No
- Region：ap-northeast-1
- Default time zone：Asia/Tokyo
- Enable CloudWatch Logs：Yes
- Log retention days：7
- Started tags：state=started
- Stopped tags：state=stopped

<img width="829" alt="Instance_Scheduler_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/f43192b4-d715-fffa-ea82-e0c7a696cfd7.png">
<img width="832" alt="Instance_Scheduler_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/ce614352-28e5-9c5b-509b-2f4269343f8e.png">
<img width="836" alt="Instance_Scheduler_6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/03e6c5a8-011a-0370-7d69-6c45997e4eab.png">

「スタックオプションの設定」画面はデフォルト値のまま「次へ」をクリックします。

「レビュー」画面で設定内容を確認できまし。内容を確認し、問題がなければ、「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックを入れ、「スタックの作成」をクリックします。
<img width="839" alt="Instance_Scheduler_7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/8c0b987d-15df-b099-082d-25e4dfb187f2.png">

Instance Schedulerのスタック作成が完了すると、DynamoDBのインスタンススケジューラ構成テーブルが作成されます。このテーブルの中にインスタンスの起動する期間やスケジュール等の内容が保存されていて、scheduler-cliコマンドを使って必要な設定の作成・変更を行なっていきます。
<img width="1436" alt="Instance_Scheduler_8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/ffe62957-3b2b-9e79-acfe-d7f8e19259a0.png">

今回は、月曜日から金曜日の7:30 〜 23:30の間、RDSインスタンスを起動するスケジュールを作成してみます。

### インスタンスを起動する期間を作成・更新
期間では、インスタンスを起動しておく時間を定義します。「office-hours」という期間がデフォルトで作成されていますので、update-periodコマンドを使って、今回設定したい期間である「月曜日から金曜日の7:30 〜 23:30」へ変更します。なお、create-periodコマンドを使えば、好きな名称の期間を作成することもできます。

```:.bash
$ scheduler-cli update-period --profile cfn --stack RDSInstanceScheduler --region ap-northeast-1 --name office-hours --begintime 07:30 --endtime 23:30 --weekdays mon-fri
{
   "Period": {
      "Weekdays": [
         "mon-fri"
      ],
      "Endtime": "23:30",
      "Type": "period",
      "Begintime": "07:30",
      "Name": "office-hours"
   }
}
```
DynamoDBを確認すると、設定した期間に更新されていることを確認できます。
<img width="1435" alt="Instance_Scheduler_9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/0caa16ec-6606-25f3-b899-eaeb187c59e9.png">

### スケジュールを作成・更新
スケジュールは、RDSインスタンスにどのスケジュールを適用するかを識別するタグ値として使用します。
デフォルトで「uk-office-hours」というスケジュールが作成されていますので、それにならって、「jp-office-hours」というスケジュールを作成します。作成した後に設定内容を変更したい場合は、「update-schedule」コマンドを使って変更することができます。

```:bash
$ scheduler-cli create-schedule --profile cfn --stack RDSInstanceScheduler --name jp-office-hours --region ap-northeast-1 --periods office-hours --timezone Asia/Tokyo
{
   "Schedule": {
      "RetainRunning": false,
      "Enforced": false,
      "Hibernate": false,
      "Name": "jp-office-hours",
      "UseMetrics": false,
      "StopNewInstances": true,
      "Periods": [
         "office-hours"
      ],
      "UseMaintenanceWindow": false,
      "Timezone": "Asia/Tokyo",
      "Type": "schedule"
   }
}
```
DynamoDBを確認すると、新しいスケジュールが作成されていることが確認できます。
<img width="1436" alt="Instance_Scheduler_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/4267a758-42c1-f129-3bc2-3b57a271964c.png">

### スケジュールのタグ付け
作成したスケジュールを停止したいRDSへタグ付けすれば、スケジュール通りに起動・停止するようになります。
対象のRDSのタグに下記の通り登録します。

- Schedule：jp-office-hours
<img width="1185" alt="Instance_Scheduler_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/bd198f01-6faa-b5e5-7f36-2fbd82a8d3e1.png">

RDSが停止している間は、下記のように停止中を意味するタグが付けられます。

- Schedule：stopped
<img width="1183" alt="Instance_Scheduler_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/16742f6b-183b-59f1-59ce-f7d7bf6019df.png">

RDSが起動している間は、下記のように起動中を意味するタグが付けられます。

- Schedule：started
<img width="1184" alt="Instance_Scheduler_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174425/7ce63d9d-4d14-cc42-2b81-d353b8157acf.png">