我正在使用boto3来创建id的快照,我只需要检查快照是否已完成创建,但是以下循环不会这样做并且只是运行到无穷大。
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')
print snapshot.id
get_all_snapshots = ec2.snapshots.filter(snap_id=['SnapshotIds'])
print get_all_snapshots
while snapshot.state != 'completed':
## put a condition here to get all snapshot or update the state !
print snapshot.progress
print "Snapshot under creation"
time.sleep(10)
else:
print "snapshot READY"
答案 0 :(得分:2)
您应该在循环之前和sleep
语句之后调用snapshot.load()
。
刚刚在AWS微型实例上对其进行了测试,并且在添加到您的代码中时可以正常运行。
snapshot = ec2.create_snapshot(VolumeId='vol-#####', Description='snapshotID')
print snapshot.id
snapshot.load()
while snapshot.state != 'completed':
print snapshot.progress
print "Snapshot under creation"
time.sleep(10)
snapshot.load()
else:
print "snapshot READY"
答案 1 :(得分:1)
Maximillian提出load
,但我建议您使用waiter。这将为您处理所有等待逻辑,并在快照完成时返回。对于该资源,您可以使用:snapshot.wait_until_completed()
。
通常,使用服务员(如果可用)优于自定义等待逻辑,因为它们处理所有边缘情况和其他实现细节。例如,如果快照创建过程中存在错误,它将进入error
状态。接受的答案中的代码将继续轮询,直到资源完全消失,此时它将引发错误。这可能需要很长时间。在这种情况下,服务员最多会轮询40次,重试延迟为15秒。 (您可以看到定义here。)因此,您只需等待最多10分钟,而不是等待几个小时或几天。不同的服务员具有不同的重试延迟和最大重试次数。许多服务员有关于不可恢复状态的额外信息,并且在这些情况下会很快失败。
答案 2 :(得分:0)
默认超时为600秒(延迟= 15秒x max_attempts = 40),如Boto3 EC2.Waiter.SnapshotCompleted中所述。
每15秒轮询一次EC2.Client.describe_snapshots(),直到达到成功状态。 40次检查失败后返回错误。
验证服务员的当前设置:
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>> client = boto3.client('ec2')
>>> waiter=client.get_waiter('snapshot_completed')
>>> print waiter.config.__dict__
{'delay': 15, '_config': OrderedDict([(u'delay', 15), (u'operation', u'DescribeSnapshots'), (u'maxAttempts', 40), (u'acceptors', [OrderedDict([(u'expected', u'completed'), (u'matcher', u'pathAll'), (u'state', u'success'), (u'argument', u'Snapshots[].State')])])]), 'description': '', 'operation': u'DescribeSnapshots', 'max_attempts': 40}
使用服务员和你自己的时间:
delay= 15
max_attempts = 80
def wait_snapshot(ec2, snapshot):
waiter = ec2.meta.client.get_waiter('snapshot_completed')
# Set the timeout
# Waiter timeout is 10 min (Boto default is delay=15 * max_attempts=40).
waiter.config.delay = delay
waiter.config.max_attempts = max_attempts
waiter.wait(
SnapshotIds=[
snapshot.id
],
)