presents by IT Consulting 109

AWS RDS – Lambdaを用いたRDSのスナップショット取得&世代管理

概要

RDSの自動バックアップはAWSの仕様として1日1回、最大35日間しか取得できない。
※最大の日数の緩和の申請も断られました。

しかし、システム要件によっては60日間保存や、一日2回の取得が必要なケースも想定される。

自動バックアップはバックアップ時間を指定していても、直近のデータまでの復元が可能ということから、自動バックアップは有効活用したい。

 

今回は、要件に沿ったバックアップ頻度や回数を行うために、EC2で用いた Lambda でのスナップショットの取得を用いた設定について記載。

 

手順

※Lamdaで関数を作成するまでの手順は、過去の投稿を参考にしてください。

AWS EBS – スナップショットの自動取得&世代管理

 

関数コードに以下のコードを貼り付けます。

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 の制限 要件に合わせて申請が必要になりますが、一度もスナップショットを取得していない状態だと申請が取り下げられましたので、一定期間実行させた後申請するほうが良いと思います。

この記事を書いた人
名前:TRUE's。 千葉県育ち、神奈川県在住のIT系フリーエンジニア。 IT系のナレッジサイトを不定期で更新中。 フォトグラファー兼エンジニアとして日々勤しんでいる。
コメント (1)
  1. holbornassets より:

    Уou are my inspirɑtion , I have few blogs and raгеly run ߋut ffom t᧐
    post .

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です