Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

RDSで時間指定によるオートスケールを実現する(新)

More than 1 year has passed since last update.

はじめに

https://qiita.com/t-kudo9/items/2099bd4d776333f5885a
の続きです。

以前の記事では負荷の高い時間帯を狙って、1日に1回RDSクラスタのReaderを増やす対応をしましたが、月末月初にかけサービス負荷が高い傾向があったので、前回以外のインスタンスも増やせるように前回使用したLambda関数を改造し対応できるようにしました。

具体的な対応内容

Lambda

前回はインスタンス名やクラスはベタ打ちで指定していました。

インスタンス追加(前回)
import boto3

def lambda_handler(event, context):
    # TODO implement
    rds = boto3.client('rds')
    response = rds.create_db_instance(
        Engine='aurora',
        DBClusterIdentifier='[対象クラスタ]',
        DBInstanceIdentifier='[追加するインスタンス名]',
        DBInstanceClass='[他のReadeのインスタンスクラスで良いかと]',
        PubliclyAccessible=False, #外部接続OKであればTrueで
        DBParameterGroupName='[他のReaderのパラメータグループ名で良いかと]',
        PromotionTier=15 #フェイルオーバー優先度は最も低くします
    )
    print(response)
    return 0
インスタンス削除(前回)
import boto3

def lambda_handler(event, context):
    # TODO implement
    rds = boto3.client('rds')
    response = rds.delete_db_instance(
        DBInstanceIdentifier='[追加時のインスタンス名]',
        SkipFinalSnapshot=True
    )
    print(response)
    return 0

今回は起動される契機(日次と月次)が増えるため、eventからインスタンス名を指定できるようにします。

インスタンス追加(今回)
import boto3

def lambda_handler(event, context):
    # TODO implement
    rds = boto3.client('rds')
    response = rds.create_db_instance(
        Engine='aurora',
        DBClusterIdentifier='[対象クラスタ]',
        DBInstanceIdentifier=event['INSTANCE_NAME'], # 修正箇所
        DBInstanceClass='[他のReadeのインスタンスクラスで良いかと]',
        PubliclyAccessible=False, #外部接続OKであればTrueで
        DBParameterGroupName='[他のReaderのパラメータグループ名で良いかと]',
        PromotionTier=15 #フェイルオーバー優先度は最も低くします
    )
    print(response)
    return 0
インスタンス削除(今回)
import boto3

def lambda_handler(event, context):
    # TODO implement
    rds = boto3.client('rds')
    response = rds.delete_db_instance(
        DBInstanceIdentifier=event['INSTANCE_NAME'],  # 修正箇所
        SkipFinalSnapshot=True
    )
    print(response)
    return 0

CloudWatch

ターゲットにしてしたLambda関数の設定を変更します。
「入力の設定」で「定数(JSONテキスト)」を指定し、追加するインスタンス名を指定します。

  • {"INSTANCE_NAME": "test-daily-auto-instance1"}
  • {"INSTANCE_NAME": "test-monthly-auto-instance2"}

あとは前回同様、日次で起動するイベントルールに加え、月次で起動するイベントルールを追加します。
※日次と月次で起動するインスタンス名は上記の通り、重複しないようにします。

確認

前回同様リアルタイムで確認可能であれば、RDSのデータベース一覧から確認でき、
リアルタイムで確認が難しければ、通知メール(RDS Notification Message)で確認が可能です。

余談

JSONのインスタンス名を配列で指定&Lambda関数も対応すると、一度に複数台立ち上げることができるのですが、同じAZにインスタンスが作成されたり、Lambda関数のタイムアウト値がデフォルト(3秒)のままだと、指定した台数を起動する前にタイムアウトしてしまうので色々注意が必要そうです。

ceres
「インターネットマーケティングを通じて豊かな世界を実現する」をミッションとし、国内最大級のスマートフォン向けポイントサイトの「モッピー」や「お財布.com」などを開発・運営しています。
https://ceres-inc.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away