2013-09-27 15 views
6

Vorrei creare una nuova istanza in base all'AMI memorizzata.EC2: in attesa fino a quando una nuova istanza è in stato di esecuzione

ho raggiungere questo obiettivo il seguente codice:

RunInstancesRequest rir = new RunInstancesRequest(imageId,1, 1); 
// Code for configuring the settings of the new instance 
... 
RunInstancesResult runResult = ec2.runInstances(rir); 

Tuttavia, non riesco a trovare un'attesa a "blocco"/attendere che l'istanza è attivo e funzionante a parte Thread.currentThread() del sonno (xxxx. comando).

D'altra parte, StartInstancesResult e TerminateInstancesResult consentono di accedere allo stato delle istanze ed essere in grado di monitorare eventuali modifiche. Ma, per quanto riguarda lo stato di un'istanza completamente nuova?

risposta

3

Attendere che l'istanza EC2 si prepari è un modello comune. Nella biblioteca boto Python anche risolvere questo con sleep chiamate:

reservation = conn.run_instances([Instance configuration here]) 
    instance = reservation.instances[0] 

    while instance.state != 'running': 
     print '...instance is %s' % instance.state 
     time.sleep(10) 
     instance.update() 

Con questo meccanismo si sarà in grado di interrogare quando la vostra nuova istanza verrà su.

+0

Non avevo capito che c'era un metodo di aggiornamento. È molto bello saperlo. Grazie. ** Tuttavia **, la soluzione migliore corrente è @Zags 'instance.wait_until_running()' –

+0

@BrunoBronosky dipende dal tuo obiettivo. Devo aspettare che l'istanza sia in esecuzione e che siano passati i controlli di stato. In base a ciò, non è possibile utilizzare la soluzione Zags, poiché questa soluzione verrà quasi immediatamente risolta. – tyron

1

A seconda di cosa si sta tentando di fare (e quanti server si prevede di avviare), invece di eseguire il polling per gli eventi di avvio dell'istanza, è possibile installare sull'AMI un semplice programma/script che viene eseguito una volta all'avvio dell'istanza e invia una notifica in tal senso, cioè ad un argomento SNS di AWS.

Il processo che deve essere avviato sui nuovi server può quindi essere sottoscritto a questo argomento SNS e ricevere notifiche push ogni volta che viene avviato un server.

Risolve lo stesso problema da un'angolazione diversa; il tuo chilometraggio può variare.

8

Dal AWS CLI changelog for v1.6.0:

Aggiungi un sottocomando di attesa che permette un comando per bloccare fino a quando un risorsa AWS raggiunge un determinato stato (issue 992, issue 985)

non vedo questo menzionato nella documentazione, ma il seguente ha funzionato per me:

aws ec2 start-instances --instance-ids "i-XXXXXXXX" 
aws ec2 wait instance-running --instance-ids "i-XXXXXXXX" 

La riga wait instance-running non è stata completata fino a quando non è stata eseguita l'istanza EC2.

Non uso Python/boto/botocore ma presumo che abbia qualcosa di simile. Controlla waiter.py on Github.

11

boto3 ha:

instance.wait_until_running() 
Problemi correlati