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秒