はじめに
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秒)のままだと、指定した台数を起動する前にタイムアウトしてしまうので色々注意が必要そうです。