AWS rds-backup-to-s3


問題

RDSのバックアップをスナップショットだけではなく手元に置かないと安心できないとの意見があったら

ソース

  • RDSスナップショットからインスタンスを作成し、それをdumpしてS3へアップする
#!/bin/bash -l

export JAVA_HOME=/usr/lib/jvm/jre
export AWS_BIN=/opt/aws/bin
export PATH=$PATH:$EC2_HOME/bin:$AWS_BIN
export EC2_REGION=ap-northeast-1

Account="aws13"
keypair="/usr/lib/zabbix/externalscripts/key_pair.csv"

#複数アカウントをまとめ管理する場合
while IFS=',' read -r f1 f2 f3
do
  if [[ $Account == "$f1" ]]; then
    export AWS_ACCESS_KEY_ID="$f2"
    export AWS_SECRET_ACCESS_KEY="$f3"
    break
  fi
done < "$keypair"


INSTANCE=mysql-190501
RDS_SUBDOMAIN=cwtt780wxxxx
VPC_SECURITY_GROUP_IDS=sg-xxxxcd6
DATABASE_NAME=hogedb
DATABASE_USER=mysqladmin
DATABASE_PASS=mysqlpass

BACKUP_DATE=`date '+%Y%m%d'`
YESTERDAY_DATE=`date --date '1 day ago' '+%Y-%m-%d'`
YESTERDAY_DATE_2=`date --date '3 day ago' '+%Y%m%d'`

BK_SNAPSHOT=`aws rds describe-db-snapshots --region=$EC2_REGION |jq '.DBSnapshots[].DBSnapshotIdentifier' --raw-output | grep $INSTANCE-$YESTERDAY_DATE`

_STAT="status.log"
_WORK="/tmp"
_DATE="date +%Y/%m/%d-%H:%M:%S"

#インスタンス起動
echo $BK_SNAPSHOT
aws rds restore-db-instance-from-db-snapshot --db-instance-identifier dumpdb-$INSTANCE-bak --db-instance-class db.t2.micro --db-subnet-group-name 'hogedb-grp' --region=$EC2_REGION --db-snapshot-identifier $BK_SNAPSHOT

#ステータスがavailableになるまで待つ
_SLEEP_TIME=180
sleep 600
for (( i = 0; i < 3; i++ )); do
  sleep ${_SLEEP_TIME}
  status=`aws rds describe-db-instances --region=ap-northeast-1 --db-instance-identifier dumpdb-$INSTANCE-bak --query "DBInstances[*].DBInstanceStatus" --output text`
  echo $status
  is_break=false
  is_exit=false
  case ${status} in
    available)
      is_break=true
      echo ok;;
    backing-up)
      ;;
    creating)
      ;;
    deleted)
      is_break=false
      is_exit=true
      ;;
    deleting)
      is_break=false
      is_exit=true
      ;;
    failed)
      is_break=false
      is_exit=true
      ;;
    incompatible-restore)
      is_break=false
      is_exit=true
      ;;
    incompatible-paraameters)
      is_break=false
      is_exit=true
      ;;
    modifying)
      ;;
    rebooting)
      ;;
    resetting-master-credentials)
      is_break=false
      is_exit=true
      ;;
    storage-full)   
      is_break=false
      is_exit=true
      ;;
    *)
      is_break=false
      is_exit=true
      ;;
  esac

  if ${is_break}; then
    echo -e "\033[0;35m`${_DATE}` break (${status})\033[0;39m"  >> $_WORK/$_STAT

    aws rds modify-db-instance --db-instance-identifier dumpdb-$INSTANCE-bak --vpc-security-group-ids $VPC_SECURITY_GROUP_IDS --apply-immediately --region=$EC2_REGION
    sleep 180

    #もしローカルIPが引けない場合
    #DB_HOST=`nslookup dumpdb-$INSTANCE-bak.$RDS_SUBDOMAIN.ap-northeast-1.rds.amazonaws.com 10.0.0.2 |grep "Address: " |cut -f2 -d " " |cut -f 1`

    echo "Creating backup of database....."
    mysqldump -u$DATABASE_USER -p$DATABASE_PASS -h dumpdb-$INSTANCE-bak.$RDS_SUBDOMAIN.ap-northeast-1.rds.amazonaws.com --opt --single-transaction $DATABASE_NAME --compress  --compact |gzip --fast -c > /tmp/dump-$INSTANCE-rds-$BACKUP_DATE.bak.gz

    echo "Uploading backup to Amazon S3 bucket....."
    aws s3 cp /tmp/dump-$INSTANCE-rds-$BACKUP_DATE.bak.gz s3://rds-backup-aws13
    sleep 180

    echo "Successfully uploaded backup to S3"
    aws rds delete-db-instance --db-instance-identifier dumpdb-$INSTANCE-bak --skip-final-snapshot --region=$EC2_REGION

    echo "Deleting backup file(3日以上経過したtempファイルを削除)…"
    rm -rf /tmp/dump-$INSTANCE-rds-$YESTERDAY_DATE_2.bak.gz

    echo "Deleting backup file(3日以上経過したS3ファイルを削除)…"
    aws s3 rm s3://rds-backup-aws13/dump-$INSTANCE-rds-$YESTERDAY_DATE_2.bak.gz

    break
  fi

  if ${is_exit}; then
    echo -e "\033[0;31m`${_DATE}` exit 1 (${status})\033[0;39m" >> $_WORK/$_STAT
    exit 1
  fi

  echo -e "\033[0;32m`${_DATE}` sleep ${_SLEEP_TIME} (${status})\033[0;39m" >> $_WORK/$_STAT
done

メモ

さすが今はスナップショットを信用している。っていうかロックオンされてしまって他の選択余地がない。
ソースを捨てるにはもったいなかったので記録と。ご参考まで。