2016-07-05 2 views
0

Я использую boto3 для создания моментального снимка идентификатора, и мне просто нужно проверить, завершено ли создание моментального снимка, но следующий цикл не делает этого и просто запускается бесконечность.Как проверить, что моментальный снимок теперь «завершен»

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" 

ответ

2

Вы должны вызвать snapshot.load() перед циклом и после sleep заявления.

Просто протестируйте его на экземпляре AWS micro, и он будет работать при добавлении к вашему коду.

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" 
+0

это, кажется, работает! – Kittystone

1

Максимилиан воспитывает load, но я рекомендую вам использовать waiter. Это обработает всю логику ожидания для вас и вернется, когда ваш снимок будет завершен. Для этого ресурса вы должны использовать: snapshot.wait_until_completed().

В общем, использование официанта (если доступно) является предпочтительным по сравнению с пользовательской логикой ожидания, поскольку они обрабатывают все граничные случаи и другие детали реализации. Например, если в процессе создания моментального снимка произошла ошибка, он войдет в состояние error. Код в принятом ответе будет продолжать опрос до тех пор, пока ресурс полностью не исчезнет, ​​и в этот момент он вызовет ошибку. Это может занять очень много времени. Официант будет опросить максимум 40 раз в этом случае, с задержкой повторения 15 секунд. (Вы можете увидеть определение here.) Поэтому вместо ожидания нескольких часов или дней вы будете ждать максимум 10 минут. У разных официантов разные задержки повторов и максимальное количество попыток. Многие официанты имеют дополнительную информацию об неустранимых состояниях и в таких случаях быстро справятся.

+0

Спасибо за дополнительное решение! Каковы возможные краевые случаи? –

+0

Для некоторых API-интерфейсов ресурс может переходить в несколько разных состояний, которые могут или не могут отражать сбой. Ресурс может оставаться в этом состоянии в течение некоторого времени. Официанты знают, какие состояния не могут быть восстановлены, и в таких случаях быстро справятся. Например, если в процессе создания моментального снимка произошла ошибка, он войдет в состояние 'error'. Код в принятом ответе будет продолжать опрос до тех пор, пока ресурс полностью не исчезнет, ​​и в этот момент он вызовет ошибку. Это может занять много времени. Обновление моего ответа, чтобы включить это. –

+0

@JordonPhillips Спасибо Jordon за это решение – Kittystone

0

Использование официанта с собственным контролем таймаута

По умолчанию время ожидания составляет 600 секунд (задержка = 15 секунд х MAX_ATTEMPTS = 40), как указано в Boto3 EC2.Waiter.SnapshotCompleted.

Опросы EC2.Client.describe_snapshots() каждые 15 секунд до достижения успешного состояния. Ошибка после 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 
     ], 
    ) 
Смежные вопросы