トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

Amazon EC2 を snapshot でバックアップ

EC2内の仮想マシン をスナップショットでバックアップする

バックアップ

http://d.hatena.ne.jp/rx7/20100606/p1
基本的には、上記スクリプトをぱくる。

以下参考スクリプト

 #!/bin/sh
 export JAVA_HOME=/usr
 export EC2_HOME=/opt/ec2-api-tools
 export PATH=${PATH}:/bin:/usr/bin:${EC2_HOME}/bin
 
 # ----- config
 AWS_PRIVATE_KEY=/etc/ec2_keys/pk.pem
 AWS_CERTIFICATE=/etc/ec2_keys/cert.pem
 
 EBS_VOLUME_ID="vol-ead8e482"
 EBS_GENERATION_COUNT=3
 
 AWS_REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/[a-z]$//'`
 # -----
 
 # スナップショットの取得
 echo -n "[creating...] "
 ec2-create-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} ${EBS_VOLUME_ID}
 
 # スナップショットの一覧を取得
 SNAPSHOTS=`ec2-describe-snapshots --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} | grep ${EBS_VOLUME_ID} | sort -k5 -r | awk '{print $2}'`
 
 # 世代保管分の調整(過去スナップショットのクリア)
 COUNT=1
 for SNAPSHOT in ${SNAPSHOTS}; do
   if [ ${COUNT} -le ${EBS_GENERATION_COUNT} ]; then
     # 保管対象なのでN/A
     echo "[keeping] " ${SNAPSHOT}
   else
     # 保管対象外なので削除
     echo -n "[deleting...] "
     ec2-delete-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} ${SNAPSHOT}
   fi
   COUNT=`expr ${COUNT} + 1`
 done

 参考スクリプトを元にバックアップ環境を作成

注意点

ボリュームIDがベタ書きなので、リストア等でボリュームIDが変わったらバックアップのボリュームIDも書きなおす必要あり!!!

環境変数設定ファイル

/root/bin/envEC2

 export JAVA_HOME="/etc/alternatives/java_sdk"
 export EC2_HOME="/root/tools/ec2-api-tools"
 export EC2_PRIVATE_KEY="/root/.ec2/pk-xxxxxxxxx.pem"
 export EC2_CERT="/root/.ec2/cert-xxxxxxxxx.pem"
 export EC2_URL="http://ec2.ap-northeast-1.amazonaws.com"
 export PATH="${PATH}:${EC2_HOME}/bin"

バックアップシェル

/root/bin/backup.sh

 #!/bin/bash
 
 source /root/bin/envEC2
 
 EBS_VOLUME_ID="vol-hogehoge"
 EBS_GENERATION_COUNT=10
 EBS_DATE=`date +%F_%T`
 
 echo ${EBS_DATE} start backup
 
 # create Snapshot
 echo -n "[creating...] "
 ec2-create-snapshot ${EBS_VOLUME_ID} -d \"${EBS_VOLUME_ID}_${EBS_DATE}_backup\"
 
 # create list of snapshots
 SNAPSHOTS=`ec2-describe-snapshots | grep ${EBS_VOLUME_ID} | sort -k5 -r | awk '{print $2}'`
 
 COUNT=1
 for SNAPSHOT in ${SNAPSHOTS}; do
   if [ ${COUNT} -le ${EBS_GENERATION_COUNT} ]; then
     # keep snapshot
     echo "[keeping] " ${SNAPSHOT}
   else
     # delete snapshot
     echo -n "[deleting...] "
     ec2-delete-snapshot ${SNAPSHOT}
   fi
   COUNT=`expr ${COUNT} + 1`
 done
 
 echo finish backup

バックアップ実行シェル

/root/bin/runBackup.sh

 #!/bin/bash
 
 EBS_LOG=/root/backup.log
 /root/bin/backup.sh >> ${EBS_LOG}

cron

# crontab -l
00 03 * * * /root/bin/runBackup.sh


リストア

おおまかな手順

  1. リストア先のインスタンス作成
  2. リストア先の/dev/sda をDetach する
  3. バックアップのスナップショットからボリュームを作成
  4. 作成したボリュームをリストア先へAtacheする
  5. 起動後、バックアップスクリプトのボリュームIDを変更する

 リストア先のインスタンス作成

元インスタンスの元になったイメージ(AMI)や元インスタンスから

Launch More Like This

を選択するなどして、新しいインスタンスを作成する。

作成先のゾーンを確認する。

 リストア先の/dev/sda をDetach する

リストア先のインスタンスを作成したら、そのインスタンスを停止する。
その後、ボリュームメニューから、リストア先の/dev/sda にアタッチされているボリュームをDetachする。
もう不要なので、そのボリュームは削除して良い。

 バックアップのスナップショットからボリュームを作成

リストアしたいスナップショットからボリュームを作成する

ボリュームの作成先のゾーンをリストア先インスタンスを作成したゾーンと同じにすること。

 作成したボリュームをリストア先へAtacheする

作成したボリュームをリストア先へAtacheする。
この時、デバイス名を入力できるので

/dev/sda

とする。

 起動後、バックアップスクリプトのボリュームIDを変更する

リストア先のインスタンスを起動して、無事に動作するか確認する。

※忘れずにバックアップシェルのバックアップ対象(ボリュームID)を変更する

[カテゴリ: 仮想化]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2015年01月14日 22時58分30秒