如何修改代码实现自动注销指定日期前的AMI并删除关联快照?
代码修改建议
以下是让你的AMI自动注销及快照删除脚本正常工作的关键修改点:
1. 修正AMI过滤器名称
EC2 API的过滤器名称应为name,而非AMI name,否则无法正确匹配AMI名称:
amis = ec2.describe_images(Filters=[ { 'Name': 'name', # 此处修正 'Values': ['Lambda -*'] } ])
2. 简化日期比较逻辑
原代码的天数计算容易出错,直接将AMI创建日期转换为date对象后与delete_date对比更可靠:
# 替换原有的days_old函数和日期判断逻辑 create_date_obj = parse(create_date).date() if create_date_obj < delete_date:
3. 补充快照删除代码
原代码仅获取了snapshot_id但未执行删除操作,需添加delete_snapshot调用,同时增加EBS设备存在性判断:
for device in ami['BlockDeviceMappings']: if 'Ebs' in device: snapshot_id = device['Ebs']['SnapshotId'] print(f"Deleting snapshot -> {snapshot_id}") ec2.delete_snapshot(SnapshotId=snapshot_id)
4. 移除冗余资源
开头初始化的client = boto3.client('ec2')未被使用,直接删除即可。
5. 添加基础异常处理
避免因权限不足、资源已被删除等情况导致脚本中断:
# 注销AMI的异常处理 try: ec2.deregister_image(ImageId=ami_id) print(f"Deregistered AMI -> {ami_id}") except Exception as e: print(f"Failed to deregister AMI {ami_id}: {str(e)}") # 快照删除的异常处理 try: ec2.delete_snapshot(SnapshotId=snapshot_id) print(f"Deleted snapshot -> {snapshot_id}") except Exception as e: print(f"Failed to delete snapshot {snapshot_id}: {str(e)}")
修改后的完整代码
import boto3 from dateutil.parser import parse import datetime delete_date = datetime.date(2022, 1, 1) # 直接使用date对象更简洁 def handler(event, context): ec2 = boto3.client('ec2') amis = ec2.describe_images(Filters=[ { 'Name': 'name', 'Values': ['Lambda -*'] } ]) for ami in amis['Images']: create_date = ami['CreationDate'] ami_id = ami['ImageId'] create_date_obj = parse(create_date).date() if create_date_obj < delete_date: print(f"Processing AMI -> {ami_id} (created on {create_date})") # 注销AMI try: ec2.deregister_image(ImageId=ami_id) print(f"Deregistered AMI successfully: {ami_id}") except Exception as e: print(f"Error deregistering AMI {ami_id}: {str(e)}") # 删除关联快照 for device in ami['BlockDeviceMappings']: if 'Ebs' not in device: continue snapshot_id = device['Ebs']['SnapshotId'] try: ec2.delete_snapshot(SnapshotId=snapshot_id) print(f"Deleted snapshot successfully: {snapshot_id}") except Exception as e: print(f"Error deleting snapshot {snapshot_id}: {str(e)}") return { 'statusCode': 200, 'body': 'AMI cleanup process completed' }
内容的提问来源于stack exchange,提问作者Sourav Dangi
相关产品推荐
相关产品推荐

