Python boto ec2 - 我如何等待图像创建或失败

时间:2014-10-03 07:40:40

标签: python amazon-ec2 boto

我正在编写一个代码来迭代所有可用的实例并为它们创建一个AMI,如下所示:

for reservation in reservations:
    ......
    ami_id = ec2_conn.create_image(instance.id, ami_name, description=ami_desc, no_reboot=True)

但是,在继续创建下一张图像之前,我该如何等待图像创建?因为我需要跟踪每个创建的ami的状态。

我知道我可以使用以下方式检索状态:

image_status = get_image(ami_id).state

那么,我是否会遍历创建的ami_ids列表,然后为每个列表获取状态?如果是这样,那么当我读取图像的状态时,如果图像仍处于未决状态怎么办?如何确定图像创建最终是否失败?

感谢。

5 个答案:

答案 0 :(得分:6)

如果我理解正确,您希望启动create_image调用,然后等待服务器端操作完成后再继续。为此,您必须定期轮询EC2服务,直到图像的状态为available(意味着它成功)或failed(意味着它失败)。代码看起来像这样:

import time
...
image_id = ec2_conn.create_image(instance.id, ...)
image = ec2_conn.get_all_images(image_ids=[image_id])[0]
while image.state == 'pending':
    time.sleep(5)
    image.update()
if image.state == 'available':
    # success, do something here
else:
    # handle failure here

答案 1 :(得分:1)

对于正在使用boto3的人,以下方法可行:

import boto3
import time
region = 'us-west-1'
client = boto3.client('ec2', region_name=region)
def is_image_available(image_id):
    try:
        available = 0
        while available == 0:
            print "Not created yet.. Gonna sleep for 10 seconds"
            time.sleep(10)
            image = client.describe_images(ImageIds=[image_id])
            if image['Images'][0]['State'] == 'available':
                available = 1
        if available == 1:
            print "Image is now available for use."
            return True
    except Exception, e:
        print e

使用此功能,您应该能够传递image_id,并且如果可用,则将状态设置为true。您可以在if条件中使用它,如下所示:

if is_image_available(image_id):
# Do something if image is available

希望它有所帮助。

答案 2 :(得分:0)

Boto现在拥有wait_until_running方法,可以节省滚动您自己的轮询代码:

http://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Instance.wait_until_running

答案 3 :(得分:0)

我将回答完全相同的问题。

在状态未运行时继续更新图像状态变量。 如果状态正在运行,请随时中断循环。 您还可以检查终止状态或失败状态。

image = ec2.Image(image_id)
if(image.state == 'pending'):
        print("Waiting for image to be available.")
        while(image.state != 'available'):
            image = ec2.Image(image_id)
        print("Image Available to use")

提示在创建图像时不要等待图像可用。 从这些图像创建实例时,检查图像是否可用。这将为您节省大量时间,因为许多待处理的图像将能够同时进入可用状态。

如果您等待每个图像可用,则只是将所有创建时间添加到程序中。

希望有帮助。

答案 4 :(得分:0)

我认为最好的方法是使用服务员,上面的答案都不能做到这一点:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Waiter.ImageAvailable