2014-10-19 16 views
8

ile sorgulama AWS, Python ve Boto library kullanıyorum.Bir durdurma veya EC2 örneğini Boto

Bir Boto EC2 örneğinde .start() veya .stop() numaralı telefonu çağırmak ve sonra da tamamlayana kadar "sorgulamak" istiyorum.

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 

Ancak nihai while döngü içinde, devlet ya "beklemede" veya "durdurma" at "sıkışmış" olsun gibi görünüyor. AWS konsoluyla ilgili olarak, "görünüyor" konusuna vurgu yaparak, örneğini aslında "başlatılmış" veya "durduruldu" durumuna getirdiğini görebiliyorum. Bunu düzeltmek

tek yolu böyle while döngü içinde .get_all_reservations(), hatırlamak oldu:

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 

yüzden instance GERÇEK devlet rapor verecek aranacak bir yöntem var mı?

cevap

10

Örnek durum otomatik olarak güncellenmiyor. Nesneye EC2 servisine başka bir gidiş geliş araması yapmasını ve nesnenin son durumunu almasını söylemek için update yöntemini çağırmanız gerekir. Bunun gibi bir şey çalışmalıdır:

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

boto3'te aynı etkiyi elde etmek için, bunun gibi bir şey çalışmalıdır.

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

Kusursuz - bu doğru çalıştı. Hiçbir şey için değil, ama şunu belirtmek istedim: Dokümanları okudum ve sadece iki kez kontrol ettim ... bu yöntem, bu yazının dokümanlarında DEĞİLDİR! Tekrar teşekkürler. –

+0

@garnaat Lütfen cevabınızı düzenleyin ve boto3 için talimatlar ekleyin, boto3 yerine 'update()' 'load()' i kullanmanız gerekir - gelecekteki kullanıcılar için – bluesummers

3

Bu benim için de çalışıyor. - Geçerli örneği hizmetinden niteliklerini getirmesi çağrısı yaparak örneğinin durum bilgilerini güncelleme

update(validate=False, dry_run=False)
: docs biz bu var.

Parametreler: validate (bool)
- Varsayılan olarak, EC2, örnek hakkında hiçbir veri döndürmezse, güncelleştirme yöntemi sessiz olarak geri döner. Doğrulama parametresi True ise, EC2'den hiçbir veri döndürülmezse ValueError istisnasını yükseltecektir.

İlgili konular