Amazon EBS と boto を使って自動バックアップ環境を構築する


Amazon EBS の特徴はマウントしたボリュームに対するスナップショットが取れることだろう。boto を使って簡単にバックアップ環境を以前に作業したメモを残しておく。

boto は python のライブラリで、Amazon EC2 のインスタンス上から AWS の API を操作できる。boto の機能は多種であるが、今回は EBS の API を操作して、毎日1回スナップショットをとって5世代分保存する設定をしてみる。

構築手順

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 のサービスをうまく使うことで簡単に終わってしまう。この新しい感覚と手法は実践的に使ってみないと伝わらないんだろうな。