2012年12月21日金曜日

Amazon EC2 (Amazon Linux) で 自動的にスナップショットを別のリージョンにコピー


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

最新のAPIをダウンロードして解凍します。
#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円かかるという計算になります。


Related Posts Plugin for WordPress, Blogger...