2014-10-19 6 views
8

Sto usando AWS, Python e lo Boto library.Polling di un'istanza di arresto o di avvio EC2 con Boto

Vorrei invocare .start() o .stop() su un'istanza Boto EC2, quindi "eseguire il polling" fino al completamento.

import boto.ec2 

credentials = { 
    'aws_access_key_id': 'yadayada', 
    'aws_secret_access_key': 'rigamarole', 
    } 

def toggle_instance_state(): 
    conn = boto.ec2.connect_to_region("us-east-1", **credentials) 
    reservations = conn.get_all_reservations() 
    instance = reservations[0].instances[0] 
    state = instance.state 
    if state == 'stopped': 
     instance.start() 
    elif state == 'running': 
     instance.stop() 
    state = instance.state 
    while state not in ('running', 'stopped'): 
     sleep(5) 
     state = instance.state 
     print " state:", state 

Tuttavia, nel while ciclo finale, lo Stato sembra avere "bloccato" sia a "in attesa" o "arresto". L'enfasi su "sembra", come dalla mia console AWS, posso vedere che l'istanza in effetti lo fa "avviato" o "fermato".

L'unico modo ho potuto risolvere questo problema è stato quello di richiamare .get_all_reservations() nel ciclo while, in questo modo:

while state not in ('running', 'stopped'): 
     sleep(5) 
     # added this line: 
     instance = conn.get_all_reservations()[0].instances[0] 
     state = instance.state 
     print " state:", state 

Esiste un metodo da chiamare in modo che il instance segnalerà lo stato attuale?

risposta

10

Lo stato dell'istanza non viene aggiornato automaticamente. È necessario chiamare il metodo update per comunicare all'oggetto di effettuare un'altra chiamata di andata e ritorno al servizio EC2 e ottenere lo stato più recente dell'oggetto. Qualcosa di simile dovrebbe funzionare:

while instance.state not in ('running', 'stopped'): 
    sleep(5) 
    instance.update() 

Per ottenere lo stesso effetto in boto3, qualcosa di simile dovrebbe funzionare.

import boto3 
ec2 = boto3.resource('ec2') 
instance = ec2.Instance('i-123456789') 
while instance.state['Name'] not in ('running', 'stopped'): 
    sleep(5) 
    instance.load() 
+0

Perfetto: ha funzionato bene. Non per niente, ma volevo affermare: ho letto i documenti e ho appena controllato due volte ... questo metodo NON è nei documenti al momento della stesura di questo articolo! Grazie ancora. –

+0

@garnaat per favore modifica la tua risposta e aggiungi le istruzioni per boto3, in boto3 invece di 'update()' devi usare 'load()' - per i futuri utenti vedere – bluesummers

3

Questo lavoro anche per me. Su docs abbiamo questo:

update(validate=False, dry_run=False)
- Aggiornare le informazioni sullo stato dell'istanza effettuando una chiamata per andare a prendere l'istanza corrente attributi dal servizio.

Parametri: validate (bool)
- Per impostazione predefinita, se EC2 non restituisce alcun dato circa l'istanza del metodo di aggiornamento ritorna tranquillamente. Se il parametro di convalida è True, tuttavia, genererà un'eccezione ValueError se non viene restituito alcun dato da EC2.