【AWS】RDSを自動的に停止する方法

2020年5月17日 | 広報・PR・イベント運営担当

RDSのDBインスタンスには最長7日間しか停止できないという制約があります。いったん停止しても7日後には自動で起動してしまいます。
検証用のDBインスタンスが複数あり、基本的に停止の状態にしておきたい場合には、7日ごとに確認して停止作業をしなくてはならず、忘れると無駄に料金が掛かってしまいます。

そこで、週に1回、検証用DBインスタンスを起動して停止するという処理を自動化する方法をご紹介します。
CloudWatchエージェントのスケジュールによってLambda関数を起動し、DBインスタンスに対して起動と停止を行います。

 

1. DBインスタンスにタグを付ける

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

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

 

2. ポリシーを作成する

RDSに対する権限をLambda関数に付与します。

下記を選択しました。

リスト :DescribeDBInstances
読み込み:ListTagsForResource
書き込み:StartDBInstance StopDBInstance

 

3. Lambda関数を作成する

DB起動とDB停止という2つのLambda関数を作成します。

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

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

ここからの作業はどちらの関数に対しても行います。

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

「アクセス権限」タブの「ロール名」のリンクをクリックして、先程作成した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(日本時間 – 9.0h)で指定します。

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

「DBAutoStop」 DB停止は日曜23:30 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を起動停止|LINKBAL Blog
https://blog.linkbal.co.jp/4804/

 

いかがでしたか?

イー・エージェンシーでは、AWS(Amazon Web Services)による開発や、データプライバシーコンサルティングCRM / MA支援ツールでお客様のマーケティング課題の解決を支援しております。 詳しくは下記サイトをご覧ください。

データソリューション|イー・エージェンシー
https://datasolution.e-agency.co.jp/

また、Google アナリティクス 4 プロパティ(GA4)など Google マーケティング プラットフォーム(GMP)の各種ツールをはじめ、BigQuery など Google Cloud Platform(GCP)を用いたデータ統合や、広告連携アトリビューション分析などデータ活用全般を支援しております。 詳しくは下記サイトをご覧ください。

Google アナリティクス 4 プロパティ(GA4)など
Google マーケティング プラットフォーム|イー・エージェンシー
https://googleanalytics360-suite.e-agency.co.jp/

PICK UP

広報・PR・イベント運営担当

ライター

おもてなしを科学するイー・エージェンシーでは、クロスデバイス分析によるユーザー単位の分析やオンラインオフラインを横断した分析など次世代の分析をサポート。また分析データを元にしたABテスト支援から、EC領域での購買、行動データを活用したレコメンドシステムなどを提供。 お問い合わせはこちらにどうぞ。

お問い合わせ

サービスに関するご相談は
こちらよりお気軽にお問い合わせください。

e-Agencyの様々な情報をFacebookでお届けします!