AWSのRDSは最大7日間しか停止できず、それ以上に長く停止しておきたくても、7日後に自動的に起動されてしまいます。それに気づかずに起動したままになってしまい、余計なコストが掛かってしまうことがあります。
ここでは、Lambdaを使ってRDSを定期的に停止する方法を解説します。
IAMロールの用意
LambdaからRDSへアクセスできように、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の追加
AWSマネージメントコンソール > サービス > Lambda > 関数で、(Lambda)関数を2つ作成します。RDS起動用とRDS停止用です。


こちらの「S3へアップロード・Lambdaへ適用」を参考に、コード(ZIPファイル)をLambdaに適用します。2つLambdaに対し、同じZIPファイルのURLを適用すればOKです。
AWSマネージメントコンソール > サービス > Lambda > 関数で、RDS起動用Lambdaを選択し、「ランタイム設定」の編集で以下のように設定します。

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

RDS起動用Lambdaの実行からRDS停止用Lambdaの実行まで、30分の間隔を設けています。これはRDSがActiveになるまでのおおよその時間です。
EventBridge実行確認
EventBridgeからLambdaが実行されたかどうか、Lambdaは正常に実行できたかどうかを確認します。
EventBridgeの定期スケジュールが過ぎてから確認して下さい。
AWSマネージメントコンソール > サービス > CloudWatch > ログ > ロググループで、「/aws/lambda/Lambda関数名」を選択します。
「Last event time」を見て、BridgeEventの定期スケジュール通りに実行されているかを確認します。

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

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