2016-07-05 11 views
0

Ich benutze Boto3 um einen Snapshot einer ID zu erstellen und ich muss nur überprüfen, ob der Snapshot fertig ist, aber die folgende Schleife macht das nicht und läuft nur zu Unendlichkeit.Wie überprüfe ich, ob der Snapshot jetzt 'abgeschlossen' ist?

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" 

Antwort

2

sollten Sie snapshot.load() vor der Schleife aufrufen und nach dem sleep Aussage.

Sie haben es gerade auf einer AWS-Mikroinstanz getestet und es funktioniert, wenn es zu Ihrem Code hinzugefügt wird.

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

dies scheint zu funktionieren! – Kittystone

1

Maximillian bringt load, aber ich empfehle Ihnen die waiter verwenden. Dies wird alle Wartelogik für Sie behandeln und zurückkehren, wenn Ihr Snapshot abgeschlossen ist. Für diese Ressource würden Sie verwenden: snapshot.wait_until_completed().

Im Allgemeinen ist die Verwendung eines Kellners (wenn verfügbar) der benutzerdefinierten Warteschlangenlogik vorzuziehen, da sie alle Randfälle und andere Implementierungsdetails behandelt. Wenn beispielsweise beim Erstellen des Snapshots ein Fehler auftritt, wird der Status error eingegeben. Der Code in der angenommenen Antwort wird weiterhin Abfragen durchführen, bis die Ressource vollständig verschwunden ist. An diesem Punkt wird ein Fehler ausgelöst. Dies könnte sehr lange dauern. Der Kellner wird in diesem Fall maximal 40 Mal mit einer Wiederholungsverzögerung von 15 Sekunden abfragen. (Sie können die Definition here sehen.) Anstatt also mehrere Stunden oder Tage zu warten, warten Sie maximal 10 Minuten. Verschiedene Kellner haben unterschiedliche Wiederholungsverzögerungen und maximale Anzahl von Wiederholungen. Viele Kellner haben zusätzliche Informationen über nicht wiederherstellbare Zustände und werden in diesen Fällen schnell ausfallen.

+0

Danke für die zusätzliche Lösung! Was sind die möglichen Kantenfälle? –

+0

Bei einigen APIs kann die Ressource in verschiedene Zustände wechseln, die einen Fehler anzeigen können oder auch nicht. Die Ressource kann für einige Zeit in diesem Zustand bleiben. Die Kellner wissen, welche Zustände nicht wiederherstellbar sind und werden in diesen Fällen schnell ausfallen. Zum Beispiel, wenn es einen Fehler bei der Snapshot-Erstellung gibt, wird es den Fehlerzustand eingeben. Der Code in der angenommenen Antwort wird weiterhin Abfragen durchführen, bis die Ressource vollständig verschwunden ist. An diesem Punkt wird ein Fehler ausgelöst. Dies könnte lange dauern. Aktualisieren meiner Antwort, um dies zu berücksichtigen. –

+0

@ JordonPhillips Danke Jordon für diese Lösung – Kittystone

0

Verwendung Kellner mit Ihrer eigenen Timeout-Steuerung

Timeout-Standard sind 600 Sekunden (delay = 15 Sekunden x max_attempts = 40), wie in den Boto3 EC2.Waiter.SnapshotCompleted angegeben.

Pollt EC2.Client.describe_snapshots() alle 15 Sekunden, bis ein erfolgreicher Status erreicht ist. Nach 40 fehlgeschlagenen Prüfungen wird ein Fehler zurückgegeben.

Um die aktuellen Einstellungen des Kellners zu überprüfen:

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} 

Verwenden Kellner mit Ihrer eigenen Zeit heraus:

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 
     ], 
    ) 
Verwandte Themen