LoginSignup
6
5

More than 5 years have passed since last update.

Lambdaの関数を利用してRDSを長期間停止する

Last updated at Posted at 2018-04-26

■経緯

Dev環境のRDSを長期間停止しておきたい

RDSについてインスタンスStop機能を使って停止すると
RDSのStop機能は7日後に自動的に起動される仕様になっている。
停止はRDSのインスタンス削除する方法もあるが、
毎回スナップショットからの復旧は面倒。

そのため、
Lambdaの関数を利用して、
定期的にRDSの起動状況を確認し、起動しているなら停止を実施するやり方で
停止を行う

RDSを停止する時は
Lambdaの関数「rds_stop」のルールCloudWatch Events「rds_stop_cron」を「有効」にする。

RDSを起動する時は
「rds_stop」のルールCloudWatch Events「rds_stop_cron」を「無効」にすることを忘れないよう!

■Lambdaの関数

項目 内容
ランタイム Rython3.6
関数         rds_stop
Lambdaのロール lambda_rds_start_stop_execution
トリガー      CloudWatch Events
ルール 「rds_stop_cron」スケジュール式: cron(0/10 * * * ? *)

Lambdaのロール

lambda_rds_start_stop_execution

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

Lambdaの関数

関数:rds_stop


import boto3

  # RDSインスタンス一覧
rds_ids = [
    'dev-db'
    ]

def lambda_handler(event, context):

    # RDS インスタンスの処理
    rds = boto3.client('rds')

    # リストの要素が0の場合は終了
    if len(rds_ids) == 0:
        print('対象RDSインスタンスがありません。')
    else:
        for i in rds_ids:
            # RDSを停止する前にすでに停止しているどうか確認する。
            response = rds.describe_db_instances(DBInstanceIdentifier=i)
            rds_status = response["DBInstances"][0]["DBInstanceStatus"]
            print(rds_status)

            # ステータスが「stopped」の場合
            if rds_status == "stopped":
                print('既に RDS インスタンスが停止しています。:' + str(i))
            elif rds_status == "available":
                # string 形式で RDS 受け取る
                rds.stop_db_instance(DBInstanceIdentifier=i)
                print('RDSインスタンスを停止しました。:' + str(i))
            else:

                # available や stopped 以外の場合
                print('ステータスが変更途中です。:' + str(i))


    return 'RDSインスタンスの停止処理を完了しています。'

===================

関数:rds_stop

import boto3

# RDSインスタンス一覧
rds_ids = [
    'dev-db'
    ]

def lambda_handler(event, context):

    # RDS インスタンスの処理
    rds = boto3.client('rds')

    # リストの要素が0の場合は終了
    if len(rds_ids) == 0:
        print('対象RDSインスタンスがありません。')
    else:
        for i in rds_ids:
            # RDSを起動する前にすでに起動しているかどうか確認する。
            response = rds.describe_db_instances(DBInstanceIdentifier=i)
            rds_status = response["DBInstances"][0]["DBInstanceStatus"]
            print(rds_status)

            # ステータスが「available」の場合
            if rds_status == "available":
                print('既に RDS インスタンスが起動しています。:' + str(i))
            elif rds_status == "stopped":
                # string 形式で RDS 受け取る
                rds.start_db_instance(DBInstanceIdentifier=i)
                print('RDSインスタンスを起動しました。:' + str(i))
            else:

                # available や stopped 以外の場合
                print('ステータスが変更途中です。:' + str(i))


    return 'RDSインスタンスの起動処理を完了しています。'

参考
https://go-journey.club/archives/5161

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5