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