はじめに
RDS(Aurora)ではオートスケールの設定が可能なのですが、トリガに利用できるのが
- Aurora レプリカの平均 CPU 使用率
- Aurora レプリカの平均接続数
の2つで、予めRDSの負荷が高い時間帯を狙ってオートスケールするのが難しかったので代替案を模索しました。
RDSの負荷(CPU使用率)のイメージ |
---|
![]() |
|
検討したこと
対象のRDS構成は以下の通りです。
RDS構成
Cluster
┣ Writer
┣ Reader1
┗ Reader2
- Readerを予め追加した上で必要に応じて起動・停止をコントロールする。
→そもそもClusterにぶら下がるインスタンスを停止状態にできませんでした。 - 全インスタンスをスケールアップする。
→特定の時間以外はリソースが足りているため、不採用としました。
今回採用した案
- RDSの負荷(CPU使用率)が高い時間帯にReaderを一台追加する。
- 追加する時間帯はCloudWatchのイベントルールに設定する。追加するのは所定の時刻になったらReaderを追加するものと、削除するものの2つ。
- Readerの追加削除はLambda関数を使って実行する。
具体的な対応内容
IAM
Lambda用にRDSに対しフルアクセスできるロールを作成します。
Lambda
Reader追加と削除の関数をそれぞれ準備します。
今回はPython3.7を採用しました。
追加
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
CloudWatch
イベントルールからルールを作成します。
- 追加用のルール:スケジュールからCron形式を選び追加する時刻を指定、ターゲットは先に作成したLambda関数(追加)を指定します。
- 削除用のルール:スケジュールからCron形式を選び追加する時刻を指定、ターゲットは先に作成したLambda関数(削除)を指定します。
確認
リアルタイムで確認可能であれば、RDSのデータベース一覧から確認でき、
リアルタイムで確認が難しければ、通知メール(RDS Notification Message)で確認が可能です。
おわりに
今回はRDSの設定のみで対応が難しかったので力技になりましたが、他に良い対応方法などありましたらコメントのほどお願いいたします。