如何检查带有ID的快照是否在Boto中使用AWS AMI?

时间:2015-04-07 19:02:00

标签: python-2.7 amazon-web-services boto

删除快照时出现以下错误。我想删除当前未被我的AWS AMI和其他实例使用的快照..我试过但是遇到了这个错误..

Traceback (most recent call last):
<path to error file>
EC2ResponseError: EC2ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?><Response><Errors><Error><Code>InvalidSnapshot.InUse</Code><Message>The snapshot snap-xxxxxxxx is currently in use by ami-xxxxxxxx</Message></Error></Errors><RequestID>bbe55333-4acf-4ca7-9aa3-49307b189ca3</RequestID></Response>

3 个答案:

答案 0 :(得分:2)

不幸的是,没有一个API可以直接从EBS快照获取AMI ID。

相反,你可以走另一条路。

  1. 使用ec2:DescribeImages获取AMI图像列表。
  2. 对于返回的每个AMI图像,请检查与AMI图像关联的EBS快照列表。
  3. 查看是否包含有问题的EBS快照。
  4. 编辑:另一种可能性:

    您可以将ec2:DescribeImages与EBS快照ID上的过滤器一起使用。

    https://ec2.amazonaws.com/?Action=DescribeImages
     &Filter.1.Name=block-device-mapping.snapshot-id
     &Filter.1.Value=snap-xxxx
    

    参考:http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html

答案 1 :(得分:2)

删除所有未使用的快照:

for s in $(comm -23 <(echo $(ec2-describe-snapshots --region ap-southeast-1 | grep SNAPSHOT | awk '{print $2}' | sort | uniq) | tr ' ' '\n') <(echo $(ec2-describe-images --region ap-southeast-1 | grep BLOCKDEVICEMAPPING | awk '{print $3}' | sort | uniq) | tr ' ' '\n') | tr '\n' ' ')
do
    echo Deleting snapshot $s
    ec2-delete-snapshot --region ap-southeast-1 $s  
done

答案 2 :(得分:0)

1)检索所有快照,使用正则表达式在快照描述中搜索AMI-ID。

    reAmi = re.compile('ami-[^ ]+')
    snapshotImageId = reAmi.findall(snapshot.description)

2)检索所有AMI。检查在第一步中检索到的AMI-ID是否仍然存在,如果不存在,则不再需要与该特定AMI关联的快照。

完整代码已发布here

希望它有所帮助!!