Amazon RDSでスナップショットを自動コピーするシェルスクリプト

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件まで取ることができるようになっています。