バックアップのために自動でスナップショットを取り、指定した世代分保管していくための方法です。シェルで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