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

Почему нет обработчиков аутентификации Amazon S3?

У меня установлены переменные среды $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 не принимает значения из моих переменных окружения. Если я передаю ключ и секретный ключ в качестве аргументов конструктору соединения, это отлично работает.

4b9b3361

Ответ 1

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()

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

Ответ 2

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

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

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

не будет работать, если вы еще не добавили:

$ export AWS_ACCESS_KEY_ID

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

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

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

Ответ 3

Следуйте за ответом 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)

Ответ 4

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

sudo apt-get install awscli
aws configure

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

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

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

Ответ 5

Смотрите последние boto s3 introduction:

from boto.s3.connection import S3Connection
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

Ответ 6

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

В Unix: первая настройка aws config:

#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"

Ответ 7

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

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

Мастер-сортировка просто поощряет вас к "Начинать работу с пользователями IAM" и не поясняет, что делать гораздо больше. Даже если вы немного соскучитесь, вы просто увидите, например. "Управляемые политики Для этого пользователя нет управляемых политик". который не предполагает, что вам нужна политика, чтобы что-либо сделать.

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

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

Ответ 8

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

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

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

Ответ 9

На Mac экспорт ключей должен выглядеть так: key=value. Так что экспорт, скажем, AWS_ACCESS_KEY_ID Environmental var должен выглядеть следующим образом: AWS_ACCESS_KEY_ID=yourkey. Если у вас есть какие-либо цитаты вокруг ваших значений, как указано в приведенных выше ответах, boto выкинет вышеупомянутую ошибку.

Ответ 10

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

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

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

Ответ 11

Я вижу, что вы называете их AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY.

Когда кажется, что они должны быть установлены как AWSAccessKeyId и AWSSecretKey.