RDS Aurora Cluster 自動起動停止簡易版(Lambda不使用版)


概要

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

事前準備

  • 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の起動停止ポリシーはここでは直接関係ないので無視してください

ユーザ

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

アクセスキー

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

動作確認

  • まず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>

遭遇したエラー1

  • 適切なポリシーが設定できていない場合以下のエラーとなる
  • 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でも