こんにちはますのです。
社内システムで土日はアクセスが少ないし、RDSのコスト下げていきませんか??というお話。予算オーバーしそう助けてという思いから始まりました。
本当は自動起動と停止で乗り越えたかったのですが、リードレプリカ掛けてるからか停止できなかったというオチでございます。
構成とやりたいこと
構成
マスターDB:RDS-master-DB01(db.t2.medium)
レプリカDB:RDS-replica-DB02(db.t2.medium)
やりたいこと
日本時間「月曜〜金曜の9:00から21:00以外」の時間帯はDBインスタンスタイプを「db.t2.small」に自動で変更してコストを抑えたい。
※インスタンスタイプを変更する際はダウンタイムが発生するので注意です!
今回はダウンタイム発生しても良いシステムとお許しが出たので設定GoGoです。
Lambda関数を作成する
では実際に設定をしていきましょう。先ずは停止のときと同じく関数を作成します。
- Lambda>関数の作成をクリック
- 関数の作成画面:一から作成を選択
- 関数名:ChangeRDSInstance2100
- ランタイム:Python 3.7
- アクセス権限:基本的な Lambda アクセス権限で新しいロールを作成
※既にIAM Roleを作成している場合、ここで割り当てることも出来ます。
CloudWatch Eventsを設定する
- ルール:新規ルールの作成
- ルール名:ChangeRDSInstance2100
- ルールの説明:ChangeRDSInstance2100
- ルールタイプ:スケジュール式 cron(0 12 ? * MON-FRI *)
※今回は月曜日〜金曜日の日本時間21時にインスタンスタイプを変更します。
RDSインスタンスタイプを自動で変更する関数を作成する
今回はインスタンスタイプを「db.t2.small」に変更します。
import boto3
def lambda_handler(event, context):
client = boto3.client(‘rds’)
response = client.modify_db_instance(
DBInstanceIdentifier=’RDS-master-DB01′,
DBInstanceClass=’db.t2.small’,
ApplyImmediately=True
)
response = client.modify_db_instance(
DBInstanceIdentifier=’RDS-replica-DB02′,
DBInstanceClass=’db.t2.small’,
ApplyImmediately=True
)
print(response)
- 「DBInstanceIdentifier」→スケールアップ、ダウンをしたいRDSのDB識別子を記載
- 「DBInstanceClass」→変更したいRDSのインスタンスタイプを記載
- 「ApplyImmediately=True」→設定していないとコマンド成功しても即時反映されないので注意が必要です
IAMポリシーにRDSの権限を設定する
- IAM管理画面>ロール>[ChangeRDSInstance2100…] を選択
- 「ポリシーをアタッチします」をクリック
- ポリシーのフィルター:AmazonRDSFullAccessで検索
- AmazonRDSFullAccessを選択し、「ポリシーのアタッチ」をクリック
- IAMロール[ChangeRDSInstance2100…]に「AmazonRDSFullAccess」が記載されていれば完了です!
続いて、同様に「ChangeRDSInstance0900」を設定して、インスタンスタイプを戻すLambda関数を作成すれば完了となります。
以上でRDSのインスタンスタイプを自動で変更することがサーバーレスで出来るようになりました!手動でやっても良いのですが、どうしても忘れてしまうことが多いのでタスクスケジューラみたいに手軽に設定出来るのは助かります!
今後の見通しとして、AWSではLambdaやCodeStarなどのサーバーレスでの機能が充実していきそうなので簡単なことはLambdaとかを使っていくようになるんだろうなと。開発言語も少しずつ理解していったほうが良いなぁと感じる今日このごろであります。
日々勉強と思い、今後はそういった機能についても頑張っていければなぁと感じた次第でございました。