更新
我做了下面建议的事情,但是,我仍然在输出中得到一个KeyError:'Name',即使输出是正确的。
这是输出:
us-west-1 EC2Connection:
ec2.us-west-1.amazonaws.com
Showing all of your current instances
Proxy-44-1000-Enrollments
Proxy-45-1000-Enrollments
Proxy-48-1000-Enrollments
Proxy-49-1000-Enrollments
Proxy-59-1000-Enrollments
Proxy-67-1000-Enrollments
Traceback (most recent call last): File "/Users/xxxxx/xxxx/boto/instanceid.py",
line 43, in <module> print "\t%s" % (instance.tags['Name']) if instance.state ==
'running' else instance.state KeyError: 'Name'
初步问题:
我正在尝试使用boto从AWS转出实例ID列表及其“Name”标记。我在网上发现了一个可以附加到实例对象的方法,称为__dict__
,它似乎运行良好,但是,我只想在使用这种方法时拔出“name”标签,但我一直在错误“键错误:'名称'”
基本上,此代码有效:
# Creating connection object to EC2
conn = boto.connect_ec2()
regions = boto.ec2.regions()
# the 5 element in the array is "us-west-1" and setting the object to connect
us = regions[5]
print us.name
conn_us = us.connect()
print conn_us
filters = {'key-name' : 'misc-key'}
all_inst = conn_us.get_all_instances(filters=filters)
print "Showing all of your current instances"
for res in all_inst:
# each reservation have a instance:
for instance in res.instances:
print "\t%s: \t%s" % (instance.id, instance.__dict__['tags'])
输出很糟糕:
us-west-1
EC2Connection:ec2.us-west-1.amazonaws.com
Showing all of your current instances
i-xxxxxxxx: {u'Name': u'Proxy-xx-1000-Enrollments'}
i-xxxxxxxx: {u'Name': u'Proxy-xx-1000-Enrollments'}
i-xxxxxxxx: {u'Name': u'Proxy-xx-1000-Enrollments'}
i-xxxxxxxx: {u'Name': u'Proxy-xx-1000-Enrollments'}
i-xxxxxxxx: {u'Name': u'Proxy-xx-1000-Enrollments'}
当我对__dict__
方法进行更改以“拉出”“名称”时,它可以正常工作(或似乎有效,但会引发错误:
以下是代码更改:
print "\t%s: \t%s" % (instance.id, instance.__dict__['tags']['Name'])
这是输出:
us-west-1
EC2Connection:ec2.us-west-1.amazonaws.com
Showing all of your current instances
i-xxxxxxxx: Proxy-xx-1000-Enrollments
i-xxxxxxxx: Proxy-xx-1000-Enrollments
i-xxxxxxxx: Proxy-xx-1000-Enrollments
i-xxxxxxxx: Proxy-xx-1000-Enrollments
i-xxxxxxxx: Proxy-xx-1000-Enrollments
i-xxxxxxxx: Proxy-xx-1000-Enrollments
Traceback (most recent call last):
File "/Users/xxxxxx/xxx.xxx/boto/instanceid.py", line 43, in <module>
print "\t%s: \t%s" % (instance.id, instance.__dict__['tags']["Name"])
KeyError: 'Name'
我更喜欢这个输出,没有错误 - 有谁能告诉我这里我做错了什么?
由于
答案 0 :(得分:4)
为什么不直接访问tags属性?通过__dict__
获取它并不是非常pythonic:
instance.tags['Name']
您还可能希望查看实例的状态,因为您从get_all_instances()返回的Reservation对象中的某些实例可能是最近终止的实例。您可以仅在正在运行的实例上报告名称,否则报告状态(注意 - 此.state检查只是一个显示A if cond else B
语法的想法。您仍然必须自己玩它):
instance.tags['Name'] if instance.state == 'running' else instance.state
如果您只想避免KeyError并返回默认值,则可以使用dict.get()
。
instance.tags.get('Name')
# or with a default
instance.tags.get('Name', '--')
这是从提到保留对象和实例状态的boto ec2 tutorial中提取的模糊。
如果您只想获取所有正在运行的实例的列表,请使用 连接对象的get_all_instances方法。请注意 返回的列表实际上是一个Reservation对象列表(包含 实例),该列表可能包括最近终止 在终止后的一小段时间内的实例。