データベースとウマが合わないマルオが RDS の話題を扱います。
可用性を求めて Multi-AZ環境 RDSを構成する場合、本番環境でしたら「止まらないDB」が必要ですが、テスト環境は「止めたい時に止まるDB」を求められうこともあるかと思います。(あまりない?)
単純に RDS を自動起動/停止させることは出来ますが、Muliti-AZ 環境は止めることが出来ません。(そのための Multi-AZ!)
そこで RDS停止操作前に Multi-AZ → Single-AZ への変更作業が必要になります。マネジメントコンソールからは「ミラーリング」を「いいえ」に変更すると Single-AZ に変更できますが、これを Lambda で実現します。
使用環境
・Multi-AZ 環境のRDS
<DBNAME> RDSインスタンス名を指定
MultiAZ=False マルチAZ有効
ApplyImmediately=True すぐに適用
Multi-AZに設定変更したあと「すぐに適用」を指定することで設定変更が掛かります。このオプションを付けない場合は、マネジメントコンソールでの操作と同様に次回再起動時に設定が有効になります。
※ MultiAZ=True に設定すると Single-AZ → Multi-AZ になります。
Lambda 関数が RDS を操作できるように次のロールを設定します。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "rds:StartDBInstance", "rds:StopDBInstance" ], "Effect": "Allow", "Resource": "*" } ] }
Lambda 関数をテスト実行すると、正常に完了すれば次のようなログを出力します。
※スクリプトでは RDSステータスが「available」の場合のみ modify_db_instance を実行します。「利用可能」以外のステータスの場合は処理が行われません。
このスクリプトと RDS停止スクリプトを組み合わせれば、Multi-AZ環境の RDSを停止させることが可能になり、テスト環境の維持費用軽減に役立つかもしれません。(?)
ただし Multi-AZ → Single-AZ が完了するまで、だいぶ時間が掛かる場合がありますので、RDS 停止スクリプトをじっこうする場合は変更が完了するまで待つ必要があります。
別の方法で Single-AZ 化を感知することができれば「変更の待ち時間なく速やかに」 RDS を停止させることができそうです。(サブスクリプションで Single-AZ を感知できれば可能かもしれません)
おわり