Pourquoi les gestionnaires D'authentification Amazon S3 ne sont-ils pas prêts?

J'ai mes variables d'environnement $AWS_ACCESS_KEY_ID et $AWS_SECRET_ACCESS_KEY définies correctement, et j'exécute ce code:

import boto
conn = boto.connect_s3()

Et obtenez cette erreur:

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

Ce qui se passe? Je ne sais pas par où commencer le débogage.


Il semble que boto ne prenne pas les valeurs de mes variables d'environnement. Si je passe l'id de clé et la clé secrète comme arguments au constructeur de connexion, cela fonctionne bien.

43
demandé sur Bill the Lizard 2011-03-22 22:47:35

12 réponses

Boto VA prendre vos informations d'identification à partir des variables d'environnement. J'ai testé cela avec V2. 0b3 et cela fonctionne très bien. Il donnera la priorité aux informations d'identification spécifiées explicitement dans le constructeur, mais il récupérera également les informations d'identification des variables d'environnement.

De La façon la plus simple de le faire est de mettre vos informations d'identification dans un fichier texte, et de préciser l'emplacement du fichier dans l'environnement.

Par exemple (sous Windows: je m'attends à ce que cela fonctionne de la même manière sur Linux mais je n'ai pas personnellement essayé cela)

Créez un fichier appelé " mycred.txt " et le mettre dans C:\temp Ce fichier contient deux lignes:

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

Définissez la variable D'environnement AWS_CREDENTIAL_FILE vers laquelle pointer C:\temp\mycred.txt

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

Maintenant votre fragment de code ci-dessus:

import boto
conn = boto.connect_s3()

Fonctionnera bien.

32
répondu liamf 2011-04-29 11:05:51

Je suis un débutant à la fois pour Python et boto mais j'ai pu reproduire votre erreur (ou au moins la dernière ligne de votre erreur.)

Vous échouez probablement à exporter vos variables dans bash. si vous définissez simplement alors, ils ne sont valides que dans le shell actuel, exportez-les et python hérite de la valeur. Ainsi:

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

NE FONCTIONNERA PAS sauf si vous ajoutez également:

$ export AWS_ACCESS_KEY_ID

, Ou vous pouvez tout faire sur la même ligne:

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

De Même pour l'autre valeur. Vous pouvez également mettre cela dans votre .bashrc (en supposant que bash est votre shell et en supposant que vous vous souvenez d'exporter)

13
répondu OpenID-test2 2011-11-11 12:18:11

Suivi de la réponse de nealmcb sur les rôles IAM. Lors du déploiement de clusters EMR en utilisant un rôle IAM, j'ai eu un problème similaire où parfois (pas à chaque fois) cette erreur se produirait lors de la connexion de boto à S3.

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

Le service de métadonnées peut expirer lors de la récupération des informations d'identification. Ainsi, comme le suggèrent les docs, j'ai ajouté une section Boto dans la configuration et augmenté le nombre de tentatives pour récupérer les informations d'identification. Notez que la valeur par défaut est 1 tenter.

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

Faites Défiler jusqu'à: 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)

9
répondu dyltini 2017-06-16 04:08:55

Je viens de rencontrer ce problème en utilisant Linux et SES, et j'espère que cela peut aider les autres avec un problème similaire. J'avais installé awscli et configuré mes clés en faisant:

sudo apt-get install awscli
aws configure

Ceci est utilisé pour configurer vos informations d'identification dans~/.aws / config tout comme @ huythang a dit. mais boto cherche vos informations d'identification dans ~/.aws / credentials {[6] } alors copiez-les sur

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

En supposant qu'une stratégie appropriée est configurée pour votre utilisateur avec ces informations d'identification - vous ne devriez pas avoir besoin de définir un environnement variable.

8
répondu Gavin Palmer 2016-05-14 12:10:50

J'ai trouvé ma réponse ici.

Sous Unix: première configuration aws config:

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

Et définir des variables d'environnement

export AWS_ACCESS_KEY_ID="aws_access_key_id"
export AWS_SECRET_ACCESS_KEY="aws_secret_access_key"
3
répondu huythang 2016-03-04 03:47:41

Voir la dernière introduction boto S3 :

from boto.s3.connection import S3Connection
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
3
répondu Bijan 2016-11-21 09:48:11

Dans mon cas, le problème était que dans IAM "les utilisateurs par défaut n'ont pas d'autorisations". Il m'a fallu toute la journée pour traquer cela, puisque j'étais habitué au modèle D'authentification AWS original (pre-iam) dans lequel ce que l'on appelle maintenant les informations d'identification "root" étaient le seul moyen.

Il y a beaucoup de documents AWS sur la création d'utilisateurs, mais seulement quelques endroits où ils notent que vous devez leur donner des autorisations pour qu'ils fassent quoi que ce soit. L'un est travailler avec des seaux Amazon S3 - Amazon Simple Storage Service , mais même il ne vous dit pas vraiment d'aller à L'onglet Stratégies, de Suggérer une bonne politique de départ et d'expliquer comment l'appliquer.

L'assistant vous encourage simplement à "commencer avec les utilisateurs IAM" et ne précise pas qu'il y a beaucoup plus à faire. Même si vous fouillez un peu, vous voyez juste par exemple " stratégies gérées il n'y a pas de stratégies gérées attachées à cet utilisateur." ce qui ne suggère pas que vous avez besoin d'une politique pour faire quoi que ce soit.

Pour établir un racine-comme l'utilisateur, voir: création d'un groupe D'administrateurs à L'aide de la Console AWS Identity and Access Management

Je ne vois pas de politique spécifique qui permet simplement un accès en lecture seule à tous les S3 (mes propres compartiments ainsi que ceux publics appartenant à d'autres).

2
répondu nealmcb 2015-05-01 05:03:47

Vous pouvez maintenant les Définir comme arguments dans l'appel de la fonction connect.

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

Je pensais juste ajouter que dans le cas où quelqu'un d'autre a cherché comme je l'ai fait.

1
répondu The_Cthulhu_Kid 2013-10-22 11:33:03

Sur Mac, les clés d'exportation doivent ressembler à ceci: key=value. Donc, exporter, disons, AWS_ACCESS_KEY_ID La var environnementale devrait ressembler à ceci: AWS_ACCESS_KEY_ID=yourkey. Si vous avez des citations autour de vos valeurs, comme mentionné dans les réponses ci-dessus, boto lève l'erreur ci-dessus.

0
répondu C0D3LIC1OU5 2015-06-22 20:30:20

J'avais ce problème avec une application flask sur ec2. Je ne voulais pas mettre d'informations d'identification dans l'application, mais Gérer les autorisations via les rôles IAM. De cette façon, vous pouvez éviter les clés de codage en dur dans le code. Ensuite, j'ai défini une stratégie dans la console AWS (Je ne l'ai même pas codée, je viens d'utiliser le générateur de stratégie)

Mon code est exactement comme celui des OP. les autres solutions ici sont bonnes mais il y a un moyen de grande permission Sans clés d'accès en dur.

  1. créer une sécurité IAM groupe qui accorde l'accès à la ressource S3
  2. donne la stratégie à L'instance EC2
  3. Se connecter en utilisant rien d'autre que boto.connect_s3() # aucune clé nécessaire
0
répondu billmanH 2017-12-08 16:56:51

J'avais déjà utilisé s3-parallel-put avec succès mais il a inexplicablement cessé de fonctionner, donnant l'erreur ci-dessus. Ceci malgré avoir exporté les AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY.

La solution était de spécifier les informations d'identification dans le fichier de configuration boto:

$ nano ~/.boto

Entrez les informations d'identification comme suit:

[Credentials]
aws_access_key_id = KEY_ID
aws_secret_access_key = SECRET_ACCESS_KEY
0
répondu KalenGi 2018-07-08 12:00:59

, je vois que vous les appelez AWS_ACCESS_KEY_ID & AWS_SECRET_ACCESS_KEY.

Quand il semble qu'ils devraient être définis comme AWSAccessKeyId & AWSSecretKey.

-4
répondu Kirk Ireson 2011-07-29 09:50:18