我正在尝试创建一个简单的脚本,我可以使用python中的boto模块构建它。我想定义一些允许我创建和终止实例的函数。我在获取终止部分所需的实例ID时遇到问题。我可以从get_all_instances()属性获取预留ID,但我无法找到一种简单的方法来获取给定的预留ID,并从中获取实例ID。
如果它不是很明显,我是python的新手,并没有把等同于不同类型的东西挂起来。
如果我有预订ID,res =预订:r-xxxxxxx,我还没有找到API doc中的任何地方如何调用相关的实例ID。有人能指出我正确的方向吗?
答案 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"]