我有一个代码创建一个快照,然后检查它是否完成,我写了下面的代码,但由于某种原因它没有更新state
变量而while循环继续打印相同的东西即使快照已经completed
以下是代码:
def call_creater():
regions = ['eu-central-1']
for region in regions:
ec2 = boto3.resource('ec2', region, aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, )
snapshot = ec2.create_snapshot(VolumeId='vol-f9e7d220', Description='fra01-he-trial-ansible01')
while snapshot.state != 'completed':
print snapshot.state
print "Snapshot under creation"
time.sleep(10)
else:
print "snapshot READY"
输出:
pending
Snapshot under creation
pending
Snapshot under creation
pending
Snapshot under creation
pending
Snapshot under creation
即使快照完成,这也会继续打印"Snapshot under creation"
。原因是,我无法更新我的状态variable
我相信,请帮我解释一下?
答案 0 :(得分:1)
snapshot = ec2.create_snapshot(VolumeId='vol-f9e7d220', Description='fra01-he-trial-ansible01')
此行仅执行一次,在该实例中,state
为" pending
"。你必须在循环中再次检查snapshot
变量的状态。
您没有在代码或snapshot
循环中的任何位置更新while
变量。
你必须在while循环中做这样的事情。
snapshot = conn.get_all_snapshots(snapshot_ids=[<YOUR SNAPSHOT ID>])[0]
检查boto库以及如何获取带有id的快照状态。
答案 1 :(得分:1)
正如Pratik所说,你的陈述只执行一次而且从不更新。您可以使用.load()
更新资源。但更好的是,我建议您使用waiter。这将为您处理所有等待逻辑,并在快照完成时返回。对于该资源,您可以使用:snapshot.wait_until_completed()
。