Skip to content

Instantly share code, notes, and snippets.

@viperscape
Last active June 8, 2016 16:54
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save viperscape/7042a8d7918a16970ab9 to your computer and use it in GitHub Desktop.
ec2 snapshot script, max snaps sets revolving snapshots to expire when rerun; expects volume to have tag: snapshot, some-unique-name
import boto.ec2
import sys
def get_snaps (desc, vol,conn):
snapshots = conn.get_all_snapshots(owner='id...',
filters={'description':'*'+desc+'*'})
return snapshots
def op_snaps (vols,max_snaps,conn):
for v in iter(vols):
print ("\n",v, ":", vols[v])
snapshots = get_snaps(v,vols[v],conn)
## they come sorted, but sort anyway
snapshots = sorted(snapshots,key=lambda snap:snap.start_time)
done_snaps = list(filter(lambda snap:snap.status == 'completed',snapshots))
## create new snaps, only if there are none in progress!
if len(snapshots) <= len(done_snaps):
snap = conn.create_snapshot(vols[v], v)
print ("creating:",v,snap)
## delete snaps, if completed snaps is more than max
if len(done_snaps) >= max_snaps:
print("removing snaps:",len(snapshots) - (max_snaps-1))
for n in range(len(snapshots) - (max_snaps-1)):
print ("deleting:",v,snapshots[n].id)
conn.delete_snapshot(snapshots[n].id)
def start_snaps (tag):
snap_tag = str(tag)
max_snaps = 2
conn = boto.ec2.connect_to_region("us-east-1",
aws_access_key_id='id...',
aws_secret_access_key='key...')
all_vols = conn.get_all_volumes(filters={"tag:snapshot":snap_tag+"*"})
if len(all_vols) < 1:
print ("no volumes found with snapshot tag",snap_tag)
return
vols = dict()
for n in all_vols:
vols[n.tags['snapshot']] = n.id
op_snaps(vols,max_snaps,conn)
def main (argv):
if len(sys.argv) < 2:
print("snapshot tag required!")
return
start_snaps(sys.argv[1])
if __name__ == "__main__":
main(sys.argv)
python ss.py dev
dev iis : vol-d...
removing snaps: 1
deleting: dev iis Snapshot:snap-2...
creating: dev iis Snapshot:snap-5...
dev root : vol-6...
removing snaps: 1
deleting: dev root Snapshot:snap-3...
creating: dev root Snapshot:snap-d...
dev sql : vol-1...
removing snaps: 1
deleting: dev sql Snapshot:snap-9...
creating: dev sql Snapshot:snap-4...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment