2014-02-12 4 views
1

новичок вопрос. Я ожидаю, чтобы быть в состоянии сделать что-то вроде следующего:Использование boto (AWS Python), как мне получить список пользователей IAM?

import boto 
from boto.iam.connection import IAMConnection 
cfn = IAMConnection() 
cfn.get_all_users() 
for user in userList: 
    print user.user_id 

Соединение работает нормально, но последняя строка возвращает ошибку «„Юникод“объект не имеет атрибута„user_id“».

Я сделал type(userList), и он сообщил о типе как < класс 'boto.jsonresponse.Element' >, который не отображается (?) Для документирования. Использование обычного разбора JSON также не работает.

От another source, похоже, что цель операции, подобная этой, должна быть «pythonized».

Во всяком случае, я довольно новичок в boto, поэтому я предполагаю, что есть простой способ сделать это, что я просто не споткнулся.

Thx!

ответ

2

Для некоторых старых служб AWS boto принимает ответы XML от службы и превращает их в красивые объекты Python. Для других он принимает ответ XML и транслитерирует его непосредственно в собственные структуры данных Python. Модуль boto.iam имеет последний вид. Таким образом, фактические данные, возвращаемые get_all_users() выглядит следующим образом:

{u'list_users_response': 
    {u'response_metadata': {u'request_id': u'8d694cbd-93ec-11e3-8276-993b3edf6dba'}, 
    u'list_users_result': {u'users': 
    [{u'path': u'/', u'create_date': u'2014-01-21T17:19:45Z', u'user_id': 
     u'<userid>', u'arn': u'<arn>', u'user_name': u'foo'}, 
     {...next user...} 
    ] 
    } 
} 

Таким образом, все данные, которые вы хотите есть, это просто немного трудно найти. Возвращаемый объект boto.jsonresponse.Element дает вам небольшую помощь. Вы на самом деле можно сделать что-то вроде этого:

data = cfn.get_all_users() 
for user in data.user: 
    print(user['user_name']) 

, но по большей части вы просто должны копаться в возвращаемые данные, чтобы найти то, что вы ищете.

+0

Awesome, спасибо! Это то, что в конечном итоге работает для меня: 'данных = cfn.get_all_users() для пользователя в data.list_users_result.users: печати (user.user_name)' – mike

+0

Я сдаюсь на попытке форматирования кода в комментариях для теперь, arg. Достаточно сказать, что мне нужно было перебирать 'data.list_usres_result.users', и это работало как шарм. – mike

+0

Одна из приятных вещей, которая приходит в boto3, является однородным слоем объектов поверх всех сервисов, поэтому вам не нужно гадать в структурах данных низкого уровня. – garnaat