如何从boto中的预订ID获取实例ID

时间:2013-06-18 02:41:57

标签: python amazon-ec2 boto

我正在尝试创建一个简单的脚本,我可以使用python中的boto模块构建它。我想定义一些允许我创建和终止实例的函数。我在获取终止部分所需的实例ID时遇到问题。我可以从get_all_instances()属性获取预留ID,但我无法找到一种简单的方法来获取给定的预留ID,并从中获取实例ID。

如果它不是很明显,我是python的新手,并没有把等同于不同类型的东西挂起来。

如果我有预订ID,res =预订:r-xxxxxxx,我还没有找到API doc中的任何地方如何调用相关的实例ID。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:6)

我要提出的第一点是,预订可以有多个与之关联的实例。它并不总是一对一的映射。如果您致电run_instances并请求创建多个实例,则所有实例都将与相同的预订相关联。

您说您使用的是get_all_instances方法。此方法返回Reservation对象列表。每个Reservation对象都可能有多个与之关联的Instance对象。 Reservation对象并不是那么有用,所以通常你想要做的只是立即将Reservation对象列表转换为Instance对象列表。一种方法是:

import boto.ec2
conn = boto.ec2.connect_to_region('us-west-2')  # or whatever region you want
reservations = conn.get_all_instances()  # could limit results with filters
instances = []
for r in reservations:
    instances.extend(r.instances)

变量instances现在应该是实例对象的列表。每个Instance对象都有一个名为id的属性,该属性包含它的唯一实例ID。

执行相同操作的更紧凑的方法是使用嵌套列表推导,如下所示:

# same first three lines as above
instances = [i for r in reservations for i in r.instances]

答案 1 :(得分:3)

这可能不是操作系统想要的 - 但是,更简单的方法可能是在启动实例时创建实例对象。 e.g。

import boto.ec2

conn = boto.ec2.connect_to_region("us-east-1")

ins1 = conn.run_instances('ami-0axxxxxx', key_name='default', instance_type='t2.micro', security_group_ids=['sg-0c000000'], subnet_id='subnet-777777')

instance = ins1.instances[0]

print instance.id

答案 2 :(得分:1)

此代码将打印所有预订中的所有实例ID。希望能帮助到你。

import boto3

ec2=boto3.client('ec2')
instance_information = ec2.describe_instances()

c = boto3.ec2.connect_to_region('ap-south-1')
for reservation in instance_information['Reservations']:
    for instance in reservation['Instances']:
        print instance["InstanceId"]