Błąd Boto3: botocore.exceptions.NoCredentialsError: Nie można zlokalizować poświadczeń


113

Kiedy po prostu uruchamiam następujący kod, zawsze pojawia się ten błąd.

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)

Zapisałem plik poświadczeń w

C:\Users\myname\.aws\credentials, skąd Boto powinien przeczytać moje referencje.

Czy moje ustawienie jest złe?

Oto wynik z 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
Czy możesz opublikować dane wyjściowe debugowania, dodając je boto3.set_stream_logger('botocore', level='DEBUG')przed kodem? Pokaże, gdzie szuka poświadczeń.
jamesls

wygląda na to, że Boto szuka kilku lokalizacji dla pliku konfiguracyjnego poświadczeń, ale najwyraźniej z jakiegoś powodu nie zagląda do mojego katalogu domowego ...
d -_- b

2
Spróbuj ustawić zmienną środowiskową tak, HOMEaby wskazywała C:\Users\mynamelub ustaw, AWS_SHARED_CREDENTIALS_FILEaby wskazywała bezpośrednio na plik poświadczeń.
garnaat

Ustawiłem zmienną env HOME zgodnie z opisem, ale teraz pojawia się następujący błąd. botocore.exceptions.NoRegionError: You must specify a region. * mój plik konfiguracyjny ↓ znajduje się w tym samym folderze co moje referencje. [default] ap-northeast-1
d -_- b

1
Udało mi się rozwiązać problem, korzystając z komentarza garnaata .
LaundroMat

Odpowiedzi:


93

spróbuj ręcznie określić klucze

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

Upewnij się, że nie podajesz ACCESS_ID i ACCESS_KEY bezpośrednio w kodzie ze względów bezpieczeństwa. Rozważ użycie konfiguracji środowiska i wstrzyknięcie ich do kodu zgodnie z sugestią @Tiger_Mike.

W przypadku środowisk Prod rozważ użycie obrotowych kluczy dostępu: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey


Ten sposób jest przydatny podczas obsługi bezpośrednio w Django. Dziękuję Ci.
Joepreludian

1
Jest to bardziej niebezpieczne, ponieważ umieszczasz swoje sekrety w kodzie, co może skończyć się kontrolą wersji.
nu everest

5
@nueverest To jest poprawne, ale możesz tego uniknąć, przenosząc deklarację do pliku ustawień, a następnie wstrzykując ją za pomocą zmiennych środowiskowych.
Tiger_Mike

Chociaż to działa, powiedziałbym, że nie jest zgodne z najlepszymi praktykami.
Ben Jarman

1
Dzięki. Może to służyć jako tymczasowa poprawka w konfiguracji dewelopera. Załadowanie tych zmiennych z .envpliku (niezatwierdzone) byłoby idealne i byłoby lepsze niż konieczność wybierania z ~/.aws/folderu.
SuperNova

56

Miałem ten sam problem i okazało się, że format mojego ~/.aws/credentialspliku jest nieprawidłowy.

Działało z plikiem zawierającym:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Pamiętaj, że nazwa profilu musi mieć postać „ [default]”. Niektóre oficjalne dokumenty odnoszą się do profilu o nazwie „ [credentials]”, który dla mnie nie działał.


1
Działa również w systemie Windows (C: \ Users \ User \ .aws \ credentials)
Mr_and_Mrs_D

4
możesz określić, który profil ma być używany w boto3 za pomocą session = boto3.Session (profile_name = <your_profile>)
Mattia Paterna

Używanie aws configuredziała również, jeśli masz zainstalowany aws-cli
radtek

2
Uruchamiałem go przez ansible, więc inną rzeczą, na którą należy zwrócić uwagę, jest to, czy podczas wykonywania polecenia zostaniesz innym użytkownikiem. Upewnij się, że nie robisz tego za pomocą na przykład „sudo”, w przeciwnym razie spróbuje uzyskać dostęp do poświadczeń root aws i zakończy się niepowodzeniem, jeśli nie istnieją.
radtek

28

Jeśli szukasz alternatywnego sposobu, spróbuj dodać swoje poświadczenia za pomocą AmazonCLI

od typu terminala: -

aws configure

następnie wprowadź swoje klucze i region.


17

Upewnij się, że plik ~ / .aws / credentials w systemie Unix wygląda następująco:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Twój skrypt w Pythonie powinien wyglądać następująco i będzie działać:

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

Źródło: https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration .


1
output = jsonJest zazwyczaj umieszczony w ~/.aws/configw [profile MyProfile1]przekroju. Może nie działać, jeśli zostanie określony w credentialspliku.
cjs

@Curt J. Sampson Bez sprawdzania, jestem pewien, że masz rację. Dziękuję za poprawienie mnie.
TheWalkingData

Wyeksportowałem AWS_PROFILE = myprofle i to nie zadziałało, ale zadziałało. Wszelkie wyjaśnienia, dlaczego tak się dzieje.
Adarsh ​​Trivedi

5

Te instrukcje dotyczą komputerów z systemem Windows z pojedynczym profilem użytkownika dla AWS. Upewnij się, że ~/.aws/credentialsplik wygląda tak

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Musiałem ustawić AWS_DEFAULT_PROFILEzmienną środowiskową, aby profile_nameznaleźć się w twoich poświadczeniach.
Wtedy mój Python był w stanie się połączyć. np. stąd

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
Jeśli ustawisz zmienną środowiskową na Win10 w sekcji maszyny, prawdopodobnie będziesz musiał również wykonać restart.
Trevor

1
@Trevor, przetestowałem to na komputerze z systemem Windows 7 z notebookiem Jupyter, musiałem zrestartować serwer Jupyter i zadziałało dla mnie, ale myślę, że ponowne uruchomienie byłoby dobrym pomysłem.
Hrushikesh Dhumal

5

Miałem również ten sam problem, można go rozwiązać, tworząc plik konfiguracyjny i poświadczający w katalogu domowym. Poniżej przedstawiam kroki, które wykonałem, aby rozwiązać ten problem.

Utwórz plik konfiguracyjny:

touch ~/.aws/config

I w tym pliku wszedłem do regionu

[default]
region = us-west-2

Następnie utwórz plik poświadczeń:

touch ~/.aws/credentials

Następnie wprowadź swoje poświadczenia

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Po ustawieniu tego wszystkiego, mój plik Pythona do podłączenia wiadra. Uruchomienie tego pliku spowoduje wyświetlenie całej zawartości.

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)

Możesz również skorzystać z poniższych linków:


4

od typu terminala: -

aws configure

następnie wprowadź swoje klucze i region.

po tym wykonaj następny krok w dowolnym środowisku. W zależności od konta możesz mieć wiele kluczy. Może zarządzać wieloma środowiskami lub kluczami

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

2

Pracuję dla dużej korporacji i napotkałem ten sam błąd, ale potrzebowałem innego rozwiązania. Mój problem był związany z ustawieniami proxy. Skonfigurowałem serwer proxy, więc musiałem ustawić no_proxy na białą listę AWS, zanim mogłem wszystko uruchomić. Możesz to również ustawić w swoim skrypcie bash, jeśli nie chcesz mylić kodu Pythona z ustawieniami systemu operacyjnego.

Pyton:

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

Grzmotnąć:

export no_proxy = "s3.amazonaws.com"

Edycja: powyżej założono region S3 Wschodnie stany USA. W przypadku innych regionów: użyj s3. [Region] .amazonaws.com, gdzie region to coś w rodzaju us-east-1 lub us-west-2


2
Miałem podobny problem - ale miał do powiedzenia no_proxyna 169.254.169.254tak aby klient mógł dostać się do AWS usługi metadanych znaleźć profil instancji.
Ralph Bolton

0

Boto3 szuka poświadczeń w folderze, takim jak

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

Powinieneś zapisać dwa pliki w tym folderze credentialsiconfig .

Możesz sprawdzić ogólną kolejność, w jakiej boto3 szuka poświadczeń w tym łączu . Zajrzyj do nagłówka podrzędnego Konfigurowanie poświadczeń .


0

Jeśli jesteś pewien, że poprawnie skonfigurowałeś swoje aws, po prostu upewnij się, że użytkownik projektu może czytać z ./aws lub po prostu uruchom swój projekt jako root


0

Jeśli masz wiele profili aws w ~/.aws/credentialstakich jak ...

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

Wykonaj dwa kroki:

  1. Utwórz taki, którego chcesz używać jako domyślnego, używając export AWS_DEFAULT_PROFILE=Profile 1polecenia w terminalu.

  2. Upewnij się, że wykonujesz powyższe polecenie w tym samym terminalu, z którego używasz boto3 lub otwierasz edytor. [Zrozum następujący scenariusz]

Scenariusz:

  • Jeśli masz otwarte dwa terminale, zadzwoń t1 i t2.
  • t1Uruchamiasz polecenie eksportu w i otwierasz JupyterLab lub inny z t2, otrzymasz NoCredentialsError: Unable to locate credentials error.

Rozwiązanie:

  • Uruchom polecenie eksportu w, t1a następnie otwórz JupyterLab lub dowolny inny z tego samego terminala t1.

0

Utwórz obiekt klienta S3 za pomocą swoich poświadczeń

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)

Zawsze dobrze jest uzyskać poświadczenia ze środowiska operacyjnego

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.