Amazon EBS の特徴はマウントしたボリュームに対するスナップショットが取れることだろう。boto を使って簡単にバックアップ環境を以前に作業したメモを残しておく。
boto は python のライブラリで、Amazon EC2 のインスタンス上から AWS の API を操作できる。boto の機能は多種であるが、今回は EBS の API を操作して、毎日1回スナップショットをとって5世代分保存する設定をしてみる。
- botoのページ: http://code.google.com/p/boto/
- 参考にしたURL
構築手順
1. boto インストール
- pythonで動作するのでインストール
# yum -y install python-devel
- boto ページより最新版をダウンロード
# wget http://boto.googlecode.com/files/boto-1.8d.tar.gz # tar zvxf boto-1.8d.tar.gz # cd boto-1.8d # python setup.py install
2. 自動処理用スクリプトの作成
- ファイルパスは “/home/snapshot.py” とした
- aws_access_key_idとaws_secret_access_key の部分を書き換えるだけ。仮に aws_access_key_id は ACCESS KEY、aws_secret_access_key は SECRET KEY としてる。各環境によるそれぞれの値に置き換えてください。
- 作ったSnapshotのdescriptionも書けるのでお好みに変えてください。
#!/usr/bin/python import sys from boto.ec2.connection import EC2Connection if(len(sys.argv) != 3): print "Usage: snapshot.py <num> <volume-id>" sys.exit() conn = EC2Connection('ACCESS KEY','SECRET KEY') conn.create_snapshot(sys.argv[2], description='This is Backup Snapshot by snapshot.py') snapshot = {} for x in conn.get_all_snapshots(): if(x.volume_id == sys.argv[2]): tmp = {x.id:x.start_time} snapshot.update(tmp) snapshot = sorted(snapshot.items(), key=lambda (k, v): (v, k), reverse=True) for i in range(int(sys.argv[1]), len(snapshot)): conn.delete_snapshot(snapshot[i][0])
3. cron に仕込む
- EBS の vol ID は仮で “vol-12345678” としている。それぞれの環境に置き換えてください
- “# crontab -e” して以下の内容を記述
45 04 * * * /home/snapshot.py 5 vol-12345678
- 記述方法は、” [分] [時] [日] [月] [曜日] [filepath] [残したい世代数] [EBSのVolume ID] ” 例は毎日AM4:45に処理させる記述内容
動作確認
動作確認用として、
45 * * * * /home/snapshot.py 5 vol-12345678
として、分の部分を変化させながら動作確認。5世代分まで保存できた。確認してみる。
- -K で private key ファイルを指定している。仮に “pk-xxxxxxxx.pem” としているので、それぞれの環境に合わせて置き換えてください
- -C で certificate file を指定している。仮に “cert-xxxxxxxx.pem” としているので、それぞれの環境に合わせて置き換えてください
$ ec2-describe-snapshots -K pk-xxxxxxxx.pem -C cert-xxxxxxxx.pem SNAPSHOT snap-42cc692b vol-12345678 completed 2009-08-12T03:03:01+0000 100% SNAPSHOT snap-e9cc6980 vol-12345678 completed 2009-08-12T03:10:02+0000 100% SNAPSHOT snap-3ec96c57 vol-12345678 completed 2009-08-12T03:55:01+0000 100% SNAPSHOT snap-c6c86daf vol-12345678 completed 2009-08-12T04:05:01+0000 100% SNAPSHOT snap-27cb6e4e vol-12345678 completed 2009-08-12T04:12:01+0000 100%
さらにcronを回しても6世代分にはならず、最も古いものを削除して5世代分を保持してくれた。
$ ec2-describe-snapshots -K pk-xxxxxxxx.pem -C cert-xxxxxxxx.pem SNAPSHOT snap-e9cc6980 vol-12345678 completed 2009-08-12T03:10:02+0000 100% SNAPSHOT snap-3ec96c57 vol-12345678 completed 2009-08-12T03:55:01+0000 100% SNAPSHOT snap-c6c86daf vol-12345678 completed 2009-08-12T04:05:01+0000 100% SNAPSHOT snap-27cb6e4e vol-12345678 completed 2009-08-12T04:12:01+0000 100% SNAPSHOT snap-c4cb6ead vol-12345678 completed 2009-08-12T04:16:02+0000 100%
最も古いタイムスタンプが消えて、新しいものが増えていることが分かる。
crontab を
45 04 * * * /home/snapshot.py 5 vol-581cf731
に戻して確認終了。
よく S3 にバックアップと言うが、まずは大事なファイルは EBS で作ってマウントしたボリューム上に置いて、この仕組みにのせればバックアップ環境としては十分だろう。
シェルを駆使しして書いた頃が遠い昔のようだ。。。従来のような手間が AWS のサービスをうまく使うことで簡単に終わってしまう。この新しい感覚と手法は実践的に使ってみないと伝わらないんだろうな。