RDSの自動バックアップはAWSの仕様として1日1回、最大35日間しか取得できない。
※最大の日数の緩和の申請も断られました。
しかし、システム要件によっては60日間保存や、一日2回の取得が必要なケースも想定される。
自動バックアップはバックアップ時間を指定していても、直近のデータまでの復元が可能ということから、自動バックアップは有効活用したい。
今回は、要件に沿ったバックアップ頻度や回数を行うために、EC2で用いた Lambda でのスナップショットの取得を用いた設定について記載。
※Lamdaで関数を作成するまでの手順は、過去の投稿を参考にしてください。
関数コードに以下のコードを貼り付けます。
import boto3
import time
from botocore.client import ClientError
from datetime import datetime, timedelta, tzinfo
rds = boto3.client('rds')
class JST(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=9)
def dst(self, dt):
return timedelta(0)
def tzname(self, dt):
return 'JST'
def create_snapshot(prefix, instanceid):
snapshotid = "-".join([prefix, datetime.now().strftime("%Y-%m-%d-%H-%M")])
for i in range(0, 5):
try:
snapshot = rds.create_db_snapshot(
DBSnapshotIdentifier=snapshotid,
DBInstanceIdentifier=instanceid
)
return
except ClientError as e:
print(str(e))
time.sleep(1)
def delete_snapshots(prefix, days):
snapshots = rds.describe_db_snapshots()
now = datetime.utcnow().replace(tzinfo=None)
for snapshot in snapshots['DBSnapshots']:
# creating snapshot
if not snapshot.has_key('SnapshotCreateTime'):
continue
delta = now - snapshot['SnapshotCreateTime'].replace(tzinfo=None)
if snapshot['DBSnapshotIdentifier'].startswith(prefix) and delta.days >= days:
rds.delete_db_snapshot(DBSnapshotIdentifier=snapshot['DBSnapshotIdentifier'])
def lambda_handler(event, context):
delete_days = 60
snapshot_prefix = "rds-INSTANCENAME"
instances = ["INSTANCENAME"]
for instance in instances:
create_snapshot(snapshot_prefix, instance)
delete_snapshots(snapshot_prefix, delete_days)
以下の項目については適時変更する。
delete_days = 60
設定値以前の日数を経過したデータを削除する
snapshot_prefix = “rds-INSTANCENAME”
プレフィックス名として使用する値を設定する。
instances = [“INSTANCENAME”]
DBインスタンス名を設定する。
あとは、CloudWatch Events で好きなスケジュールを設定すれば要件に近づけると思います。
1日2回(08:00 JTS,15:00 JTS)の場合
cron(0 23 * * ? *) と cron(0 6 * * ? *) を作成 ※UTC
1月1回(毎月1日 0:00 JTS)の場合
cron(0 15 1 * ? *) として作成 ※UTC
IAM ロールの権限について
RDS のスナップショットを Lambda で作成する場合は、IAMロールに以下の設定を追加する。
リスト
アクション | リソース | リクエスト条件 |
---|---|---|
DescribeDBInstances | すべてのリソース | なし |
DescribeDBSnapshot | すべてのリソース | なし |
書き込み
アクション | リソース | リクエスト条件 |
---|---|---|
CreateDBSnapshot | すべてのリソース | なし |
DeleteDBSnapshot | すべてのリソース | なし |
スナップショットの制限について
本手順で手動スナップショットを取得することはできますが、デフォルトの手動スナップショット取得数は制限されています。 Amazon RDS の制限 要件に合わせて申請が必要になりますが、一度もスナップショットを取得していない状態だと申請が取り下げられましたので、一定期間実行させた後申請するほうが良いと思います。
Уou are my inspirɑtion , I have few blogs and raгеly run ߋut ffom t᧐
post .