RDSにはAutomated Backups機能があり、最大35日分のバックアップを自動で取ることができます。
しかし、その日数を超えてしまったバックアップは自動的に削除されるようになっています。
そのため、ある程度の期間のバックアップを定期的に残したい場合は、毎月1日や毎週月曜日に自動バックアップをコピーして月次・週次バックアップを取る必要があります。
EC2上にシェルスクリプトを置いて自動バックアップ完了後の時間にcronで1日1回実行します。
AWS Cli(Python版)を使っています。
注意点
なお、自動バックアップですがスナップショットはUTCベースでrds:Identifer-YYYY-MM-DD-HH-SSみたいになるので、日付をまたぐと上手くコピーができなくなるので実行時間には注意が必要です。
例えば以下の例ではDAYのみあえてUTCで時間を取っています。
自動バックアップがUTC19時(日本時間で4時)の場合は日本時間で9時までにこのスクリプトを実行させてあげる必要があります。
#!/bin/sh DAY=`date -u +%Y-%m-%d` DATE=`date +%d` WEEK=`date +%w` COUNT=0 if [ ${DATE} = "01" -o ${WEEK} -eq 1 ]; then if [ ${DATE} = "01" ]; then PREFIX=monthly MAX=7 else PREFIX=weekly MAX=5 fi for INSTANCE in `aws --output text rds describe-db-instances --query='*[*].[DBInstanceIdentifier]'` do echo "INSTANCE: ${INSTANCE}" for SNAPSHOT in `aws --output text rds describe-db-snapshots --db-instance-identifier ${INSTANCE} --snapshot-type automated --query='*[*].[DBSnapshotIdentifier]' | grep rds:${INSTANCE}-${DAY}` do echo "SNAPSHOT: ${SNAPSHOT}" COPY_RESULT=`aws --output text rds copy-db-snapshot --source-db-snapshot-identifier ${SNAPSHOT} --target-db-snapshot-identifier ${PREFIX}-${INSTANCE}-${DAY}` echo "COPY_RESULT: ${COPY_RESULT}" if [ `echo $COPY_RESULT|grep DBSNAPSHOT` ]; then for DELETE_TARGET_SNAPSHOT in `aws --output text rds describe-db-snapshots --db-instance-identifier $INSTANCE --snapshot-type manual --query='*[*].[DBSnapshotIdentifier]' | grep ${PREFIX}-${INSTANCE} | sort -r` do echo "DELETE_TARGET_SNAPSHOT: ${DELETE_TARGET_SNAPSHOT}" if [ $COUNT -ge $MAX ];then echo "DELETE: ${DELETE_TARGET_SNAPSHOT}" aws --output text rds delete-db-snapshot --db-snapshot-identifier ${DELETE_TARGET_SNAPSHOT} fi COUNT=`expr $COUNT + 1` done fi done done fi
スナップショットのコピーが成功したらスナップショットの世代をチェックして古いものを消すようにしています。
なお、手動スナップショットは初期状態で最大50件まで取ることができるようになっています。