RDSを自動停止・自動起動する

RDSの自動停止と自動起動の設定方法。
CloudWatchEvent と SSMAutomation を利用します。

他にも「lambdaを使って特定のタグがついた全てのインスタンスの停止APIを呼び出す」みたいなのがありますが、こちらはインスタンスIDを指定するだけで設定できます。

## ポリシーの作成

実行用のポリシーとロールの作成が必要です。
すでにある場合は [イベントルールの作成](#イベントルールの作成) までスキップしてください。

* `IAM` > `ポリシー` > `ポリシーの作成` をクリック
![スクリーンショット 2020-10-14 16.31.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/9a9c7d56-bd85-3e83-605c-b65edc453f32.png)

### RDSに対するアクセス許可

* `サービス` で「RDS」を選択
    * 「rds」を入力するとすぐに出てくる
* `アクション` で「StartDBInstance」と「StopDBInstance」を選択
    * 「start」「stop」を入力するとすぐに出てくる
* `リソース` で「このアカウント内のいずれか」にチェックを入れる
![スクリーンショット 2020-10-14 16.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/893bb181-37a6-9f08-31da-e93bac74bd2f.png)

### SNSに対するアクセス許可

* 「さらにアクセス許可を追加する」をクリック
* `サービス` で「SNS」を選択
* `アクション` で「書き込み」にチェックを入れる
* `リソース` で「このアカウント内のいずれか」にチェックを入れる
![スクリーンショット 2020-10-14 16.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/ae84614f-6005-c21e-c132-67459eb5ebbb.png)

### SystemsManagerに対するアクセス許可

* 「さらにアクセス許可を追加する」をクリック
* `サービス` で「SystemsManager」を選択
    * 「system」を入力するとすぐに出てくる
* `アクション` で「すべての Systems Manager アクション (ssm:*)」にチェックを入れる
* `リソース` で「このアカウント内のいずれか」にチェックを入れる
![スクリーンショット 2020-10-14 16.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/d4c91954-5fcb-bae7-02e4-3faf31ad1afe.png)

### 作成

* 任意のポリシー名を入力し「ポリシーの作成」をクリック

## ロールの作成

* `IAM` > `ロール` > `ロールの作成` をクリック
![スクリーンショット 2020-10-14 15.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/7bea6361-3e14-e9f7-dac8-db8e48647bea.png)
* `AWSサービス` > `SystemsManager` > `SystemsManager` を選択して次のステップへ
![スクリーンショット 2020-10-14 16.49.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/1de2795c-9adf-8987-62bb-50663d45e201.png)
* 先ほど作成したポリシーを選択して次のステップへ
![スクリーンショット 2020-10-14 16.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/cfd67961-e3f5-5921-1693-c945159f4541.png)
* タグは特に必要ないので次のステップへ
* 任意の「ロール名」を設定し「ロールの作成」をクリック
![スクリーンショット 2020-10-14 16.56.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/10de4f52-65b9-abf5-97b5-5ea71ce1685c.png)

## ロールの信頼関係を修正

* IAMロール一覧から作成したロールを選択
* `信頼関係` > `信頼関係の編集` をクリック
![スクリーンショット 2020-10-14 17.13.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/cf1a3014-52ae-77ed-7667-85d8abdc4290.png)
* `Principal > Service` を`["events.amazonaws.com","rds.amazonaws.com","ssm.amazonaws.com"]` にして更新
![スクリーンショット 2020-10-14 17.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/d7c3722a-3a1c-2b0d-aed0-7406afaa0342.png)

## イベントルールの作成

* `CloudWatch` > `ルール` > `ルールの作成` をクリック
![スクリーンショット 2020-10-14 14.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/b490404f-c11f-ffa8-5eb0-327fda6c3166.png)
* `スケジュール` で `Cron式` を選択
* 自動停止または起動させたい時間をcron式で入力する
    * GMTなので日本時間に合わせるために **-9時間** する
    * 例: 毎日23:00に停止させたい → `00 14 ? * * *`
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3235323136352f38353962653761312d663731652d643234392d393731662d3834633833663764323962372e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/5252ffba-b1f1-6d1c-c2d8-680eee871a12.png)
* `ターゲット` のアクションから「SSM Automation」を選択
    * 「ssm」を入力するとすぐに出てくる
* 停止する場合: `ドキュメント` で「AWS-StopRdsInstance」を選択
    * 「stop」を入力するとすぐに出てくる
* 起動する場合: `ドキュメント` で「AWS-StartRdsInstance」を選択
    * 「start」を入力するとすぐに出てくる
* `定数` > `InstanceId` に対象のDBインスタンスの DB識別子 を入力
* 「既存のロールを使用」を選択
* 先ほど作成したロールを選択する
    * ロール名で絞り込み出来る
* ターゲットを追加したい場合は同様にして追加する
![スクリーンショット 2020-10-14 17.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/20e42b23-5796-ae26-b41a-e8f1fd0639b3.png)
* 「設定の詳細」をクリック
* 任意のルール名と説明を入力
    * ルール名は後から変更できないので注意
* 有効化にチェックが入っていることを確認して「ルールの作成」をクリック

## 注意点1

本番環境におけるRDSインスタンスの停止は推奨されないようです。
あくまで開発・検証用の機能として存在するのでご注意ください。

[一時的に Amazon RDS DB インスタンスを停止する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html) より
> 一時的なテストや毎日の開発作業のために、断続的に DB インスタンスを使用する場合、コスト削減のため、Amazon RDS DB インスタンスを一時的に停止できます。

[RDSを本番環境で停止運用しないほうが良い理由について](https://blog.serverworks.co.jp/tech/2019/06/26/stopdbinstance/) より
> キャパシティ不足時に対応する手段が限られている  
> これが、RDSを本番環境では停止・開始することが推奨できない最も厳しい理由となります。

## 注意点2

インスタンスを停止できる最大期間は7日間です。 以降は自動的に起動されます。

[一時的に Amazon RDS DB インスタンスを停止する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html) より
> インスタンスは最大 7 日間停止できます。
> 7 日後に DB インスタンスを手動で起動しなかった場合、DB インスタンスは自動的に起動されるため、必要なメンテナンス更新
が遅れることはありません。

## 関連

[EC2を自動停止・自動起動する](https://qiita.com/bambis13s/items/00d5fce5c4110c4c131c)