2014-10-19 2 views
8

Я использую AWS, Python и Boto library.Опрос остановки или запуска экземпляра EC2 с Boto

Я бы хотел вызвать .start() или .stop() на экземпляр Boto EC2, а затем «опросить» его до его завершения.

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 

Однако, в конечном while цикла, состояние, кажется, «застревают» на обоих «до» или «остановки». Акцент на «кажется», как и на моей консоли AWS, я вижу, что экземпляр действительно делает его «запущенным» или «остановленным».

Единственный способ, которым я мог бы исправить это вспомнить .get_all_reservations() в цикле while, как это:

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 

Есть ли способ, чтобы назвать так instance сообщит фактическое состояние?

ответ

10

Состояние экземпляра не обновляется автоматически. Вы должны позвонить методу update, чтобы сообщить об этом объекту, чтобы сделать другой звонок в оба конца службе EC2 и получить последнее состояние объекта. Что-то вроде этого должно работать:

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

Для достижения такого же эффекта в boto3 что-то подобное должно работать.

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

Совершенный - это сработало только право. Не зря, но я хотел заявить: я прочитал документы, и я просто дважды проверил ... этот метод НЕ находится в документах на момент написания этой статьи! Еще раз спасибо. –

+0

@garnaat, пожалуйста, отредактируйте свой ответ и добавьте инструкции для boto3, в boto3 вместо 'update()' вам нужно использовать 'load()' - для будущих пользователей, чтобы увидеть – bluesummers

3

Эта работа для меня тоже. На документах у нас есть это:

update(validate=False, dry_run=False)
- Обновление информации о состоянии экземпляра, сделав вызов для извлечения текущего экземпляра атрибутов из службы.

Параметры: validate (bool)
- По умолчанию, если EC2 не возвращает данные об экземпляре, метод обновления возвращается тихо. Если параметр validate равен True, он будет вызывать исключение ValueError, если данные не возвращаются из EC2.

Смежные вопросы