如何使用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
相关产品推荐
相关产品推荐

