如何使用boto删除AMI?

时间:2011-03-15 15:08:25

标签: python amazon-ec2 boto

(交叉发布到boto-users

给定图像ID,如何使用boto删除它?

4 个答案:

答案 0 :(得分:7)

使用较新的boto(使用2.38.0测试),您可以运行:

ec2_conn = boto.ec2.connect_to_region('xx-xxxx-x')
ec2_conn.deregister_image('ami-xxxxxxx')

ec2_conn.deregister_image('ami-xxxxxxx', delete_snapshot=True)

第一个将删除AMI,第二个也将删除附加的EBS快照

答案 1 :(得分:6)

您使用deregister()API。

有几种获取图像ID的方法(即您可以列出所有图像并搜索其属性等)

这是一个代码片段,它会删除你现有的一个AMI(假设它在欧盟地区)

connection = boto.ec2.connect_to_region('eu-west-1', \
                                    aws_access_key_id='yourkey', \
                                    aws_secret_access_key='yoursecret', \
                                    proxy=yourProxy, \
                                    proxy_port=yourProxyPort)


# This is a way of fetching the image object for an AMI, when you know the AMI id
# Since we specify a single image (using the AMI id) we get a list containing a single image
# You could add error checking and so forth ... but you get the idea
images = connection.get_all_images(image_ids=['ami-cf86xxxx'])
images[0].deregister()

(编辑):事实上,看过2.0的在线文档,还有另外一种方法。

确定了图像ID后,你可以使用boto.ec2.connection的deregister_image(image_id)方法...这与我猜的相同。

答案 2 :(得分:3)

对于Boto2,请参阅katriels answer。在这里,我假设你正在使用Boto3。

如果您拥有AMI(类boto3.resources.factory.ec2.Image的对象),则可以调用其deregister函数。例如,要删除具有给定ID的AMI,您可以使用:

import boto3

ec2 = boto3.resource('ec2')

ami_id = 'ami-1b932174'
ami = list(ec2.images.filter(ImageIds=[ami_id]).all())[0]

ami.deregister(DryRun=True)

如果您具有必要的权限,则应该看到Request would have succeeded, but DryRun flag is set例外。要摆脱这个例子,请忽略DryRun并使用:

ami.deregister() # WARNING: This will really delete the AMI

This blog post详细说明了如何使用Boto3删除AMI和快照。

答案 3 :(得分:0)

脚本使用它来确定AMI和关联的快照。确保您具有运行此脚本的正确特权。

输入-请传递区域和AMI id(n)作为输入

import boto3
import sys

def main(region,images):
    region = sys.argv[1]
    images = sys.argv[2].split(',') 
    ec2 = boto3.client('ec2', region_name=region)
    snapshots = ec2.describe_snapshots(MaxResults=1000,OwnerIds=['self'])['Snapshots']
        # loop through list of image IDs
    for image in images:
        print("====================\nderegistering {image}\n====================".format(image=image))
        amiResponse = ec2.deregister_image(DryRun=True,ImageId=image)
        for snapshot in snapshots:
            if snapshot['Description'].find(image) > 0:
                snap = ec2.delete_snapshot(SnapshotId=snapshot['SnapshotId'],DryRun=True)
                print("Deleting snapshot {snapshot} \n".format(snapshot=snapshot['SnapshotId']))
    
main(region,images)