【AWS】MultiAZ環境 RDS を Lambda で自動停止させたい


Multi-AZ 環境を停止させるために


データベースとウマが合わないマルオが RDS の話題を扱います。

可用性を求めて Multi-AZ環境 RDSを構成する場合、本番環境でしたら「止まらないDB」が必要ですが、テスト環境は「止めたい時に止まるDB」を求められうこともあるかと思います。(あまりない?)

単純に RDS を自動起動/停止させることは出来ますが、Muliti-AZ 環境は止めることが出来ません。(そのための Multi-AZ!)

そこで RDS停止操作前に Multi-AZ → Single-AZ への変更作業が必要になります。マネジメントコンソールからは「ミラーリング」を「いいえ」に変更すると Single-AZ に変更できますが、これを Lambda で実現します。


使用環境
・Multi-AZ 環境のRDS


---------------------------------------------------------

1.Lambda 関数作成 (Multi-AZ → Single-AZ)

---------------------------------------------------------

スクリプトは次を使用します。(ランタイム:Python3.6)
※タイムアウトは 3秒で大丈夫そう


import boto3

def lambda_handler(event, context):
    dbinstance = '<DBNAME>'
    rds = boto3.client('rds')
    response = rds.describe_db_instances(DBInstanceIdentifier = dbinstance)

    for dbinstances in response['DBInstances']:

        status = dbinstances['DBInstanceStatus']

        if status == 'available':
            print("Convert to Single-AZ")
            rds.modify_db_instance(DBInstanceIdentifier=dbinstance,MultiAZ=False,ApplyImmediately=True)
        else:
            print("Don't Modifiction Single-AZ. DBstatus[",status,"]")
     

    return 0


<DBNAME> RDSインスタンス名を指定
MultiAZ=False  マルチAZ有効
ApplyImmediately=True  すぐに適

Multi-AZに設定変更したあと「すぐに適用」を指定することで設定変更が掛かります。このオプションを付けない場合は、マネジメントコンソールでの操作と同様に次回再起動時に設定が有効になります。

※ MultiAZ=True に設定すると Single-AZ → Multi-AZ になります。

---------------------------------------------------------

2.RDS操作用ロール

---------------------------------------------------------

Lambda 関数が RDS を操作できるように次のロールを設定します。


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "rds:StartDBInstance",
                "rds:StopDBInstance"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

---------------------------------------------------------

3.動作確認

---------------------------------------------------------

Lambda 関数をテスト実行すると、正常に完了すれば次のようなログを出力します。



※スクリプトでは RDSステータスが「available」の場合のみ modify_db_instance を実行します。「利用可能」以外のステータスの場合は処理が行われません。

---------------------------------------------------------

4.終わりに

---------------------------------------------------------


このスクリプトと RDS停止スクリプトを組み合わせれば、Multi-AZ環境の RDSを停止させることが可能になり、テスト環境の維持費用軽減に役立つかもしれません。(?)

ただし Multi-AZ → Single-AZ が完了するまで、だいぶ時間が掛かる場合がありますので、RDS 停止スクリプトをじっこうする場合は変更が完了するまで待つ必要があります。

別の方法で Single-AZ 化を感知することができれば「変更の待ち時間なく速やかに」 RDS を停止させることができそうです。(サブスクリプションで Single-AZ を感知できれば可能かもしれません)


おわり

このブログの人気の投稿

【AWS】IAMFullAccessを付与せずIAM Roleの作成とアタッチを行う方法

【AWS】EBSボリューム自動取得/削除 を Lambda で実行 (世代管理も)

【GCP】Compute EngineでVPNサーバーを立てるときの注意点