Skip to content

Instantly share code, notes, and snippets.

@gavsmi
Last active August 29, 2015 14:04
Show Gist options
  • Save gavsmi/d7ecd93017023a91d7c5 to your computer and use it in GitHub Desktop.
Save gavsmi/d7ecd93017023a91d7c5 to your computer and use it in GitHub Desktop.
Snapshot the volume mounted at specified mount point in AWS, delete old snapshots
#! /usr/bin/python
from boto.utils import get_instance_metadata
import boto.ec2
import argparse, logging, datetime
def parsed_args():
# parse cmd line args
parser = argparse.ArgumentParser(description='Snapshot the volume mounted at specified mount point in AWS, delete old snapshots.')
parser.add_argument('--tag-name',
help='Name of tag to apply to snapshot')
parser.add_argument('--tag-value',
help='Value of tag to apply to snapshot')
parser.add_argument('--mount-point',
help='The mount point as defined by AWS to look for the volume. default is /dev/sdf',
default='/dev/sdf')
parser.add_argument('--retention',
help='Retention period (days) to keep snapshots for, older snapshots will be deleted. default is 31 days',
default='31')
return parser.parse_args();
def main():
args = parsed_args();
volume = find_volume(args.mount_point)
create_snapshot(volume, args.tag_name, args.tag_value)
delete_snapshots(volume, int(args.retention))
exit(0)
def find_volume(mount_point):
logging.info('Finding volume...')
conn = boto.ec2.connect_to_region(current_region())
metadata = get_instance_metadata()
vols = conn.get_all_volumes(filters={'attachment.instance-id':metadata['instance-id']})
matches = [x for x in vols if x.attach_data.device == mount_point]
if(len(matches) == 1):
return matches[0]
else:
raise Exception('No attached volume could be found for %s' % mount_point)
def create_snapshot(volume, tagName, tagValue):
logging.info('Creating snapshot...')
snap = volume.create_snapshot('Orchestra snapshot for stack %s' % tagValue)
snap.add_tag(tagName, tagValue)
logging.info('Snapshot created!')
def delete_snapshots(volume, days):
d = datetime.date.today() + datetime.timedelta(days=-days)
logging.info('deleting snapshots older than %s...' % d)
for snap in volume.snapshots():
start_time = datetime.datetime.strptime(snap.start_time, '%Y-%m-%dT%H:%M:%S.%fZ')
if start_time.date() < d:
logging.info('deleting snapshot %s with start_time %s' % (snap.id, start_time))
snap.delete()
def current_zone():
metadata = get_instance_metadata()
return metadata['placement']['availability-zone']
def current_region():
zone = current_zone()
return zone[:-1]
if __name__ == '__main__':
logging.getLogger().setLevel(logging.INFO)
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment