如何检查快照现在是否已完成'

时间:2016-07-05 08:51:51

标签: python boto3

我正在使用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"

3 个答案:

答案 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)

使用Waiter和您自己的超时控件

默认超时为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
        ],
    )