You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改代码实现自动注销指定日期前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:55:17