Errore Boto3: botocore.exceptions.NoCredentialsError: impossibile individuare le credenziali


112

Quando eseguo semplicemente il codice seguente, ottengo sempre questo errore.

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)

Ho salvato il mio file delle credenziali in formato

C:\Users\myname\.aws\credentials, da dove Boto dovrebbe leggere le mie credenziali.

La mia impostazione è sbagliata?

Ecco l'output di 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

1
Puoi pubblicare l'output di debug aggiungendo boto3.set_stream_logger('botocore', level='DEBUG')prima del codice? Mostrerà dove sta cercando le credenziali.
jamesls

sembra che Boto cerchi un bel po 'di posizioni per il file di configurazione delle credenziali, ma a quanto pare non guarda nella mia home directory per qualche motivo ...
d -_- b

2
Prova a impostare la variabile di ambiente HOMEin modo che punti C:\Users\mynameo AWS_SHARED_CREDENTIALS_FILEa fare riferimento direttamente al file delle credenziali.
Garnaat

Ho impostato la variabile env HOME come descritto, ma ora ricevo il seguente errore. botocore.exceptions.NoRegionError: You must specify a region. * il mio file di configurazione ↓ si trova nella stessa cartella delle mie credentails. [default] ap-northeast-1
d -_- b

1
Sono stato in grado di risolvere il problema utilizzando il commento di Garnaat .
LaundroMat

Risposte:


94

prova a specificare le chiavi manualmente

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

Assicurati di non includere il tuo ACCESS_ID e ACCESS_KEY nel codice direttamente per motivi di sicurezza. Considera l'idea di utilizzare configurazioni di ambiente e di inserirle nel codice come suggerito da @Tiger_Mike.

Per gli ambienti Prod, considera l'utilizzo di chiavi di accesso rotanti: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey


In questo modo è utile quando si maneggia direttamente su Django. Grazie.
Joepreludian

1
Questo è più pericoloso in quanto stai inserendo i tuoi segreti nel tuo codice che potrebbero finire nel controllo della versione.
nu everest

4
@nueverest Questo è corretto, ma puoi evitarlo spostando la dichiarazione in un file di impostazioni e quindi iniettando tramite variabili d'ambiente.
Tiger_Mike

Sebbene funzioni, direi che non sta seguendo le migliori pratiche.
ben jarman

1
Grazie. Questo può essere utilizzato come correzione temporanea nella configurazione dello sviluppatore. Il caricamento di queste variabili da un .envfile (non eseguito il commit) sarebbe l'ideale e sarebbe meglio che dover selezionare dalla ~/.aws/cartella.
SuperNova

56

Ho avuto lo stesso problema e ho scoperto che il formato del mio ~/.aws/credentialsfile era sbagliato.

Ha funzionato con un file contenente:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Tieni presente che il nome del profilo deve essere " [default]". Alcuni documenti ufficiali fanno riferimento a un profilo denominato " [credentials]", che non ha funzionato per me.


1
Funziona anche su Windows (C: \ Users \ User \ .aws \ credentials)
Mr_and_Mrs_D

4
puoi specificare quale profilo usare in boto3 usando session = boto3.Session (profile_name = <your_profile>)
Mattia Paterna

L'utilizzo aws configurefunziona anche se hai installato aws-cli
radtek

2
Lo stavo eseguendo tramite ansible, quindi un'altra cosa da cercare è se diventi un utente diverso durante l'esecuzione del comando. Assicurati di non farlo con 'sudo', ad esempio, altrimenti tenterà di accedere alle credenziali di root aws e fallirà se non esistono.
radtek

28

Se stai cercando un modo alternativo, prova ad aggiungere le tue credenziali utilizzando AmazonCLI

dal tipo di terminale: -

aws configure

quindi inserisci le tue chiavi e la tua regione.


17

Assicurati che il tuo file ~ / .aws / credentials in Unix sia simile a questo:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Il tuo script Python dovrebbe assomigliare a questo e funzionerà:

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'])

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


1
L' output = jsonnormalmente viene posto nella ~/.aws/configin una [profile MyProfile1]sezione. Potrebbe non funzionare se specificato nel credentialsfile.
cjs

@Curt J. Sampson Senza controllare, sono sicuro che hai ragione. Grazie per la correzione.
TheWalkingData

Ho esportato AWS_PROFILE = myprofle e non ha funzionato ma ha funzionato. Qualsiasi spiegazione sul motivo per cui potrebbe accadere.
Adarsh ​​Trivedi

5

Queste istruzioni sono per macchine Windows con un unico profilo utente per AWS. Assicurati che il tuo ~/.aws/credentialsfile abbia questo aspetto

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Ho dovuto impostare la AWS_DEFAULT_PROFILEvariabile d'ambiente da profile_nametrovare nelle tue credenziali.
Quindi il mio pitone è stato in grado di connettersi. ad esempio da qui

import boto3

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

# Print out bucket names
for bucket in s3.buckets.all():
    print(bucket.name)

1
Se imposti la variabile d'ambiente su Win10 nella sezione macchina, probabilmente dovrai anche riavviare.
Trevor

1
@Trevor, l'ho testato su una macchina Windows 7 con notebook Jupyter, ho dovuto riavviare il server Jupyter e ha funzionato per me, ma penso che il riavvio sarebbe una buona idea.
Hrushikesh Dhumal,

5

Ho anche avuto lo stesso problema, può essere risolto creando un file di configurazione e credenziali nella directory home. Di seguito vengono mostrati i passaggi che ho eseguito per risolvere questo problema.

Crea un file di configurazione:

touch ~/.aws/config

E in quel file sono entrato nella regione

[default]
region = us-west-2

Quindi crea il file delle credenziali:

touch ~/.aws/credentials

Quindi inserisci le tue credenziali

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Dopo aver impostato tutti questi, quindi il mio file python per connettere il bucket. Esegui questo file elencherà tutti i contenuti.

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)

Puoi anche fare riferimento ai link seguenti:


4

dal tipo di terminale: -

aws configure

quindi inserisci le tue chiavi e la tua regione.

dopo questo, eseguire il passaggio successivo utilizzare qualsiasi ambiente. Puoi avere più chiavi a seconda del tuo account. Può gestire più ambienti o chiavi

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

2

Lavoro per una grande azienda e ho riscontrato lo stesso errore, ma avevo bisogno di un lavoro diverso. Il mio problema era correlato alle impostazioni del proxy. Avevo configurato il mio proxy, quindi dovevo impostare il mio no_proxy per autorizzare AWS prima di poter far funzionare tutto. Puoi impostarlo anche nel tuo script bash se non vuoi confondere il tuo codice Python con le impostazioni del sistema operativo.

Pitone:

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

bash:

export no_proxy = "s3.amazonaws.com"

Modifica: quanto sopra presuppone una regione S3 degli Stati Uniti orientali. Per altre regioni: utilizza s3. [Region] .amazonaws.com dove region è qualcosa come us-east-1 o us-west-2


2
Ho avuto un problema simile - ma ha dovuto dire no_proxyper 169.254.169.254modo che il cliente AWS potrebbe ottenere al servizio metadati per trovare il profilo istanza.
Ralph Bolton

0

Il boto3 sta cercando le credenziali nella cartella come

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

Dovresti salvare due file in questa cartella credentialse config.

Potresti voler controllare l'ordine generale in cui boto3 cerca le credenziali in questo link . Guarda sotto il sottotitolo Configurazione delle credenziali .


0

Se sei sicuro di aver configurato correttamente il tuo aws, assicurati che l'utente del progetto possa leggere da ./aws o semplicemente eseguire il tuo progetto come root


0

Se hai più profili aws in ~/.aws/credentialscome ...

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

Segui due passaggi:

  1. Creane uno che desideri utilizzare come predefinito utilizzando il export AWS_DEFAULT_PROFILE=Profile 1comando nel terminale.

  2. Assicurati di eseguire il comando precedente nello stesso terminale da cui usi boto3 o apri un editor. [Comprendi il seguente scenario]

Scenario:

  • Se hai due terminali aperti chiamati t1e t2.
  • E esegui il comando di esportazione t1e apri JupyterLab o qualsiasi altro da t2, otterrai NoCredentialsError: Impossibile individuare l' errore delle credenziali .

Soluzione:

  • Esegui il comando di esportazione t1e quindi apri JupyterLab o qualsiasi altro dallo stesso terminale t1.

0

Crea un oggetto client S3 con le tue credenziali

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)

È sempre utile ottenere le credenziali dall'ambiente del sistema operativo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.