RDS Aurora Cluster 自動起動停止簡易版（Lambda不使用版）

# 概要

* AuroraClusterの停止機能がリリースされていた
* 開発環境の費用節約のために夜間休日などAuroraを停止したい
* Lambda+CloudWatchなどの組み合わせでもよい手間がかかる
* AWS上でLambda実行環境を構築するのが面倒な場合おすすめ
* シンプルにawscliとcronだけで動かす
* 環境はCentsOS7系(AmazonLinux2)
* [AWS公式参考](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html)

# 事前準備

* AWSCLIは最新である必要がある（この時点でaws-cli/1.16.264）
* 少しでも古いとAuroraClusterに関する制御系が存在しない
* Pythonは最新である必要がある（この時点でPython3.6系と3.7系）
* Pyenvなどは最新にしておくこと


# 詳細

### Pythonアップデート

* 新しいPythonを入れてセットしておく

```
$ python --version
$ pyenv install --list
$ pyenv install 3.6.4
$ pyenv global 3.6.4
$ python --version
Python 3.6.4
```

### 古いCliがあれば削除

* 古いawscliの削除
* 必ずしも必要ではないかも
* 私の場合複数(1.14と1.16)のawscliが入っている状態だったので（なぜかは不明）一旦全削除

```
$ sudo yum list installed | grep awscli
$ pip3 list
Package         Version
--------------- --------
awscli          1.16.264
boto3           1.10.0
botocore        1.13.0
colorama        0.4.1
docutils        0.15.2
jmespath        0.9.4
pip             9.0.1
pyasn1          0.4.7
python-dateutil 2.8.0
PyYAML          5.1.2
rsa             3.4.2
s3transfer      0.2.1
setuptools      28.8.0
six             1.12.0
urllib3         1.25.6
$ pip uninstall awscli ※必要に応じて
$ pip3 uninstall awscli
：
Successfully uninstalled awscli-1.16.264
```

### awscliをインストール

* 新しいawscliを入れる
* awsコマンドのパスが通ってない場合がある。その場合はフルパスで実行

```
$ sudo pip3 install awscli --upgrade
：
Successfully installed awscli-1.16.266 botocore-1.13.2
$ aws --version
aws-cli/1.16.264 Python/3.7.4 Linux/4.9.85-47.59.amzn2.x86_64 botocore/1.13.0
$ pip3 list
Package         Version
--------------- --------
awscli          1.16.266
boto3           1.10.0
botocore        1.13.2
colorama        0.4.1
docutils        0.15.2
jmespath        0.9.4
pip             9.0.1
pyasn1          0.4.7
python-dateutil 2.8.0
PyYAML          5.1.2
rsa             3.4.2
s3transfer      0.2.1
setuptools      28.8.0
six             1.12.0
urllib3         1.25.6
```

### 権限設定

* 実行するにあたり権限を設定しておく必要がある

#### ポリシー設定

* 実行ユーザには起動停止のみ実行させたい
* その場合既存のポリシーではなく要件にマッチしたポリシーを作成する
* IAMから以下のポリシーを作成し任意の名前で保存

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:GetLogEvents"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBClusters",
                "rds:ListTagsForResource",
                "rds:StartDBCluster",
                "rds:StopDBCluster"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

#### グループ

* 作成したポリシーを任意のグループに関連付ける
* 画面例に見えるEC2の起動停止ポリシーはここでは直接関係ないので無視してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/e21749ef-5a83-b816-278b-c93853cfd01d.png)

### ユーザ

* 処理を実行させる専用ユーザを作成する
* この例の場合startstop_userを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/efdfdfd2-d3cc-312d-eaa9-bf9a201ee0d1.png)

### アクセスキー

* 処理を実行させるユーザのアクセスキーを発行する
* この例の場合startstop_userのアクセスキーを発行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/59ad0265-676e-24e1-9728-d38b72d30219.png)



### 動作確認

* まずhelpが動くか確認
* DB停止を周知して停止コマンドを実行してみる

```
$ aws rds stop-db-cluster help
$ aws rds stop-db-cluster --db-cluster-identifier <cluster_name>
$ aws rds start-db-cluster --db-cluster-identifier <cluster_name>
```

### cron設定

* 環境内で適当なホストのCRON内に以下の処理を記述

```
$ sudo vi /etc/cron.d/startRdsAuroraCluster
30 9 * * 1-5 appuser /usr/local/bin/aws rds start-db-cluster --db-cluster-identifier <cluster_name>
$ sudo vi /etc/cron.d/stopRdsAuroraCluster
0 23 * * 1-5 appuser /usr/local/bin/aws rds stop-db-cluster --db-cluster-identifier <cluster_name>
```

### 遭遇したエラー１ 

* 適切なポリシーが設定できていない場合以下のエラーとなる
* RDSのインスタンスではなくクラスターに対する権限が必要

```
$ aws rds start-db-cluster --db-cluster-identifier <cluster_name>

An error occurred (AccessDenied) when calling the StartDBCluster operation: User: arn:aws:iam::**********:user/stopstart_user is not authorized to perform: rds:StartDBCluster on resource: arn:aws:rds:ap-northeast-1:**********:cluster:<cluster_name>
```

### 遭遇したエラー2 

```
$ aws rds start-db-cluster --db-cluster-identifier <cluster_name>
You must specify a region. You can also configure your region by running "aws configure".
```

```
$ aws configure
AWS Access Key ID [None]: *******************
AWS Secret Access Key [None]:*******************
Default region name [None]: ap-northeast-1
Default output format [None]: json

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************YUOM shared-credentials-file
secret_key     ****************zrkd shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config
```

* 必要であればaws configureをしておく
* 私の場合デフォルトリージョンを設定してなかったのでawsコマンド実行時エラーで警告された
* この際のユーザもRDSの起動停止のポリシーだけ作成し、それをセットしたユーザのアクセスキーを使用する事が望ましい
* 面倒であればRDSFullAccessでも