#■経緯
Dev環境のRDSを長期間停止しておきたい
RDSについてインスタンスStop機能を使って停止すると
RDSのStop機能は7日後に自動的に起動される仕様になっている。
停止はRDSのインスタンス削除する方法もあるが、
毎回スナップショットからの復旧は面倒。
そのため、
Lambdaの関数を利用して、
定期的にRDSの起動状況を確認し、起動しているなら停止を実施するやり方で
停止を行う
RDSを停止する時は
Lambdaの関数「rds_stop」のルールCloudWatch Events「rds_stop_cron」を「有効」にする。
RDSを起動する時は
「rds_stop」のルールCloudWatch Events「rds_stop_cron」を「無効」にすることを忘れないよう!
#■Lambdaの関数
項目 | 内容 |
---|---|
ランタイム | Rython3.6 |
関数 | rds_stop |
Lambdaのロール | lambda_rds_start_stop_execution |
トリガー | CloudWatch Events |
ルール | 「rds_stop_cron」スケジュール式: cron(0/10 * * * ? *) |
###Lambdaのロール
lambda_rds_start_stop_execution
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"rds:Describe*",
"rds:StartDBInstance",
"rds:StopDBInstance",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
###Lambdaの関数
関数:rds_stop
import boto3
# RDSインスタンス一覧
rds_ids = [
'dev-db'
]
def lambda_handler(event, context):
# RDS インスタンスの処理
rds = boto3.client('rds')
# リストの要素が0の場合は終了
if len(rds_ids) == 0:
print('対象RDSインスタンスがありません。')
else:
for i in rds_ids:
# RDSを停止する前にすでに停止しているどうか確認する。
response = rds.describe_db_instances(DBInstanceIdentifier=i)
rds_status = response["DBInstances"][0]["DBInstanceStatus"]
print(rds_status)
# ステータスが「stopped」の場合
if rds_status == "stopped":
print('既に RDS インスタンスが停止しています。:' + str(i))
elif rds_status == "available":
# string 形式で RDS 受け取る
rds.stop_db_instance(DBInstanceIdentifier=i)
print('RDSインスタンスを停止しました。:' + str(i))
else:
# available や stopped 以外の場合
print('ステータスが変更途中です。:' + str(i))
return 'RDSインスタンスの停止処理を完了しています。'
===================
関数:rds_stop
import boto3
# RDSインスタンス一覧
rds_ids = [
'dev-db'
]
def lambda_handler(event, context):
# RDS インスタンスの処理
rds = boto3.client('rds')
# リストの要素が0の場合は終了
if len(rds_ids) == 0:
print('対象RDSインスタンスがありません。')
else:
for i in rds_ids:
# RDSを起動する前にすでに起動しているかどうか確認する。
response = rds.describe_db_instances(DBInstanceIdentifier=i)
rds_status = response["DBInstances"][0]["DBInstanceStatus"]
print(rds_status)
# ステータスが「available」の場合
if rds_status == "available":
print('既に RDS インスタンスが起動しています。:' + str(i))
elif rds_status == "stopped":
# string 形式で RDS 受け取る
rds.start_db_instance(DBInstanceIdentifier=i)
print('RDSインスタンスを起動しました。:' + str(i))
else:
# available や stopped 以外の場合
print('ステータスが変更途中です。:' + str(i))
return 'RDSインスタンスの起動処理を完了しています。'