Erreur Boto3: botocore.exceptions.NoCredentialsError: Impossible de localiser les informations d'identification

113

Lorsque j'exécute simplement le code suivant, j'obtiens toujours cette erreur.

s3 = boto3.resource('s3')
    bucket_name = "python-sdk-sample-%s" % uuid.uuid4()
    print("Creating new bucket with name:", bucket_name)
    s3.create_bucket(Bucket=bucket_name)

J'ai enregistré mon fichier d'identification dans

C:\Users\myname\.aws\credentials, d'où Boto devrait lire mes informations d'identification.

Mon réglage est-il incorrect?

Voici la sortie de boto3.set_stream_logger('botocore', level='DEBUG').

2015-10-24 14:22:28,761 botocore.credentials [DEBUG] Skipping environment variable credential check because profile name was explicitly set.
2015-10-24 14:22:28,761 botocore.credentials [DEBUG] Looking for credentials via: env
2015-10-24 14:22:28,773 botocore.credentials [DEBUG] Looking for credentials via: shared-credentials-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: config-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: ec2-credentials-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: boto-config
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: iam-role
d -_- b
la source
1
Pouvez-vous publier la sortie de débogage en ajoutant boto3.set_stream_logger('botocore', level='DEBUG')avant votre code? Il montrera où il recherche les informations d'identification.
jamesls
il semble que Boto recherche assez peu d'emplacements pour le fichier de configuration des informations d'identification, mais apparemment ne regarde pas dans mon répertoire personnel pour une raison quelconque ...
d -_- b
2
Essayez de définir la variable d'environnement HOMEpour qu'elle pointe C:\Users\mynameou AWS_SHARED_CREDENTIALS_FILEqu'elle pointe directement vers votre fichier d'informations d'identification.
garnaat
J'ai défini la variable d'environnement HOME comme vous l'avez décrit, mais j'obtiens maintenant l'erreur suivante. botocore.exceptions.NoRegionError: You must specify a region. * mon fichier de configuration ↓ est situé dans le même dossier que mes identifiants. [default] ap-northeast-1
d -_- b
1
J'ai pu résoudre le problème en utilisant le commentaire de garnaat .
LaundroMat

Réponses:

93

essayez de spécifier les clés manuellement

    s3 = boto3.resource('s3',
         aws_access_key_id=ACCESS_ID,
         aws_secret_access_key= ACCESS_KEY)

Assurez-vous de ne pas inclure votre ACCESS_ID et ACCESS_KEY dans le code directement pour des raisons de sécurité. Envisagez d'utiliser les configurations d'environnement et de les injecter dans le code comme suggéré par @Tiger_Mike.

Pour les environnements Prod, envisagez d'utiliser des clés d'accès rotatives: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey

SHASHANK MADHAV
la source
Cette méthode est utile lors de la manipulation directement sur Django. Merci.
Joepreludian
1
Ceci est plus dangereux car vous mettez vos secrets dans votre code qui pourraient aboutir au contrôle de version.
nu everest
5
@nueverest C'est correct, mais vous pouvez éviter cela en déplaçant la déclaration dans un fichier de paramètres puis en l'injectant via des variables d'environnement.
Tiger_Mike
Bien que cela fonctionne, je dirais que cela ne suit pas les meilleures pratiques.
ben jarman
1
Merci. Cela peut être utilisé comme un correctif temporaire dans la configuration des développeurs. Le chargement de ces variables à partir d'un .envfichier (non validé) serait idéal et serait mieux que d'avoir à choisir dans un ~/.aws/dossier.
SuperNova
56

J'ai eu le même problème et j'ai découvert que le format de mon ~/.aws/credentialsfichier était incorrect.

Cela fonctionnait avec un fichier contenant:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Notez que le nom du profil doit être " [default]". Certains documents officiels font référence à un profil nommé " [credentials]", qui n'a pas fonctionné pour moi.

Fernando Ciciliati
la source
1
Fonctionne aussi sur Windows (C: \ Users \ User \ .aws \ credentials)
Mr_and_Mrs_D
4
vous pouvez spécifier le profil à utiliser dans boto3 en utilisant session = boto3.Session (profile_name = <your_profile>)
Mattia Paterna
L'utilisation aws configurefonctionne également si aws-cli est installé
radtek
2
Je l'exécutais via ansible, donc une autre chose à rechercher est de savoir si vous devenez un utilisateur différent lors de l'exécution de la commande. Assurez-vous de ne pas le faire avec 'sudo' par exemple, sinon il essaiera d'accéder aux informations d'identification root aws à la place et échouera si elles n'existent pas.
radtek
28

Si vous recherchez un autre moyen, essayez d'ajouter vos informations d'identification à l'aide d' AmazonCLI

à partir du type de terminal: -

aws configure

puis renseignez vos clés et votre région.

Amri
la source
17

Assurez-vous que votre fichier ~ / .aws / credentials sous Unix ressemble à ceci:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Votre script Python devrait ressembler à ceci, et cela fonctionnera:

from __future__ import print_function
import boto3
import os

os.environ['AWS_PROFILE'] = "MyProfile1"
os.environ['AWS_DEFAULT_REGION'] = "us-east-1"

ec2 = boto3.client('ec2')

# Retrieves all regions/endpoints that work with EC2
response = ec2.describe_regions()
print('Regions:', response['Regions'])

Source: https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration .

TheWalkingData
la source
1
Le output = jsonnormalement est placé ~/.aws/configdans une [profile MyProfile1]section. Cela peut ne pas fonctionner si spécifié dans le credentialsfichier à la place.
cjs
@Curt J. Sampson Sans vérifier, je suis sûr que vous avez raison. Merci pour la correction.
TheWalkingData
J'ai exporté AWS_PROFILE = myprofle et cela n'a pas fonctionné mais cela a fonctionné. Toute explication sur pourquoi cela pourrait arriver.
Adarsh ​​Trivedi le
5

Ces instructions sont destinées aux machines Windows avec un seul profil utilisateur pour AWS. Assurez-vous que votre ~/.aws/credentialsfichier ressemble à ceci

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

J'ai dû définir la AWS_DEFAULT_PROFILEvariable d'environnement pour être profile_nametrouvée dans vos informations d'identification.
Ensuite, mon python a pu se connecter. par exemple d' ici

import boto3

# Let's use Amazon S3
s3 = boto3.resource('s3')

# Print out bucket names
for bucket in s3.buckets.all():
    print(bucket.name)
Hrushikesh Dhumal
la source
1
Si vous définissez la variable d'environnement sur Win10 dans la section machine, vous devrez probablement également redémarrer.
Trevor
1
@Trevor, j'ai testé cela sur une machine Windows 7 avec un notebook Jupyter, j'ai dû redémarrer le serveur Jupyter et cela a fonctionné pour moi, mais je pense que le redémarrage serait une bonne idée.
Hrushikesh Dhumal
5

J'ai également eu le même problème, il peut être résolu en créant un fichier de configuration et d'informations d'identification dans le répertoire personnel. Vous trouverez ci-dessous les étapes que j'ai suivies pour résoudre ce problème.

Créez un fichier de configuration:

touch ~/.aws/config

Et dans ce fichier je suis entré dans la région

[default]
region = us-west-2

Créez ensuite le fichier d'informations d'identification:

touch ~/.aws/credentials

Entrez ensuite vos identifiants

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Après avoir défini tout cela, puis mon fichier python pour connecter le bucket. Exécutez ce fichier listera tout le contenu.

import boto3
import os

os.environ['AWS_PROFILE'] = "Profile1"
os.environ['AWS_DEFAULT_REGION'] = "us-west-2"

s3 = boto3.client('s3', region_name='us-west-2')
print("[INFO:] Connecting to cloud")

# Retrieves all regions/endpoints that work with S3

response = s3.list_buckets()
print('Regions:', response)

Vous pouvez également consulter les liens ci-dessous:

Nija I Pillai
la source
4

à partir du type de terminal: -

aws configure

puis renseignez vos clés et votre région.

après cela, utilisez n'importe quel environnement à l'étape suivante. Vous pouvez avoir plusieurs clés en fonction de votre compte. Peut gérer plusieurs environnements ou clés

import boto3
aws_session = boto3.Session(profile_name="prod")
# Create an S3 client
s3 = aws_session.client('s3')
aviboy2006
la source
2

Je travaille pour une grande entreprise et j'ai rencontré la même erreur, mais j'avais besoin d'un travail différent. Mon problème était lié aux paramètres du proxy. J'avais configuré mon proxy, je devais donc définir mon no_proxy sur la liste blanche d'AWS avant de pouvoir tout faire fonctionner. Vous pouvez également le définir dans votre script bash si vous ne voulez pas brouiller votre code Python avec les paramètres du système d'exploitation.

Python:

import os
os.environ["NO_PROXY"] = "s3.amazonaws.com"

Frapper:

export no_proxy = "s3.amazonaws.com"

Edit: Ce qui précède suppose une région US East S3. Pour les autres régions: utilisez s3. [Region] .amazonaws.com où region est quelque chose comme us-east-1 ou us-west-2

JJFord3
la source
2
J'ai eu un problème similaire - mais je devais le dire no_proxypour 169.254.169.254que le client AWS puisse accéder au service de métadonnées pour trouver le profil d'instance.
Ralph Bolton
0

Le boto3 recherche les informations d'identification dans le dossier comme

C:\ProgramData\Anaconda3\envs\tensorflow\Lib\site-packages\botocore\.aws

Vous devez enregistrer deux fichiers dans ce dossier credentialset config.

Vous voudrez peut-être vérifier l'ordre général dans lequel boto3 recherche les informations d'identification dans ce lien . Regardez sous le sous-titre Configuration des informations d'identification .

Samuel Nde
la source
0

Si vous êtes sûr de configurer correctement votre aws, assurez-vous simplement que l'utilisateur du projet peut lire à partir de ./aws ou simplement exécuter votre projet en tant que root

Mohamed Hamed
la source
0

Si vous avez plusieurs profils de SSFE dans ~/.aws/credentialscomme ...

[Profile 1]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
[Profile 2]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************

Suivez deux étapes:

  1. Créez-en un que vous souhaitez utiliser par défaut en utilisant la export AWS_DEFAULT_PROFILE=Profile 1commande dans le terminal.

  2. Assurez-vous d'exécuter la commande ci-dessus dans le même terminal à partir duquel vous utilisez boto3 ou vous ouvrez un éditeur. [Comprenez le scénario suivant]

Scénario:

  • Si vous avez deux terminaux ouverts appelés t1et t2.
  • Et vous exécutez la commande d'exportation dans t1et vous ouvrez JupyterLab ou tout autre à partir de t2, vous obtiendrez NoCredentialsError: Impossible de localiser l' erreur d' informations d'identification .

Solution:

  • Exécutez la commande d'exportation dans t1, puis ouvrez JupyterLab ou tout autre à partir du même terminal t1.
Sanket Patel
la source
0

Créez un objet client S3 avec vos informations d'identification

AWS_S3_CREDS = {
    "aws_access_key_id":"your access key", # os.getenv("AWS_ACCESS_KEY")
    "aws_secret_access_key":"your aws secret key" # os.getenv("AWS_SECRET_KEY")
}
s3_client = boto3.client('s3',**AWS_S3_CREDS)

Il est toujours bon d'obtenir les informations d'identification de l'environnement OS

kathir raja
la source