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.
