職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

RDSを定期的にstart/stop

今年の6月から、RDSのインスタンスを stop/start できるようになりました。
Amazon RDS Supports Stopping and Starting of Database Instances
当然ながら、ここで想定されるユースケースの中で最もそれっぽいものは、開発環境やテスト環境の夜間停止・週末停止です。
この機能が出るまでは、RDSの機能を停止(言い換えればRDS本体の課金を停止)させるには、データが削除されることが前提でした。(snapshotは取れますが)

さて、夜間停止や週末停止を実現したり、1週間stopのまま放置(放置すると自動で起動する仕様)した後の自動stopを実現するためには、自動化したいところです。
既に実現している人もきっと多いことでしょう。
この記事は、その自動化を実施するにあたってのメモです。

CLIツールやSDK

当然といえば当然なのですが、start/stopできるようになった後にリリースされたバージョンを使うべきでしょう。
しっかり者の皆さんは、きちんと最新版を使っているはずです。

権限設定(IAM Policy)

aws.amazon.com
上記のサイトの Security Policy のところに、許可しないといけないアクションが書いてあります(全部大文字なのは、ええんかな?)。
これをIAMの user / role / group / policy のどこか使っているところに付与してあげる訳ですが…よくお世話になるツール Policy Generator は、現時点ではまだRDSの start/stop に対応していないようです。
自分でJSONを書く必要があります。
うちは、こんなのを書きました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1503413225000",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBInstances",
                "rds:StartDBInstance",
                "rds:StopDBInstance"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

EC2との挙動の違い

EC2だと、既にrunningになっているものに対して start の指示を出してもエラーにはならずに正常終了しますが、
RDSでは、起動中のものを起動しようとするとエラーになります。要注意です。

waitの取り扱い

CLIツールでは wait というサブコマンドがあって、何かが起きるまで終了せずに待っていてくれる機能があります。しかし、startし終えたことは検知できても、stopし終えたことは検知できません。
ま、将来的には機能追加される可能性は十分ありますね。

wait — AWS CLI 1.11.137 Command Reference

さいごに

はー、快適。