Lambdaを使ってRDSの自動起動・自動停止機能を実装しよう

Lambdaを使ってRDSの自動起動・自動停止機能を実装しよう
この記事をシェアする

こんにちは、スカイアーチHRソリューションズのkawabataです。

気づいたら利用料金が膨らんでることありますよね…
例に漏れず、私もよくやってしまいます。
特にRDSの自動起動が厄介なことこの上ない。

そこで、今回はRDSを利用時間の間だけ動かすように、
Lambdaでの自動起動・自動停止を実装していこうと思います。

はじめに

RDSのいいところであり、悪いところでもある点が一つあります。
それは自動起動です。

RDSは停止してから、7日間停止することができます。
7日間経過すると、勝手に起動する仕様となっています。
これによって、いつの間にか利用料金が増えていたなんてこともしばしば…

仕事時間中しか使用しないのに、使用していない時間の料金までかかってしまう、
そんな場合も考えられると思います。

ということで、自動で止めてくれるもしくは起動してくれる仕組みを実装する必要があるわけです。

準備

まずは今回使用するRDSを作成しましょう。データベース名は「db-test」としておいてください。

IAMロールの作成

サービスの検索欄にて「IAM」と入力し、対象のサービスを押下します。

左のペインからロールを選択し、ロールを作成を押下します。

信頼されたエンティティを選択の画面でLambdaを選択し、次へを押下します。
以下の権限ポリシーをアタッチし、次へを選択。
AmazonRDSFullAccess
CloudWatchFullAccess
検索欄でフィルタすると探しやすいです。

ロール名に「lambda-rds-automation-role」と入力し、ロールを作成を押下します。

Lambdaの作成

サービスの検索欄にて「Lambda」と入力し、対象のサービスを押下します。

右上の関数の作成を押下します。

関数名に「startRDSInstance」、ランタイムに「Python 3.9」、実行ロールは「既存のロールを使用する」、
既存のロールに「lambda-rds-automation-role」をそれぞれ入力してください。
その後、関数を作成を押下します。

次に、Lambdaを起動させるトリガーを作成していきます。
左側にあるトリガーを追加を押下します。

今回は時間によって自動起動・停止することを想定しているので、
EventBridge」を利用します。

下の画像のように設定し、追加を押下します。
※今回は月曜から金曜まで、毎日9時に起動するように設定しています。

cron式
cron(0 0 ? * MON-FRI *)

コードの作成

それでは、Lambdaで動かすコードを載せていきます。
今回作成したLambdaのソースコードの部分に以下を記載してください。

import boto3

region = 'ap-northeast-1'
db = 'db-test'

def lambda_handler(event, context):
    rds = boto3.client('rds', region_name=region)
    rds.start_db_instance(DBInstanceIdentifier=db)
    print('started instance: ' + db)

regionとdbの変数は適切な値に変更することによって他のリージョンやインスタンスでも利用することができます。

自動停止の実装

自動起動とは別でLambdaを作成する必要がありますので、
Lambdaの作成のステップから同じように作成していきます。

Lambda作成時は以下の設定にしてください。

トリガーの設定は以下にしてください。
※今回は月曜から金曜まで、毎日19時に停止するように設定しています。

cron式
cron(0 10 ? * MON-FRI *)

Lambdaに記載するソースコードは以下になります。

import boto3

region = 'ap-northeast-1'
instance = 'db-test'

def lambda_handler(event, context):
    rds = boto3.client('rds', region_name=region)
    rds.stop_db_instance(DBInstanceIdentifier=instance)
    print('stopped instance: ' + instance)

最後に

今回はLambdaを使用したRDSの自動起動・停止を実装してみました。
テスト用で作成したインスタンスなどの費用削減に役立つと思います。
EC2に対しても同じように実装できるので、ぜひやってみてください。

ご拝読ありがとうございました。

この記事をシェアする
著者:kawabata
AWS歴2年目のAWSエンジニア。 2022年にAWS認定資格12冠達成。 現在は大学に通いながらスカイアーチHRソリューションズに勤務している。