2011年9月5日月曜日

Amazon EC2 (Amazon Linux) で 自動的にスナップショットを作成


バックアップのために自動でスナップショットを取り、指定した世代分保管していくための方法です。シェルでamazon-api-toolsを呼び出していますので、プログラム環境は不要です。ここでは、cronの日時処理として設定しています。

使用したインスタンスのイメージですが、『Basic 32-bit Amazon Linux AMI 2011.02.1 Beta (AMI Id: ami-300ca731)』を使用しました。


管理者になる
設定は管理者権限で行いますので権限を取ります。
$sudo su -

プライベートキーファイル、証明書ファイルの設定

キーファイルを配置するためのディレクトリを作成して、プライベートキーファイルと証明書ファイル(X.509 証明書)をコピーします。
#cd /home/ec2-user
#mkdir .aws
#chown ec2-user:ec2-user .aws
#chmod 700 .aws

シェルファイルの作成

JAVA_HOMEとEC2_HOMEの設定値を確認後、バックアップ用シェルファイルを作成します。赤字部分を環境に合わせて変更してください。
#echo $JAVA_HOME
/usr/lib/jvm/jre

#echo $EC2_HOME
/opt/aws/apitools/ec2

#vi /etc/cron.daily/create_snapshot
#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/jre
export EC2_HOME=/opt/aws/apitools/ec2
export PATH=${PATH}:/bin:/usr/bin:${EC2_HOME}/bin

AWS_PRIVATE_KEY=/home/ec2-user/.aws/pk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem
AWS_CERTIFICATE=/home/ec2-user/.aws/cert-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem
AWS_REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/[a-z]$//'`

EBS_VOLUME_ID="vol-xxxxxxxx"

SNAPSHOT_DESCRIPTION="Daily Backup"
SNAPSHOT_GENERATION=7

ec2-create-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} --description "${SNAPSHOT_DESCRIPTION}" ${EBS_VOLUME_ID}

SNAPSHOTS=`ec2-describe-snapshots --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} | grep ${EBS_VOLUME_ID} | grep "${SNAPSHOT_DESCRIPTION}" | sort -k5 -r | awk '{print $2}'`

COUNT=1
for SNAPSHOT in ${SNAPSHOTS}; do
  if [ ${COUNT} -gt ${SNAPSHOT_GENERATION} ]; then
    echo "deleting ${SNAPSHOT}";
    ec2-delete-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} ${SNAPSHOT}
  fi
  COUNT=`expr ${COUNT} + 1`
done

指定された世代を超えたファイルを削除するための判定ですが、日付はもちろんですが、EBSボリューム名とディスクリプションも判定しています。

EBSボリュームだけでも可能なのですが、ディスクリプションを指定しているのは、上記ファイルをhourly, monthlyと作り、それぞれ別のディスクリプションを指定することで、1時間毎の最新のバックアップを6世代とりつつ、月次のバックアップを12世代残していくといった周期の違うスナップショットを保持できるようにするためです。

最後に実行権限を付与して、動作確認をします。問題がなければスナップショットが作成されます。
$chmod 755 /etc/cron.daily/create_snapshot
$/etc/cron.daily/create_snapshot 




Related Posts Plugin for WordPress, Blogger...