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

如何使用Boto3 Python获取与AWS EC2实例关联的所有快照?

解决EC2实例删除后关联卷快照的查询问题

我完全懂你的困扰——当EC2实例被删除、关联卷也跟着被清理后,原来通过Volume对象查询快照的代码就彻底用不了了,毕竟卷都不存在了,没法再通过它去拉取关联的快照列表。不过咱们换个思路就能搞定,直接从EC2快照资源入手就行,因为快照会永久保留它的来源卷ID,哪怕对应的卷已经被删除了。

改进后的代码示例

不用再依赖已删除的卷对象,直接过滤所有快照来匹配目标卷ID:

import boto3

def get_snapshot_for_deleted_volume(volume_id):
    ec2 = boto3.resource('ec2')
    # 通过快照的来源卷ID进行过滤,即使卷已删除也能匹配
    snapshots = ec2.snapshots.filter(
        Filters=[
            {
                'Name': 'volume-id',
                'Values': [volume_id]
            }
        ]
    )
    # 提取所有匹配的快照ID
    snapshot_ids = [snap.id for snap in snapshots if snap]
    # 返回第一个快照ID(如果存在),否则返回None
    return snapshot_ids[0] if snapshot_ids else None

额外技巧:通过实例标签查询(如果有设置)

如果你给快照打了和原EC2实例相关的标签(比如InstanceId: i-12345678),还可以直接通过标签筛选快照,不用记卷ID:

import boto3

def get_snapshots_by_instance_id(instance_id):
    ec2 = boto3.resource('ec2')
    snapshots = ec2.snapshots.filter(
        Filters=[
            {
                'Name': 'tag:InstanceId',
                'Values': [instance_id]
            }
        ]
    )
    return [snap.id for snap in snapshots]

原理说明

原来的代码是通过ec2.Volume(id=volume_id)先获取卷对象,再调用它的snapshots属性,但卷被删除后这个对象无法初始化,自然就没法用了。而直接查询快照资源并过滤volume-id的方式,是从EC2的快照存储中直接检索,快照本身会一直保留它是从哪个卷创建的元数据,所以哪怕卷没了,这个关联关系还在。

内容的提问来源于stack exchange,提问作者NoorJafri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:39