import datetime
import boto3
import logging
import re
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
backup_instances = ['i-e7700c54', 'i-096887d5319d0415b']
def handler(event, context):
for instance in backup_instances:
cleanup(instance)
def cleanup(instance_id):
ec = boto3.client('ec2')
response = ec.describe_instance_attribute(
Attribute='blockDeviceMapping',
InstanceId=instance_id
)
logger.debug('Describe Instance: %s', response)
volume_filters = [
{'Name': 'attachment.instance-id', 'Values': [instance_id]}
]
volumes = ec.describe_volumes(Filters=volume_filters)['Volumes']
volume_id = ''
volume_size = ''
logger.debug('Volumes: %s', volumes)
for volume in volumes:
if not volume_id or not volume_size or volume['Size'] > volume_size:
volume_id = volume['VolumeId']
volume_size = volume['Size']
# filter snapshots by volume id
filters = [
{'Name': 'volume-id', 'Values': [volume_id]}
]
# retrieve snapshots belonging to owner by id
account_ids = ['585826603973']
snapshots = ec.describe_snapshots(OwnerIds=account_ids, Filters=filters)['Snapshots']
today = datetime.datetime.today().strftime('%Y-%m-%d')
today_date = datetime.datetime.strptime(today, '%Y-%m-%d')
date_regex = '\d{4}[-]\d{2}[-]\d{2}'
count = 0
# for each snapshot, compare to today's date. If older than 5 days, delete it
for snap in snapshots:
snap_time = re.search(date_regex, str(snap['StartTime'])).group(0)
logger.info('Snapshot: %s\nDatestamp: %s', snap['SnapshotId'], snap_time)
snap_date = datetime.datetime.strptime(snap_time, '%Y-%m-%d')
delta = today_date - snap_date
logger.info('Delta: %s', delta)
if delta > datetime.timedelta(days=4):
logger.info('Older than 5 days, deleting snapshot: %s', snap['SnapshotId'])
ec.delete_snapshot(SnapshotId=snap['SnapshotId'])
count += 1
logger.info('%s snapshot(s) deleted', count)