2014年10月29日 星期三

Amazon RDS backup snapshot using python

看很多Amazon auto backup都是直接下指令排序在建立snapshot

由於對ubuntu指令不是很熟,所以就用python來撰寫一個自動建立snapshot的程式,超過15天的snapshot就刪除

系統: ubuntu 14.04

事先安裝:
1. sudo apt-get install awscli
2. sudo apt-get install rdscli 
(這個應該是可以不用安裝,沒試過解除安裝後是否可以運行,有興趣的可以自行嘗試看看)
3. sudo pip install boto
(Python package that provides interfaces to Amazon Web Services)


code example:
# -*- coding: utf-8 -*-
import boto.rds, datetime, time

def day_process(date):
        # process rds iso datetime return format => '%Y-%m-%d' for calculate
        d = datetime.datetime.strptime(str(date), '%Y-%m-%dT%H:%M:%S.%fZ')
        d = datetime.datetime.strptime(str(d).split(" ")[0], '%Y-%m-%d')
        return d


# connect rds
conn = boto.rds.connect_to_region('your rds region'\
        , aws_access_key_id = 'your aws_access_key_id'\
        , aws_secret_access_key = 'your aws_secret_access_key')

# today date
NToday = datetime.datetime.today().strftime('%Y-%m-%d')

# db instance list
db_instance = [put your instance list here, so we can use it for loop to process all db instance]

for db in db_instance:

    # get all db instance snapshot
    snap = conn.get_all_dbsnapshots(None, db, None, None)

    # snapshot list for snapshot id, snapshot_create_time
    snapshot_list = []
    for v in snap:
        temp_dict = {}
        temp_dict['snap_id'] = v.id
        temp_dict['snap_time'] = v.snapshot_create_time
        snapshot_list.append(temp_dict)

    # sort snapshot list
    sort_list = sorted(snapshot_list, key = lambda x:x['snap_time'])

    try:
        # create daily snapshot
        conn.create_dbsnapshot("{0}-{1}".format(db, NToday), db)

        # latest_day & oldest_day & se_lat_day
        latest_day = datetime.datetime.strptime(NToday, '%Y-%m-%d')
        se_lat_day = day_process(sort_list[len(sort_list)-1]['snap_time'])
        oldest_day = day_process(sort_list[0]['snap_time'])

        # snapshot keep days
        keep_day = 15

        if (latest_day-oldest_day).days and (se_lat_day-oldest_day).days >= keep_day:
            # for the situation over 2 snapshot > keep_day
            for li in sort_list:
                com_day_old = day_process(li['snap_time'])
                if (latest_day-com_day_old).days > keep_day:
                    conn.delete_dbsnapshot(li['snap_id'])

        if (latest_day-oldest_day).days >= keep_day:
            # for the situation only 1 snapshot > keep_day
            # delete snapshot
            conn.delete_dbsnapshot(sort_list[0]['snap_id'])

    except Exception as e:
        print e