トップ 一覧 置換 検索 ヘルプ 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

!!参考スクリプトを元にバックアップ環境を作成
!注意点
{{word ボリュームIDがベタ書きなので、リストア等でボリュームIDが変わったらバックアップのボリュームIDも書きなおす必要あり!!!,red}}

!環境変数設定ファイル
/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_DATE}_backup\"
  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を変更する
リストア先のインスタンスを起動して、無事に動作するか確認する。

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

{{category2 仮想化}}