Aurora DB クラスターを 7 日以上停止する方法

公式ドキュメントの内容をもとに Aurora でやってみました。
2022.04.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。アノテーションの中村(誠)です。
今回は、RDS インスタンスを 7 日以上停止する方法を参考に、Aurora DB クラスターを 7 日以上停止する方法について紹介します。

概要

RDS インスタンスを 7 日以上停止する方法では、RDS インスタンスを対象としていますが、Aurora DB クラスターでは使用する API が異なるため、Lambda 関数のコードを少しだけ書き換える必要があります。基本的な手順は AWS 公式ドキュメント通りなので、今回は Lambda 関数のコードで書き換える必要がある部分について紹介します。

手順について

Lambda 関数のコード以外の手順については、AWS 公式ドキュメントの通りに実施してください。

使用する API について

AWS 公式ドキュメント内では、RDS インスタンスの停止 / 開始のために、以下の Boto3 API を使用しています。
describe_db_instances
start_db_instance
stop_db_instance

一方、Aurora DB クラスターの停止 / 開始のためには、以下の Boto3 API を使用する必要があります。
describe_db_clusters
start_db_cluster
stop_db_cluster

また、サンプルコード内に記載されている API からの戻り値についても変更する必要があります。

やってみた

実際にサンプルコードを書き換えて、Aurora DB クラスターの停止 / 開始をやってみました。 なお、サンプルコード以外の手順については、AWS 公式ドキュメントの通りに実施しているので割愛します。

サンプルコードを書き換えたコードは以下の通りです。 書き換えた部分は先述の API と、API からの戻り値の名称です。

stop_db_cluster.py

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Stop DB instances
    dbs = rds.describe_db_clusters()
    for db in dbs['DBClusters']:
        #Check if DB instance is not already stopped
        if (db['Status'] == 'available'):
            DoNotStop=1
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBClusterArn'])['TagList']
                for tags in GetTags:
                #if tag "autostop=yes" is set for instance, stop it
                    if(tags['Key'] == 'autostop' and tags['Value'] == 'yes'):
                        result = rds.stop_db_cluster(DBClusterIdentifier=db['DBClusterIdentifier'])
                        print ("Stopping instance: {0}.".format(db['DBClusterIdentifier']))
                if(DoNotStop == 1):
                    DoNotStop=1
            except Exception as e:
                print ("Cannot stop instance {0}.".format(db['DBClusterIdentifier']))
                print(e)

if __name__ == "__main__":
    lambda_handler(None, None)

start_db_cluster.py

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Start DB Instances
    dbs = rds.describe_db_clusters()
    for db in dbs['DBClusters']:
        #Check if DB instance stopped. Start it if eligible.
        if (db['Status'] == 'stopped'):
            doNotStart=1
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBClusterArn'])['TagList']
                for tags in GetTags:
                #if tag "autostart=yes" is set for instance, start it
                    if(tags['Key'] == 'autostart' and tags['Value'] == 'yes'):
                        result = rds.start_db_cluster(DBClusterIdentifier=db['DBClusterIdentifier'])
                        print ("Starting instance: {0}.".format(db['DBClusterIdentifier']))
                if(doNotStart == 1):
                    doNotStart=1
            except Exception as e:
                print ("Cannot start instance {0}.".format(db['DBClusterIdentifier']))
                print(e)

if __name__ == "__main__":
    lambda_handler(None, None)

上記のコードで停止用と開始用の Lambda 関数をそれぞれ作成しました。

まずは、Aurora DB クラスターの停止から試してみます。
現在の Aurora DB クラスターの状態は、「利用可能」です。

この状態で Aurora DB クラスターを停止する Lambda 関数をテスト実行します。
実行後に Aurora DB クラスターの状態を確認すると、「停止中」→ 「停止済み」と遷移します。

次に、Aurora DB クラスターの開始を試してみます。
Aurora DB クラスターは先ほど停止させた状態のままです。この状態で Aurora DB クラスターを開始する Lambda 関数をテスト実行します。
実行後に Aurora DB クラスターの状態を確認すると、「起動中」→ 「利用可能」と遷移します。

これで Lambda 関数から Aurora DB クラスターの停止 / 開始を行えることが確認できました。

あとは EventBridge でスケジュールを作成して、Lambda を実行すればよいので、スケジュール作成についても AWS 公式ドキュメントの手順をご参照ください。

まとめ

今回は AWS 公式ドキュメントの内容をもとに、Aurora DB クラスターを 7 日以上停止する方法について、Lambda 関数のコードに着目して紹介しました。 RDS インスタンスと、Aurora DB クラスターでは使用する API が異なることもあるという点については知らなかったので勉強になりました。

本記事がどなたかの参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。