Почему не готовы обработчики аутентификации Amazon S3? - PullRequest
44 голосов
/ 22 марта 2011

Мои переменные окружения $ AWS_ACCESS_KEY_ID и $ AWS_SECRET_ACCESS_KEY установлены правильно, и я запускаю этот код:

import boto
conn = boto.connect_s3()

и получаю эту ошибку:

boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']

Что происходит?Я не знаю, с чего начать отладку.


Кажется, что boto не берет значения из моих переменных окружения.Если я передаю идентификатор ключа и секретный ключ в качестве аргументов конструктору соединений, это прекрасно работает.

Ответы [ 12 ]

34 голосов
/ 29 апреля 2011

Boto будет принимать ваши учетные данные из переменных среды.Я проверил это с V2.0b3, и он отлично работает.Он будет иметь приоритет над учетными данными, явно указанными в конструкторе, но он также будет извлекать учетные данные из переменных среды.

Самый простой способ сделать это - поместить свои учетные данные в текстовый файл и указать местоположениеэтого файла в среде.

Например (в Windows: я ожидаю, что он будет работать точно так же в Linux, но я лично не пробовал это)

Создать файл с именем "mycred.txt "и поместите его в C: \ temp. Этот файл содержит две строки:

AWSAccessKeyId=<your access id>
AWSSecretKey=<your secret key>

Определите переменную среды AWS_CREDENTIAL_FILE , чтобы указать на C: \ temp \ mycred.txt

C:\>SET AWS_CREDENTIAL_FILE=C:\temp\mycred.txt

Теперь ваш фрагмент кода выше:

import boto
conn = boto.connect_s3()

будет работать нормально.

14 голосов
/ 11 ноября 2011

Я новичок и в python, и в boto, но смог воспроизвести вашу ошибку (или, по крайней мере, последнюю строку вашей ошибки).

Скорее всего, вы не можете экспортировать переменные в bash.если вы просто определили тогда, они действительны только в текущей оболочке, экспортируйте их и Python наследует значение.Таким образом:

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

не будет работать, пока вы не добавите:

$ export AWS_ACCESS_KEY_ID

Или вы можете сделать все это в одной строке:

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

Аналогично длядругое значение.Вы также можете поместить это в ваш .bashrc (при условии, что bash - это ваша оболочка, и при условии, что вы не забыли экспортировать)

10 голосов
/ 20 мая 2015

Продолжение ответа nealmcb о ролях IAM. При развертывании кластеров EMR с использованием роли IAM у меня была похожая проблема: иногда (не каждый раз) эта ошибка возникала при подключении boto к s3.

boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']

Служба метаданных может получить тайм-аут при получении учетных данных. Таким образом, как показывают документы, я добавил в конфигурацию раздел Boto и увеличил количество попыток получения учетных данных. Обратите внимание, что по умолчанию используется 1 попытка.

import boto, ConfigParser
try:
    boto.config.add_section("Boto")
except ConfigParser.DuplicateSectionError:
    pass
boto.config.set("Boto", "metadata_service_num_attempts", "20")

http://boto.readthedocs.org/en/latest/boto_config_tut.html?highlight=retries#boto

Прокрутите вниз до: You can control the timeouts and number of retries used when retrieving information from the Metadata Service (this is used for retrieving credentials for IAM roles on EC2 instances)

8 голосов
/ 14 мая 2016

Я только что столкнулся с этой проблемой при использовании Linux и SES, и я надеюсь, что она может помочь другим с подобной проблемой.Я установил awscli и настроил свои ключи следующим образом:

sudo apt-get install awscli
aws configure

Это используется для настройки ваших учетных данных в ~ / .aws / config, как сказал @huythang. Но boto ищет ваши учетные данные в ~ / .aws / credentials , поэтому скопируйте их на

cp ~/.aws/config ~/.aws/credentials

Если для вашего пользователя настроена соответствующая политика с этими учетными данными - вам не нужноустановить любые переменные окружения.

3 голосов
/ 01 сентября 2014

Я нашел свой ответ здесь .

В Unix: первая настройка конфигурации aws:

#vim ~/.aws/config
[default]
region = Tokyo
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxx

И установить переменные окружения

export AWS_ACCESS_KEY_ID="aws_access_key_id"
export AWS_SECRET_ACCESS_KEY="aws_secret_access_key"
3 голосов
/ 26 ноября 2013

См. Последнюю версию boto s3 :

from boto.s3.connection import S3Connection
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
2 голосов
/ 01 мая 2015

В моем случае проблема заключалась в том, что в IAM «пользователи по умолчанию не имеют разрешений».Мне потребовался целый день, чтобы отследить это, поскольку я привык к исходной модели аутентификации AWS (pre-iam), в которой так называемые «корневые» учетные данные были единственным способом.

Есть многоAWS документы о создании пользователей, но только в нескольких местах, где они отмечают, что вы должны дать им разрешения, чтобы они могли что-либо делать.Один из них - Работа с корзинами Amazon S3 - Amazon Simple Storage Service , но даже он не просто говорит вам, что нужно перейти на вкладку «Политики», предложить хорошую стартовую политику и объяснить, как ее применять.

Мастер своего рода просто рекомендует вам «начать работу с пользователями IAM» и не уточняет, что еще многое предстоит сделать.Даже если вы немного поэкспериментируете, вы просто увидите, например, «Управляемые политики. К этому пользователю не подключены управляемые политики». , что не означает, что вам нужна политика, чтобы что-то делать.

Чтобы установить пользователя с правами root, см. Создание группы администраторов с помощью консоли - Управление идентификацией и доступом AWS

Я не вижу конкретной политики, которая просто позволяет читать-только доступ ко всем S3 (мои собственные, а также публичные, принадлежащие другим).

1 голос
/ 08 июля 2018

Ранее я успешно использовал s3-parallel-put, но он по непонятным причинам перестал работать, выдавая ошибку выше. Это несмотря на то, что вы экспортировали AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY.

Решением было указать учетные данные в файле конфигурации boto:

$ nano ~/.boto

Введите учетные данные следующим образом:

[Credentials]
aws_access_key_id = KEY_ID
aws_secret_access_key = SECRET_ACCESS_KEY
1 голос
/ 22 октября 2013

Теперь вы можете установить их в качестве аргументов при вызове функции подключения.

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

Просто подумал, что добавлю это, если кто-нибудь еще будет искать, как я.

0 голосов
/ 08 декабря 2017

У меня была эта проблема с приложением фляги на ec2.Я не хотел помещать учетные данные в приложение, но управлял разрешением через роли IAM.Таким образом можно избежать жесткого кодирования ключей в коде.Затем я установил политику в консоли AWS (я даже не кодировал ее, я просто использовал генератор политик)

Мой код точно такой же, как у OP.Другие решения здесь хороши, но есть способ получить большое разрешение без жестко закодированных ключей доступа.

  1. Создать группу безопасности IAM, которая предоставляет доступ к ресурсу S3
  2. Дайте политику экземпляру EC2
  3. Соединитесь, используя только boto.connect_s3() # ключи не нужны
...