экземпляр boto .__ dict __ ['tags'] ['Name'] проблема с выходом - PullRequest
0 голосов
/ 31 января 2012

ОБНОВЛЕНИЕ:


Я сделал то, что было предложено ниже, однако я все еще получал 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'

Исходный вопрос:

Я пытаюсь сброситьсписок идентификаторов экземпляров вместе с их тегом «Name» из AWS с помощью boto.Я нашел в Интернете метод, который можно прикрепить к объекту экземпляра, который называется __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'])

Вывод hoky tho:

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'

Я предпочитаю этот вывод, БЕЗ ошибка - может кто-нибудь сказать мне, что я здесь делаю не так?

Спасибо

1 Ответ

4 голосов
/ 31 января 2012

Почему бы просто не получить доступ к атрибуту тегов напрямую? Добраться до него через __dict__ не очень питонично:

instance.tags['Name']

Вы также можете захотеть посмотреть на состояние экземпляра, так как некоторые из экземпляров в объектах Reservation, которые вы возвращаете из get_all_instances (), могут быть недавно завершенными экземплярами. В противном случае вы можете сообщить имя только для запущенных экземпляров и состояние (ПРИМЕЧАНИЕ. Эта проверка состояния - просто идея показать синтаксис A if cond else B. Вам все равно придется поиграть с ним самостоятельно):

instance.tags['Name'] if instance.state == 'running' else instance.state

Вы можете использовать dict.get(), если все, что вы хотите сделать, это избежать KeyError и вернуть значение по умолчанию.

instance.tags.get('Name')  
# or with a default
instance.tags.get('Name', '--')

Вот рекламный ролик, извлеченный из учебника boto ec2 , в котором упоминаются объекты резервирования и состояние экземпляра.

Если вы просто хотите получить список всех запущенных экземпляров, используйте метод get_all_instances объекта соединения. Обратите внимание, что возвращенный список на самом деле является списком объектов Reservation (которые содержат экземпляры), и этот список может включать недавно прекращенные экземпляры на небольшой промежуток времени после их прекращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...