EBSスナップショットのリージョン間コピーができるようになりました(
2012年12月18日付)。
以前、自動でスナップショットを取る方法(
こちらの記事)について書きましたが、本記事は、そのスナップショットを自動で別のリージョンにコピーして世代管理するための設定です。シェルでamazon-api-toolsを呼び出していますのでプログラム環境は不要です。ここでは、cronの日時処理として設定しています。
使用したインスタンスのイメージですが、『Basic 32-bit Amazon Linux AMI 2011.02.1 Beta (AMI Id: ami-300ca731)』を使用しました。
管理者になる
$sudo su -
EC2-Api-Toolsのアップデート
Amazon Linux AMIからインスタンスを作成した場合は、API Toolsが標準でインストールされていますが、リージョン間コピーのためのコマンド EC2-copy-snapshot が含まれていない場合は、最新のAPIにアップデートする必要があります。次のコマンドで EC2-copy-snapshot の存在を確認します。何も表示されなければアップデートが必要です。
#find / -name ec2-copy-snapshot
#cd /usr/local/src
#wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
#unzip ec2-api-tools
EC2-Api-Toolsは、/opt/aws/apitools に実ファイルが展開されていて、そこに対してシンボリックリンクが張られています(下記の赤字部分)。
#ls /opt/aws/apitools/ -al
total 36
drwxr-xr-x 9 root root 4096 Dec 21 01:56 .
drwxr-xr-x 5 root root 4096 Feb 24 2011 ..
lrwxrwxrwx 1 root root 13 Feb 24 2011 as -> ./as-1.0.33.1
drwxr-xr-x 4 root root 4096 Feb 24 2011 as-1.0.33.1
lrwxrwxrwx 1 root root 15 Feb 24 2011 ec2 -> ./ec2-1.3.62308
drwxr-xr-x 4 root root 4096 Feb 24 2011 ec2-1.3.62308
lrwxrwxrwx 1 root root 14 Feb 24 2011 elb -> ./elb-1.0.10.0
drwxr-xr-x 4 root root 4096 Feb 24 2011 elb-1.0.10.0
lrwxrwxrwx 1 root root 11 Feb 24 2011 iam -> ./iam-1.2.0
drwxr-xr-x 4 root root 4096 Feb 24 2011 iam-1.2.0
lrwxrwxrwx 1 root root 13 Feb 24 2011 mon -> ./mon-1.0.9.5
drwxr-xr-x 4 root root 4096 Feb 24 2011 mon-1.0.9.5
lrwxrwxrwx 1 root root 13 Feb 24 2011 rds -> ./rds-1.3.003
drwxr-xr-x 4 root root 4096 Feb 24 2011 rds-1.3.003
lrwxrwxrwx 1 root root 14 Dec 21 01:55 ses -> ses-2012.07.09
drwxr-xr-x 3 root root 4096 Dec 21 01:55 ses-2012.07.09
ですので、この /opt/aws/apitools ディレクトリに先ほど解凍した最新のAPIを持ってきます。(
バージョンは適宜読み替えてください)
#mv ec2-api-tools-1.6.6.0 /opt/aws/apitools/
次にシンボリックリンクの張り直しをします。また、新たなコマンドについては、実行用シンボリックリンクを /opt/aws/bin ディレクトリに作成する必要があります。
#cd /opt/aws/apitools/
#rm ec2
#ln -s ec2-api-tools-1.6.6.0/ ec2
#cd /opt/aws/bin/
#ln -s ../apitools/ec2/bin/ec2-copy-snapshot ec2-copy-snapshot
シェルファイルの作成
JAVA_HOMEとEC2_HOMEの設定値を確認後、リージョン間コピー用シェルファイルを作成します。赤字部分を環境に合わせて変更してください。コピー先のリージョンは COPY_TO_REGION で指定します。サンプルはシンガポールへのコピーです。
#echo $JAVA_HOME
/usr/lib/jvm/jre
#echo $EC2_HOME
/opt/aws/apitools/ec2
#vi /etc/cron.daily/copy_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]$//'`
COPY_TO_REGION="ap-southeast-1"
SNAPSHOT_DESCRIPTION="Daily Backup"
SNAPSHOT_GENERATION=1
# Delete Snapshots On Another Region.
SNAPSHOTS=`ec2-describe-snapshots --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${COPY_TO_REGION} | grep "${SNAPSHOT_DESCRIPTION}" | sort -k5 -r | awk '{print $2}'`
COUNT=1
for SNAPSHOT in ${SNAPSHOTS}; do
if [ ${COUNT} -ge ${SNAPSHOT_GENERATION} ]; then
echo "deleting ${SNAPSHOT}";
ec2-delete-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${COPY_TO_REGION} ${SNAPSHOT}
fi
COUNT=`expr ${COUNT} + 1`
done
# Copy A Latest Snapshot To Another Region.
SNAPSHOTS=`ec2-describe-snapshots --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --region ${AWS_REGION} | grep "${SNAPSHOT_DESCRIPTION}" | sort -k5 -r | awk '{print $2}'`
for SNAPSHOT in ${SNAPSHOTS}; do
echo "copying ${SNAPSHOT}";
ec2-copy-snapshot --private-key ${AWS_PRIVATE_KEY} --cert ${AWS_CERTIFICATE} --description "${SNAPSHOT_DESCRIPTION}" --region ${COPY_TO_REGION} -r ${AWS_REGION} -s ${SNAPSHOT}
break
done
指定された世代を超えたファイルを削除するための判定ですが、日付とディスクリプションで判定しています。
ディスクリプションを指定しているのは、上記ファイルをhourly,
monthlyと作り、それぞれ別のディスクリプションを指定することで、1時間毎の最新のバックアップを6世代とりつつ、月次のバックアップを12世代
残していくといった周期の違うスナップショットを保持できるようにするためです。
最後に実行権限を付与して、動作確認をします。問題がなければ別リージョン上にスナップショットがコピーされます。なお、シェルでのコピーが完了しても別リージョン上に表示されるまではタイムラグがあります。
#chmod 755 /etc/cron.daily/copy_snapshot
#/etc/cron.daily/copy_snapshot
[2013.01.15追記]
利用料金ですが、ざっくりいうと転送元のS3のoutにかかる料金と、転送先の保存容量にかかる料金が一番大きなウェイトを占めるのではないかと思います。S3のoutは東京リージョンだと1Gあたり約0.2ドルです。仮に1ドル90円でスナップショットのサイズを5GByteとすると、毎日転送に90円ずつ、一ヶ月で2700円かかるという計算になります。