#!/usr/bin/pytho3 from pprint import pprint import boto3 from datetime import datetime, timezone, timedelta class Ami: def __init__(self, name: str, age: int, delete: bool): self.name = name self.age = age self.delete = delete def __repr__(self): return f"Ami(name='{self.name}', age={self.age}, delete={self.delete})" def mark_for_deletion(self): self.delete = True ec2 = boto3.client("ec2") images = ec2.describe_images( Owners=["self"], Filters=[ {"Name": "name", "Values": ["var*", "online-ordering-website*"]}, ], ) ami_in_use = [] launch_templates = ec2.describe_launch_templates() for t in launch_templates.get("LaunchTemplates"): latest = ec2.describe_launch_template_versions( LaunchTemplateId=t.get("LaunchTemplateId"), Versions=["$Latest"], ) for lt in latest.get("LaunchTemplateVersions"): ami_in_use.append(lt.get("LaunchTemplateData").get("ImageId")) all_images = images.get("Images", []) inactive_images = [i for i in all_images if i.get("ImageId") not in ami_in_use] my_amis = {} for i in all_images: ami_id = i.get("ImageId") ami_date = datetime.strptime( i.get("CreationDate"), "%Y-%m-%dT%H:%M:%S.%fZ" ).replace(tzinfo=timezone.utc) ami_age = datetime.now(timezone.utc) - ami_date in_use = i.get("ImageId") not in ami_in_use my_amis[i.get("ImageId")] = Ami(i.get("Name"), ami_age.days, in_use) bno_images = { k: v for k, v in my_amis.items() if v.name.startswith("var-backend-non-ordering") } bo_images = { k: v for k, v in my_amis.items() if v.name.startswith("var-backend-ordering") } oo_images = {k: v for k, v in my_amis.items() if v.name.startswith("online-ordering")} # sort and do not delete the newest 2 bno_sorted = sorted(bno_images.items(), key=lambda item: item[1].age) for key, ami_obj in bno_sorted[:2]: ami_obj.delete = False bo_sorted = sorted(bo_images.items(), key=lambda item: item[1].age) for key, ami_obj in bo_sorted[:2]: ami_obj.delete = False oo_sorted = sorted(oo_images.items(), key=lambda item: item[1].age) for key, ami_obj in oo_sorted[:2]: ami_obj.delete = False pprint(bno_sorted) pprint(bo_sorted) pprint(oo_sorted)