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']
Que ce passe-t-il? Je ne sais pas par où commencer le débogage.
Il semble que boto ne prend pas les valeurs de mes variables d’environnement. Si je transmets l'ID de clé et la clé secrète en tant qu'arguments au constructeur de connexion, cela fonctionne correctement.
Boto will prend vos informations d'identification des variables d'environnement. J'ai testé cela avec la V2.0b3 et cela fonctionne 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.
Pour ce faire, le moyen le plus simple consiste à entrer vos informations d'identification dans un fichier texte et à spécifier l'emplacement de ce fichier dans l'environnement.
Par exemple (sous Windows: je suppose que cela fonctionnera de la même façon sous Linux mais je n'ai pas personnellement essayé cela)
Créez un fichier appelé "mycred.txt" et insérez-le 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 pour qu'elle pointe vers 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 en python et en boto mais j'ai pu reproduire votre erreur (ou au moins la dernière ligne de votre erreur).
Il est fort probable que vous n'exportez pas vos variables dans bash. si vous définissez seulement alors, ils ne sont valides que dans le Shell actuel, exportez-les et python héritera de la valeur. Ainsi:
$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"
ne fonctionnera que 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 aussi mettre ceci 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 utilisant un rôle IAM, j'avais un problème similaire: parfois, cette erreur se produisait parfois (pas toujours) 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 de récupération des informations d’identité. Notez que la valeur par défaut est 1 tentative.
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/fr/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 pourra aider d'autres personnes avec un problème similaire. J'avais installé awscli et configuré mes clés de la manière suivante:
Sudo apt-get install awscli
aws configure
Ceci est utilisé pour configurer vos identifiants dans ~/.aws/config, comme @huythang l'a dit. Mais boto cherche vos identifiants dans ~/.aws/credentials donc copiez-les
cp ~/.aws/config ~/.aws/credentials
En supposant qu'une stratégie appropriée soit configurée pour votre utilisateur avec ces informations d'identification, vous ne devriez pas avoir besoin de définir de variables d'environnement.
J'ai trouvé ma réponse ici .
Sous Unix: première configuration avec aws config:
#vim ~/.aws/config
[default]
region = Tokyo
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxx
Et définir les variables d'environnement
export AWS_ACCESS_KEY_ID="aws_access_key_id"
export AWS_SECRET_ACCESS_KEY="aws_secret_access_key"
Voir dernière boto s3 introduction :
from boto.s3.connection import S3Connection
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
Dans mon cas, le problème était que dans IAM, "les utilisateurs ne disposent par défaut d'aucune autorisation". Cela m’a pris toute la journée pour le localiser, car j’étais habitué au modèle d’authentification AWS original (pre-iam) dans lequel les informations d’accréditation «racine» constituaient le seul moyen.
Il existe de nombreux 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 puissent faire quoi que ce soit. La première est Utilisation des compartiments Amazon S3 - Amazon Simple Storage Service , mais même si cela ne vous dit pas simplement d'aller dans l'onglet Stratégies, de suggérer une bonne stratégie de démarrage et d'expliquer comment l'appliquer.
L'assistant de toutes sortes vous encourage simplement à "Se familiariser avec les utilisateurs IAM" et ne précise pas qu'il reste encore beaucoup à faire. Même si vous fouillez un peu, vous voyez par exemple "Stratégies gérées Aucune stratégie gérée n'est associée à cet utilisateur." qui ne suggère pas que vous ayez besoin d'une politique pour faire quoi que ce soit.
Pour établir un utilisateur de type racine, consultez: 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 permette simplement un accès en lecture seule à l'ensemble de S3 (mes propres seaux ainsi que ceux publics appartenant à d'autres).
Vous pouvez maintenant les définir comme arguments dans l'appel de la fonction de connexion.
s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
Je pensais que j'ajouterais que si quelqu'un d'autre cherchait comme moi.
J'avais déjà utilisé s3-parallel-put
avec succès, mais il a inexplicablement cessé de fonctionner, donnant l'erreur ci-dessus. Ceci en dépit d'avoir exporté les AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY.
La solution consistait à 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
J'avais ce problème avec une application de flacon sur ec2. Je ne voulais pas mettre les informations d'identification dans l'application, mais ai géré l'autorisation via des rôles IAM. De cette façon, vous éviterez de coder en dur les clés 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 OP. Les autres solutions ici sont bonnes, mais il existe un moyen d’obtenir une grande permission sans clés de code codées en dur.
boto.connect_s3()
#no keysSur Mac, les clés d'exportation doivent ressembler à ceci: key=value
. Ainsi, exporter, par exemple, AWS_ACCESS_KEY_ID
variable 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 lancera l'erreur susmentionnée.