RDSを自動停止する

0

RDSのDBインスタンスの停止には制約があって、最長7日間しか停止できないため7日後に自動で起動してしまいます。

検証用DBインスタンスが複数あって基本的には停止の状態にしたい場合は、7日ごとに確認して停止をしなくてはいけないのですが、私の場合忘れてしまうことが多く料金が無駄にかかってしまうため、週に1回検証用DBインスタンスを起動してから停止をする処理を自動化することにしました。

CloudWatchエージェントのスケジュールによりLambda関数を起動して、DBインスタンスに対して起動、停止を行います。

1) DBインスタンスにタグ付け

AWSマネジメントコンソール > RDS > 停止しておきたいDBすべてに以下のタグを追加します。

自動起動用に「AutoStart」自動停止用に「AutoStop」タグを追加し、どちらも値をTrueとしました。

2) ポリシーの作成

Lambda関数へ付与するRDSへの権限は以下の通りとしました。

リスト:DescribeDBInstances

読み込み:ListTagsForResource

書き込み:StartDBInstance, StopDBInstance

を選択しました。

3) Lambda関数作成

AWSマネジメントコンソール > Lambda > 「関数の作成」で「一から作成」を選択し、関数名の入力とランタイムを選択して「関数の作成」ボタンをクリックします。(DB起動とDB停止の2つLambda関数を作成します。)

DBを起動するLambda関数名を「DBAutoStart」DBを停止するLambda関数を「DBAutoStop」として、ランタイムに「Phython 3.6」を選択しました。

ここからの作業はLambda関数「DBAutoStart」「DBAutoStop」どちらにも行います。

アクセス権限を追加します。

アクセス権限タブのロール名リンクをクリックし、先ほど作成したRDSのポリシーを追加します。

次に関数コードを入力して保存します。

「DBAutoStart」のコード


import boto3

rds = boto3.client('rds', region_name='ap-northeast-1')

def lambda_handler(event, context):
 dbs = rds.describe_db_instances()
 target_tag = 'AutoStart'

 for db in dbs['DBInstances']:
  ins_tags = rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])
  db_tags = ins_tags['TagList']
  tag = next(iter(filter(lambda tag: tag['Key'] == target_tag and tag['Value'] == 'True', db_tags)), None)

   if tag and db['DBInstanceStatus'] == 'stopped':
    response = rds.start_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
    print(db['DBInstanceIdentifier'])

「DBAutoStop」のコード

import boto3

rds = boto3.client('rds', region_name='ap-northeast-1')

def lambda_handler(event, context):
 dbs = rds.describe_db_instances()
 target_tag = 'AutoStop'

 for db in dbs['DBInstances']:
  ins_tags = rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])
  db_tags = ins_tags['TagList']
  tag = next(iter(filter(lambda tag: tag['Key'] == target_tag and tag['Value'] == 'True', db_tags)), None)

   if tag and db['DBInstanceStatus'] == 'available':
    response = rds.start_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
    print(db['DBInstanceIdentifier'])

4) CloudWatchイベント作成

AWSマネジメントコンソール > CloudWatch > イベントを選択して、「今すぐ始める」ボタンをクリックします。

毎週日曜日の夜に起動して停止を行いたいため、イベントソースにスケジュールを選択して、Cron式を選びました。(Cronの時間はGMTで指定します。日本時間-9h)

「DBAutoStart」DB起動は日曜23時:0 14 ? * SUN *

「DBAutoStop」DB停止は日曜23時半:30 14 ? * SUN *

としました。

Cron式は、「分」「時」「日」「月」「曜日」「年」の順番で半角スペース区切りで指定します。

「DBAutoStart」「DBAutoStop」のLambda関数それぞれにイベントを追加します。

※ cron指定の曜日と日は同時に指定ができないため、曜日を指定する場合は日は?にする必要があります。

※ DBの起動には10分前後かかるため、30分あけて停止を行うように設定しました。

(RDS利用料金は1時間未満の場合1時間分かかります。)

5) Lambda関数のトリガーを設定する

AWSマネジメントコンソール > Lambda で先ほど作成した「DBAutoStart」を選択します。

「+トリガーを追加」ボタンをクリックします。

ルールに先ほどCloudWatchエージェントで追加したルールを選択して追加します。

(「DBAutoStop」でも同様にトリガー追加作業を行ってください。)

これで、自動起動と停止の設定が完了です。

参考サイト

AWS Lambda+Python3で複数のRDSを起動停止
リンクバル技術部の川畑です。9月も残すところあと3日。今年の台風は勢力が強く、今週末には台風24号が上陸すると…
0
タイトルとURLをコピーしました