日本語 English
インターステラ株式会社の技術ブログです

【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 を感知できれば可能かもしれません)

おわり

PAGE TOP