Подтвердить что ты не робот

Рекомендуемый способ управления учетными данными с несколькими учетными записями AWS?

Каков наилучший способ управления несколькими учетными записями Amazon Web Services (AWS) через boto?

Я знаком с BotoConfig файлами, которые я использую. Но каждый файл описывает только одну учетную запись... и я работаю не только с одной организацией. По всем обычным юридическим, финансовым и соображениям безопасности эти счета нельзя смешивать.

В настоящее время я использую один файл конфигурации boto для каждой учетной записи. Например:.

  • ~/.boto учетная запись по умолчанию
  • ~/.boto_clowncollege для учетной записи "clowncollege"
  • ~/.boto_razorassoc для учетной записи "razorassoc"
  • ~/.boto_xyz для учетной записи "xyz"

Затем что-то вроде:

def boto_config_path(account=None):
    """
    Given an account name, return the path to the corresponding boto
    configuration file. If no account given, return the default config file.
    """
    path = '~/.boto' + ('_' + account if account else '')
    clean_path = os.path.abspath(os.path.expanduser(path))
    if os.path.isfile(clean_path):
        return clean_path
    else:
        errmsg = "cannot find boto config file {} for {}".format(clean_path, account)
        raise ValueError(errmsg)

def aws_credentials(account=None):
    """
    Return a tuple of AWS credentials (access key id and secret access key) for
    the given account.
    """
    try:
        cfg = INIConfig(open(boto_config_path(account)))
        return ( cfg.Credentials.aws_access_key_id, cfg.Credentials.aws_secret_access_key )
    except Exception:
        raise

conn = EC2Connection(*aws_credentials('razorassoc'))

Хорошо, плохо или безразлично? Предлагаемые улучшения?

4b9b3361

Ответ 1

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

Сначала вы можете установить BOTO_CONFIG, чтобы указать файл конфигурации boto, который вы хотите использовать, и он переопределит любой файл конфигурации, найденный в обычных местах.

Во-вторых, вы можете установить BOTO_PATH в список разделенных двоеточиями мест для поиска файла конфигурации boto, и он будет искать там сначала до обычных поисковых местоположений.

Ни один из них не дает вам именно то, что вы хотите, но это может облегчить выполнение с меньшим количеством кода.

Если у вас есть идеи о том, как вы хотите, чтобы это работало в boto, пожалуйста, дайте мне знать!

Ответ 2

обновлено 2015-02-06, скорректировано 2015-03-19, следуя верхней части

Новый стандартизированный обмен учетными данными boto и AWSCLI (boto > == 2.29.0)

Так как boto 2.29 существует новый простой способ обмена учетными данными BOTO и AWS CLI, как описано Майком Garnaat в Новый и стандартизованный способ управления учетными данными в AWS SDK

Цель состоит в следующем:

  • разрешить совместное использование учетных данных с помощью boto, AWSCLI и, возможно, других SDK
  • сохранить всю конфигурацию в одном файле, расположенном в каталоге профиля пользователя
  • разрешить использование именованных профилей
  • держите его как можно проще (например, предотвратите конфликты с другими методами)

Создать файл учетных данных

Создайте файл ~/.aws/credentials (Mac/Linux) или %USERPROFILE%\.aws\credentials (Windwos) как следующим образом:

[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1

[jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1

[hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
region = eu-west-1

Теперь вы можете использовать такой код:

Использовать профиль по умолчанию

import boto
con = boto.connect_s3()

Использовать явный профиль, заданный AWS_PROFILE env. вар

(это мой любимый вариант, позволяющий сохранить имя профиля вне кода и все еще предоставляя развертыванию моего приложения возможность выбрать конкретный профиль)

$ export AWS_PROFILE=jekyl

и сохраните свой код так же просто, как раньше:

import boto
con = boto.connect_s3()

Укажите явный профиль в вашем коде

import boto
con = boto.connect_s3(profile_name="jekyl")

Это все, что вам обычно нужно делать

Логика выбора правильных учетных данных описана в boto issue # 2292 следующим образом:

Порядок загрузки от наивысшего до самого низкого приоритета:

1. Неправильно передается из кода

  1. Переменные среды для ключа/секрета

  2. Переменные среды для профиля

  3. Профиль открытого профиля учетных данных

  4. Общий профиль профиля учетных данных

  5. Конфигурационный файл с явным профилем

  6. Конфигурируемый файл. Учетные данные

Профиль, переданный из кода, переопределяет любой набор в переменной среды.

Чтобы все было чисто и просто, полезно избавиться от старых методов, поэтому удалите все старые файлы стиля (например, ~/.aws/config или ~/.boto), отключите окружение varialbe BOTO_CONFIG, если установлено и возможно, также файл, к которому такая переменная указывает.

И это действительно все для boto >= 2.29.0

Примечание. Не пытайтесь контролировать расположение файла конфигурации с помощью env.variable(например, AWS_CONFIG_FILE), он не работает должным образом.

Использовать профиль конфигурации boto (boto >= 2.24.0)

Следующее описание хранится здесь только для тех, кто не может обновиться до версии 2.29.0 или выше

Так как boto 2.24.0 есть функция, называемая profile_name

В вашем файле ~/.boto у вас уже есть раздел [Учетные данные], это будет служить резервным вариантом, а затем [профилем], служащим для разных профилей:

[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ

Затем при создании соединения вы используете этот способ:

import boto
con = boto.connect_s3(profile_name="jekyl")

Обратите внимание, что эта функция доступна с boto 2.24.0.

Учебник здесь http://docs.pythonboto.org/en/latest/boto_config_tut.html?highlight=profile

Есть даже некоторые заметки об использовании keyrings, но я сначала привыкну к этому профилю, о котором я мечтал несколько лет.

Обмен конфигурационным файлом с AWSCLI

AWSCLI стал действительно отличным инструментом. Поскольку формат файла конфигурации почти тот же, я использую его следующим образом:

  • сохранить ~/.aws/config файл, созданный AWSCLI (это местоположение по умолчанию)
  • скопировать раздел [default] и переименовать его в [Credentials] (оставляя одни и те же значения внутри).
  • добавить любые профили, которые я использую
  • установите переменную BOTO_CONFIG, чтобы указать на этот файл ~/.aws/config.

~/.boto затем станет `~/.aws/config со следующим содержимым:

[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ

Таким образом, он становится общим для AWSCLI и boto, включая профили.

Ответ 3

Вместо того, чтобы создавать кучу отдельных файлов конфигурации boto, рассмотрите возможность использования модуля ConfigParser и создания раздела в файле .boto для каждой из ваших учетных записей.

ваш .boto файл может выглядеть примерно так.

#Contents of ~/.boto
[clown-college]
aws_access_key_id = 123sesamestreet
aws_secret_access_key = 678idsaf567ujd
[razor-assoc]
aws_access_key_id = 437piedmont
aws_secret_access_key = 997567ujdfs

В вашем коде на Python используйте ConfigParser для загрузки соответствующего ключа доступа для учетной записи, которую вы хотите использовать.

import ConfigParser
from os.path import expanduser

########## BEGIN MAIN ##############

# get the path to the user homedir
user_home = expanduser("~")

#load their .boto config file
config = ConfigParser.ConfigParser()
config.read([str(user_home + "/.boto")])

#get the keypair for ClownCollege
print config.get('clown-college', 'aws_access_key_id')
print config.get('clown-college', 'aws_secret_access_key')

print config.get('razor-assoc', 'aws_access_key_id')
print config.get('razor-assoc', 'aws_secret_access_key')

Это может быть обернуто функцией, используемой в вашем коде boto, чтобы легко установить правильную учетную запись.

Ответ 4

Как и в случае boto >= 2.38, похоже, что все предыдущие решения могут вызвать огромные головные боли и проблемы.

После тестирования этого широко сегодня на нескольких платформах, основанных на BSD, кажется, что наиболее эффективным способом теперь управлять различными профилями аутентификации для AWSCLI и py-boto является использование aws configure interactive script. Назовите его без профиля, и он заполнит блок [default] для файлов .aws/config и .aws/credentials, и, кроме того, он настроит любую другую магию, необходимую для работы с вашим набором инструментов aws ( хотя пока неясно, какие именно гексы он накладывает на ваш локальный хост). Назовите его еще раз с любым именем профиля, и он создаст соответствующую запись.

Обратите внимание, что это все еще не работает для версий boto < 2.3.

aws configure --profile somename
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: us-east-1
Default output format [None]: json