The timing is not so great. The AWS Data Lifecycle Manager has been announced but I can’t wait for its release. So I decided to use AWS Lambda to do some snapshot lifecycle management.
First a role for Lambda having full access to snapshots can be created via the console.
To create snapshot with Python 3.6 Lambda in AWS:
from datetime import datetime, timedelta import boto3 def get_tag(tags, tag_name): for t in tags: if t['Key'] == tag_name: return t['Value'] return 'None' def get_delete_date(): today = datetime.today() if today.weekday() == 0: #Monday retention = 28 else: retention = 7 return (today + timedelta(days=retention)).strftime('%Y-%m-%d') def snapshot_tags(instance, volume): tags = [{'Key': k, 'Value': str(v)} for k,v in volume.attachments[0].items()] tags.append({'Key': 'InstanceName', 'Value': get_tag(instance.tags, 'Name')}) tags.append({'Key': 'DeleteOn', 'Value': get_delete_date()}) return tags def lambda_handler(event, context): ec2 = boto3.resource('ec2') for instance in ec2.instances.filter(Filters=[{'Name': "tag:Name", 'Values': [ 'AFLCDWH*' ] }]): for volume in instance.volumes.all(): snapshot = ec2.create_snapshot(VolumeId=volume.id, Description="Snapshot for volume {0} on instance {1}".format(volume.id, get_tag(instance.tags, 'Name'))) snapshot.create_tags(Resources=[snapshot.id], Tags=snapshot_tags(instance, volume)) return 'done'
To recycle snapshots meant to be deleted today:
from datetime import datetime import boto3 def lambda_handler(event, context): today = datetime.today().strftime('%Y-%m-%d') ec2 = boto3.resource('ec2') for snapshot in ec2.snapshots.filter(Filters=[{'Name': "tag:DeleteOn", 'Values': [ today ] }]): print(snapshot.id) snapshot.delete() return 'done'
At last, these functions can’t finish in 3 seconds, so the default 3 seconds time-out will kill them. I lifted the time-out to 1 minute.