Lorsque je lance 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 sauvegardé mon fichier d'identification dans
C:\Users\myname\.aws\credentials
, à partir duquel Boto doit lire mes informations d'identification.
Est-ce que mon réglage est faux?
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
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 votre ACCESS_KEY dans le code directement pour des raisons de sécurité . Envisagez d'utiliser des configs 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
J'ai eu le même problème et j'ai découvert que le format de mon fichier ~/.aws/credentials
était incorrect.
Cela a fonctionné 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 ne fonctionnait pas pour moi.
Si vous recherchez une solution alternative, essayez d'ajouter vos informations d'identification à l'aide de AmazonCLI
à partir du type de terminal: -
aws configure
puis remplissez vos clés et votre région.
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 ça va marcher:
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 .
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 de proxy. Mon proxy étant configuré, je devais donc définir mon no_proxy sur liste blanche AWS avant de pouvoir tout faire fonctionner. Vous pouvez également le définir dans votre script bash si vous ne voulez pas confondre votre code Python avec les paramètres os.
Python:
import os
os.environ["NO_PROXY"] = "s3.amazonaws.com"
Frapper:
no_proxy = "s3.amazonaws.com"
Ces instructions concernent les machines Windows avec un seul profil utilisateur pour AWS. Assurez-vous que votre fichier ~/.aws/credentials
ressemble à ceci
[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey
Je devais définir la variable AWS_DEFAULT_PROFILE
environment à profile_name
trouvée dans vos informations d'identification.
Ensuite, mon python a pu se connecter. par exemple de 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)
Si vous êtes sûr de configurer votre aws correctement, assurez-vous que l'utilisateur du projet peut lire à partir de ./aws ou simplement exécuter votre projet en tant que racine.
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 credentials
et config
.
Vous voudrez peut-être vérifier l'ordre général dans lequel boto3 recherche les informations d'identification dans ce lien . Recherchez sous le sous-titre Configuration des informations d'identification.
Si vous avez plusieurs profils aws dans ~/.aws/credentials
comme ...
[Profile 1]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
[Profile 2]
aws_access_key_id = *******************
aws_secret_access_key = ******************************************
Suivez deux étapes:
Choisissez celui que vous voulez utiliser par défaut en utilisant la commande export AWS_DEFAULT_PROFILE=Profile 1
dans le terminal.
Assurez-vous d’exécuter la commande ci-dessus dans le même terminal que celui où vous utilisez boto3 ou ouvrez un éditeur. [Comprenez le scénario suivant]
Scénario:
t1
et t2
.t1
et ouvrez JupyterLab ou tout autre élément de t2
, vous obtiendrez NoCredentialsError: Impossible de localiser les informations d'identification error.Solution:
t1
, puis ouvrez JupyterLab ou tout autre appareil du même terminal t1
.J'ai également eu le même problème, il peut être résolu en créant un fichier de configuration et des informations d'identification dans le répertoire de base. 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
Ensuite, créez le fichier d'informations d'identification:
touch ~/.aws/credentials
Puis entrez 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 se connecter au compartiment. Exécuter 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: