c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

そこらにある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や。

所で…

datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
とか
re.compile("test").match(u"test")
って書き方が「マジで!?」なんだけど、実際の所Pythonerに聞いてみたい…


しかしPHPPerlに慣れた人間には、$とか{とかないコードは、視線の引っかかる所がなくてよみづらいですな…慣れるのかな…。

*1:世代管理はいいけど、同一のVol_idだとガッツリ古いのから消しやがるので、あるポイントのスナップショットをとっておけないとか、とってくるデータにフィルタ入ってないから無駄な処理じゃね?とか、説明文にインスタンスIDくらいいれようよ…とか色々