使用Boto轮询停止或启动EC2实例

时间:2014-10-19 02:40:15

标签: python amazon-web-services amazon-ec2 boto

我正在使用AWS,Python和Boto library

我想在Boto EC2实例上调用.start().stop(),然后“轮询”它,直到它完成为止。

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会报告ACTUAL状态?

3 个答案:

答案 0 :(得分:13)

实例状态不会自动更新。您必须调用update方法告诉对象再次对EC2服务进行往返调用并获取对象的最新状态。这样的事情应该有效:

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

要在boto3中实现相同的效果,这样的事情应该有效。

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

答案 1 :(得分:4)

Python Boto3中的wait_until_running函数似乎就是我要使用的。

http://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Instance.wait_until_running

答案 2 :(得分:3)

这对我也有用。在文档上我们有这个:

update(validate=False, dry_run=False)
- 通过调用从服务中获取当前实例属性来更新实例的状态信息。

参数:validate (bool)
- 默认情况下,如果EC2没有返回有关实例的数据,则update方法会安静地返回。但是,如果validate参数为True,则如果没有从EC2返回数据,则会引发ValueError异常。