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.
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.
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)
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)
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.
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"
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).
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.
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.
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.
- créer une sécurité IAM groupe qui accorde l'accès à la ressource S3
- donne la stratégie à L'instance EC2
- Se connecter en utilisant rien d'autre que
boto.connect_s3()
# aucune clé nécessaire
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
, 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
.