そこらにあるEC2+EBSでの世代バックアップスクリプトが
「EC2 EBS 世代バックアップ 」とかでググっ出てくるコードがどれも今一つピンと来ない、つーか使いづらい*1ので、色々な所のコードを(どれも似てるので、みんなコピペで改造してるっぽい)参考にしつつ、自分も書いた。
オチ
#!/usr/bin/python # -*- coding: utf-8 -*- import re import sys import datetime import httplib from boto import config from boto import ec2 from boto.ec2.connection import EC2Connection GENERATION_NUM = 5 VOL_ID = 'vol-XXXXXXXX' AWS_ACCESS_KEY_ID = 'XXX' AWS_SECRET_ACCESS_KEY = 'XXX' DESCRIPTION_PREFIX = 'daily backup' REGION_NAME = 'ap-northeast-1' conn = httplib.HTTPConnection( "169.254.169.254", 80 ) conn.request( "GET", "/latest/meta-data/instance-id" ) res = conn.getresponse() if res.status != 200: print "cant get instance-id" sys.exit() INSTANCE_ID = res.read().decode( "UTF-8" ) conn.close() DESCRIPTION = DESCRIPTION_PREFIX + ' ' + INSTANCE_ID + ' ' + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") print DESCRIPTION regions = ec2.regions(aws_access_key_id=AWS_ACCESS_KEY_ID,aws_secret_access_key=AWS_SECRET_ACCESS_KEY) for r in regions: if r.name == REGION_NAME: _region=r conn = EC2Connection(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,region=_region) conn.create_snapshot(volume_id=VOL_ID, description=DESCRIPTION) snapshot = {} for x in conn.get_all_snapshots(owner='self'): if(x.volume_id == VOL_ID and re.compile(DESCRIPTION_PREFIX).match(x.description) ): tmp = {x.id:x.start_time} print x.id + " " + x.volume_id + " " + x.description snapshot.update(tmp) snapshot = sorted(snapshot.items(), key=lambda (k, v): (v, k), reverse=True) for i in range(GENERATION_NUM, len(snapshot)): print "DELETE " + snapshot[i][0] conn.delete_snapshot(snapshot[i][0])
当然だけれど、botoが入ってないとダメ。
入れ方はググれ。
あとはCronにいれて回せばOKや。