この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
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/