Рекомендуемый способ управления учетными данными с несколькими учетными записями 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'))
Хорошо, плохо или безразлично? Предлагаемые улучшения?
Ответы
Ответ 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. Неправильно передается из кода
-
Переменные среды для ключа/секрета
-
Переменные среды для профиля
-
Профиль открытого профиля учетных данных
-
Общий профиль профиля учетных данных
-
Конфигурационный файл с явным профилем
-
Конфигурируемый файл. Учетные данные
Профиль, переданный из кода, переопределяет любой набор в переменной среды.
Чтобы все было чисто и просто, полезно избавиться от старых методов, поэтому удалите все старые файлы стиля (например, ~/.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