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
リストア
おおまかな手順
- リストア先のインスタンス作成
- リストア先の/dev/sda をDetach する
- バックアップのスナップショットからボリュームを作成
- 作成したボリュームをリストア先へAtacheする
- 起動後、バックアップスクリプトのボリュームIDを変更する
リストア先のインスタンス作成
元インスタンスの元になったイメージ(AMI)や元インスタンスから
Launch More Like This
を選択するなどして、新しいインスタンスを作成する。
作成先のゾーンを確認する。
リストア先の/dev/sda をDetach する
リストア先のインスタンスを作成したら、そのインスタンスを停止する。
その後、ボリュームメニューから、リストア先の/dev/sda にアタッチされているボリュームをDetachする。
もう不要なので、そのボリュームは削除して良い。
バックアップのスナップショットからボリュームを作成
リストアしたいスナップショットからボリュームを作成する
ボリュームの作成先のゾーンをリストア先インスタンスを作成したゾーンと同じにすること。
作成したボリュームをリストア先へAtacheする
作成したボリュームをリストア先へAtacheする。
この時、デバイス名を入力できるので
/dev/sda
とする。
起動後、バックアップスクリプトのボリュームIDを変更する
リストア先のインスタンスを起動して、無事に動作するか確認する。
※忘れずにバックアップシェルのバックアップ対象(ボリュームID)を変更する
[通知用URL]
Tweet
最終更新時間:2015年01月14日 22時58分30秒