[Amazon RDS]起動停止をスケジュール実行してみた
コンニチハ、千葉です。
RDSに停止・起動の機能が追加されました!色々制限事項もあるので、下記エントリをご確認ください。
おのずと必要になってくるのは、自動起動・停止ですよね。そこで、CloudWatch Events + Lambdaで実装してみました。
やってみた
今回は以下の流れでやります
- Lambdaへアップロードするzipを作成
- Lambda用のIAMロールの作成
- Lambdaファンクションの作成
- CloudWatch Eventsの登録
Lambdaへアップロードするzipを作成
まずは、Lambdaファンクション用のzipを作成しましょう。デフォルトのboto3だとバージョンが古いようでRDS起動停止のSDKが利用できませんでした。 そのため、最新のboto3をパッケージングしたzipを作成します。
停止
cd ~ WORKDIR=lambda_stop_rds mkdir -p ${WORKDIR} pip install boto3 -t ${WORKDIR} tee ${WORKDIR}/lambda_function.py <<EOF import boto3 def lambda_handler(event, context): client = boto3.client('rds') response = client.stop_db_instance( DBInstanceIdentifier=event["DBInstanceIdentifier"], ) print (response) EOF cd ${WORKDIR} zip -r ~/${WORKDIR}.zip .
起動
cd ~ WORKDIR=lambda_start_rds mkdir -p ${WORKDIR} pip install boto3 -t ${WORKDIR} tee ${WORKDIR}/lambda_function.py <<EOF import boto3 def lambda_handler(event, context): client = boto3.client('rds') response = client.start_db_instance( DBInstanceIdentifier=event["DBInstanceIdentifier"], ) print (response) EOF cd ${WORKDIR} zip -r ~/${WORKDIR}.zip .
Lambda用のIAMロールの作成
LambdaでRDSの起動・停止のみを許可したIAMロールを作成します。 以下のインラインポリシーでIAMロールを作成しました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds:StopDBInstance", "rds:StartDBInstance" ], "Resource": "arn:aws:rds:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }
Lambdaファンクションの作成
以下でLambdaファンクションを作成します。
- 設計図の選択でブランク
- ランタイムにPythonを指定
- コードエントリタイプにZIPを選択し、作成したzipファイルをアップロード
- 作成したIAMロールを指定
起動用、停止用の2つのファンクションを作成します。
CloudWatch Eventsの登録
CloudWatch Eventsのルールを作成して定期実行させます。
注意:cronはUTC指定です
入力設定解説
以下のように入力設定(定数JSONテキスト)を行い、対象のRDSインスタンスを指定します。今回は、"chibadb"を指定しています。
{ "DBInstanceIdentifier": "chibadb" }
これで、RDSの起動・停止をスケジュール実行できるようになりました。
さいごに
いかがでしたでしょうか?開発環境のコスト削減で活用できそうなRDSの起動・停止をスケジュール実行してみました。規模が大きく台数が多い場合、RDSに付与したタグをベースに停止・起動するようにコード変更するとさらに汎用的に使えるかなと思います。それではまたお会いしましょう。
参考
http://boto3.readthedocs.io/en/latest/reference/services/rds.html https://dev.classmethod.jp/cloud/aws/boto3_lambda_deploypackage/