3

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

如果不是很明显,我是 python 新手,还没有将不同类型等同起来的窍门。

如果我有一个 Reservation ID,res = Reservation:r-xxxxxxx,我在 API 文档中的任何地方都没有找到如何调用相关的实例 ID。有人可以指出我正确的方向吗?

4

3 回答 3

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 对象的列表。每个 Instance 对象都有一个名为的属性,该属性id包含它的唯一实例 ID。

做同样事情的更紧凑的方法是使用嵌套列表推导,如下所示:

# same first three lines as above
instances = [i for r in reservations for i in r.instances]
于 2013-06-18T11:03:23.540 回答
3

这可能不是操作想要的 - 但是,一种更简单的方法可能是在您启动实例时创建一个实例对象。例如

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
于 2014-12-05T22:49:55.360 回答
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"]
于 2018-05-02T06:22:07.823 回答