我正在编写一个代码来迭代所有可用的实例并为它们创建一个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列表,然后为每个列表获取状态?如果是这样,那么当我读取图像的状态时,如果图像仍处于未决状态怎么办?如何确定图像创建最终是否失败?
感谢。
答案 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)
我认为最好的方法是使用服务员,上面的答案都不能做到这一点: