【AWSコスト削減】RDSの自動停止

aws-cost-reduction-rdsのアイキャッチ画像 AWS

AWSのRDSは最大7日間しか停止できず、それ以上に長く停止しておきたくても、7日後に自動的に起動されてしまいます。それに気づかずに起動したままになってしまい、余計なコストが掛かってしまうことがあります。
ここでは、Lambdaを使ってRDSを定期的に停止する方法を解説します。

IAMロールの用意

LambdaからRDSへアクセスできように、IAMロールを用意します。
基本的なIAMロールの追加方法は、こちらの「IAMポリシーの追加」「IAMロールの追加」を参考にして下さい。

IAMポリシーは以下のように設定します。

IAMポリシーの設定

RDSの自動停止

ソースの用意

ローカルにLambda用Python環境を用意します。
環境構築方法は、こちらを参考にして下さい。

RDSは起動⇒停止から7日間がカウントされるため、Lambdaの内容は、①RDS起動②RDS停止になります。定期的に①と②が順に実行されるようにします。

RDS起動用のPythonファイルは「C:\lambda\lambda_rds_start.py」とし、以下のように実装します。

import boto3
 
region = 'リージョン名'  # e.g. ap-northeast-1 
instance = 'RDSのDB識別名'  # AWSマネージメントコンソール > サービス > RDS > データベースのDB識別名

def lambda_handler(event, context):
    rds = boto3.client('rds', region_name=region)
    rds.start_db_instance(DBInstanceIdentifier=instance)
    print('started instance: ' + instance)

RDS起動用のPythonファイルは「C:\lambda\lambda_rds_stop.py」とし、以下のように実装します。

import boto3
 
region = 'リージョン名'  # e.g. ap-northeast-1
instance = 'RDSのDB識別名'  # AWSマネージメントコンソール > サービス > RDS > データベースのDB識別名

def lambda_handler(event, context):
    rds = boto3.client('rds', region_name=region)
    rds.stop_db_instance(DBInstanceIdentifier=instance)
    print('stopped instance: ' + instance)

「C:\lambda」内のファイル群を圧縮してZIPファイルをつくります。

Lambdaの用意①

Lambdaの追加

AWSマネージメントコンソール > サービス > Lambda > 関数で、(Lambda)関数を2つ作成します。RDS起動用とRDS停止用です。

AWSのLambdaの設定①
AWSのLambdaの設定②

こちらの「S3へアップロード・Lambdaへ適用」を参考に、コード(ZIPファイル)をLambdaに適用します。2つLambdaに対し、同じZIPファイルのURLを適用すればOKです。

AWSマネージメントコンソール > サービス > Lambda > 関数で、RDS起動用Lambdaを選択し、「ランタイム設定」の編集で以下のように設定します。

AWSのLambdaの設定③

AWSマネージメントコンソール > サービス > Lambda > 関数で、RDS停止用Lambdaを選択し、「ランタイム設定」の編集で以下のように設定します。

AWSのLambdaの設定④

こちらの「動作確認」を参考に、RDS起動用LambdaとRDS停止用Lambdaを実行し、RDSが起動および停止することを確認します。

RDS起動用Lambdaを実行後、RDSがActiveになるまで時間が掛かります。RDS停止用Lambdaの実行に失敗する場合、10分程待って再実行してみて下さい。

ここまでで、手動でLambdaを実行することで、RDSを起動・停止できるようになりました。

EventBridgeからの定期Lambda実行

EventBridge(旧CloudWatch Event)から、定期的にLambdaを自動実行するようにします。RDS起動用とRDS停止用の2つ作成します。

AWSマネージメントコンソール > サービス > CloudWatch > イベント > ルールで、RDS起動用Lambdaの実行スケジュールを追加します。(次のページでは任意の名前を付けて作成します)

AWSのEventBridgeの設定①

AWSマネージメントコンソール > サービス > CloudWatch > イベント > ルールで、RDS停止用Lambdaの実行スケジュールを追加します。(次のページでは任意の名前を付けて作成します)

AWSのEventBridgeの設定②

RDS起動用Lambdaの実行からRDS停止用Lambdaの実行まで、30分の間隔を設けています。これはRDSがActiveになるまでのおおよその時間です。

EventBridge実行確認

EventBridgeからLambdaが実行されたかどうか、Lambdaは正常に実行できたかどうかを確認します。
EventBridgeの定期スケジュールが過ぎてから確認して下さい。

AWSマネージメントコンソール > サービス > CloudWatch > ログ > ロググループで、「/aws/lambda/Lambda関数名」を選択します。

「Last event time」を見て、BridgeEventの定期スケジュール通りに実行されているかを確認します。

AWSのEventBridgeのログ①

同ログストリームを選択し、エラーログが出ていないことを確認します。

AWSのEventBridgeのログ②

以上で、Lambdaを使ってRDSを定期的に停止することができるようになりました。

タイトルとURLをコピーしました