RDSで時間指定によるオートスケールを実現する
RDSで時間指定によるオートスケールを実現する:
RDS(Aurora)ではオートスケールの設定が可能なのですが、トリガに利用できるのが
対象のRDS構成は以下の通りです。
Lambda用にRDSに対しフルアクセスできるロールを作成します。
Reader追加と削除の関数をそれぞれ準備します。
今回はPython3.7を採用しました。
イベントルールからルールを作成します。
リアルタイムで確認可能であれば、RDSのデータベース一覧から確認でき、
リアルタイムで確認が難しければ、通知メール(RDS Notification Message)で確認が可能です。
今回はRDSの設定のみで対応が難しかったので力技になりましたが、他に良い対応方法などありましたらコメントのほどお願いいたします。
はじめに
RDS(Aurora)ではオートスケールの設定が可能なのですが、トリガに利用できるのが- Aurora レプリカの平均 CPU 使用率
- Aurora レプリカの平均接続数
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)で確認が可能です。
コメント
コメントを投稿