Boto3-Fehler: botocore.exceptions.NoCredentialsError: Anmeldeinformationen konnten nicht gefunden werden

112

Wenn ich einfach den folgenden Code ausführe, wird immer dieser Fehler angezeigt.

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)

Ich habe meine Anmeldeinformationsdatei in gespeichert

C:\Users\myname\.aws\credentials, von wo aus Boto meine Anmeldeinformationen lesen sollte.

Ist meine Einstellung falsch?

Hier ist die Ausgabe von 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
quelle
1
Können Sie die Debug-Ausgabe veröffentlichen, indem Sie sie boto3.set_stream_logger('botocore', level='DEBUG')vor Ihrem Code hinzufügen ? Es wird angezeigt, wo nach Anmeldeinformationen gesucht wird.
Jamesls
Es scheint, dass Boto nach ziemlich wenigen Speicherorten für die Konfigurationsdatei für Anmeldeinformationen sucht, aber anscheinend aus irgendeinem Grund nicht in mein Home-Verzeichnis schaut ...
d -_- b
2
Versuchen Sie, die Umgebungsvariable so einzustellen HOME, dass sie auf Ihre Anmeldeinformationsdatei verweist , C:\Users\mynameoder AWS_SHARED_CREDENTIALS_FILEdirekt darauf.
Garnaat
Ich habe die env-Variable HOME wie von Ihnen beschrieben festgelegt, erhalte jetzt jedoch den folgenden Fehler. botocore.exceptions.NoRegionError: You must specify a region. * Meine Konfigurationsdatei ↓ befindet sich im selben Ordner wie meine Anmeldeinformationen. [default] ap-northeast-1
d -_- b
1
Ich konnte das Problem mit Garnaats Kommentar beheben .
LaundroMat

Antworten:

93

Versuchen Sie, die Schlüssel manuell anzugeben

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

Stellen Sie sicher, dass Sie Ihre ACCESS_ID und ACCESS_KEY aus Sicherheitsgründen nicht direkt in den Code aufnehmen. Erwägen Sie die Verwendung von Umgebungskonfigurationen und deren Einfügung in den von @Tiger_Mike vorgeschlagenen Code.

Verwenden Sie für Prod-Umgebungen rotierende Zugriffsschlüssel: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey

SHASHANK MADHAV
quelle
Diese Methode ist nützlich, wenn Sie direkt auf Django arbeiten. Danke.
Joepreludian
1
Dies ist gefährlicher, da Sie Ihre Geheimnisse in Ihren Code einfügen, was zur Versionskontrolle führen kann.
Nu Everest
4
@nueverest Dies ist korrekt, aber Sie können dies vermeiden, indem Sie die Deklaration in eine Einstellungsdatei verschieben und dann über Umgebungsvariablen injizieren.
Tiger_Mike
Obwohl dies funktioniert, würde ich sagen, dass es nicht den Best Practices folgt.
Ben Jarman
1
Vielen Dank. Dies kann als temporärer Fix im Dev-Setup verwendet werden. Das Laden dieser Variablen aus einer .envDatei (nicht festgeschrieben) wäre ideal und besser, als aus einem ~/.aws/Ordner auswählen zu müssen .
SuperNova
56

Ich hatte das gleiche Problem und stellte fest, dass das Format meiner ~/.aws/credentialsDatei falsch war.

Es funktionierte mit einer Datei, die Folgendes enthielt:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

Beachten Sie, dass der Profilname " [default]" sein muss. Einige offizielle Unterlagen verweisen auf ein Profil mit dem Namen " [credentials]", das bei mir nicht funktioniert hat.

Fernando Ciciliati
quelle
1
Funktioniert auch unter Windows (C: \ Users \ User \ .aws \ credentials)
Mr_and_Mrs_D
4
Sie können angeben, welches Profil in boto3 verwendet werden soll, indem Sie session = boto3.Session (profile_name = <Ihr_Profil>) verwenden
Mattia Paterna
Die Verwendung aws configurefunktioniert auch, wenn Sie aws-cli installiert haben
radtek
2
Ich habe es über ansible ausgeführt. Eine andere Sache, nach der Sie suchen müssen, ist, wenn Sie während der Ausführung des Befehls ein anderer Benutzer werden. Stellen Sie sicher, dass Sie dies beispielsweise nicht mit 'sudo' tun. Andernfalls wird versucht, stattdessen auf die Anmeldeinformationen von root aws zuzugreifen, und es schlägt fehl, wenn diese nicht vorhanden sind.
Radtek
28

Wenn Sie nach einer alternativen Möglichkeit suchen, versuchen Sie, Ihre Anmeldeinformationen mithilfe von AmazonCLI hinzuzufügen

vom Terminaltyp: -

aws configure

Geben Sie dann Ihre Schlüssel und Ihre Region ein.

Amri
quelle
17

Stellen Sie sicher, dass Ihre Datei ~ / .aws / credentials unter Unix folgendermaßen aussieht:

[MyProfile1]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

[MyProfile2]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Ihr Python-Skript sollte so aussehen und es wird funktionieren:

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

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

TheWalkingData
quelle
1
Das wird output = jsonnormalerweise ~/.aws/configin einem [profile MyProfile1]Abschnitt platziert. Es funktioniert möglicherweise nicht, wenn es credentialsstattdessen in der Datei angegeben wird.
cjs
@Curt J. Sampson Ohne zu überprüfen, bin ich sicher, dass Sie Recht haben. Danke für die Korrektur.
TheWalkingData
Ich habe AWS_PROFILE = myprofle exportiert und es hat nicht funktioniert, aber das hat funktioniert. Jede Erklärung, warum das passieren könnte.
Adarsh ​​Trivedi
5

Diese Anweisungen gelten für Windows-Computer mit einem einzelnen Benutzerprofil für AWS. Stellen Sie sicher, dass Ihre ~/.aws/credentialsDatei so aussieht

[profile_name]
aws_access_key_id = yourAccessId
aws_secret_access_key = yourSecretKey

Ich musste die AWS_DEFAULT_PROFILEUmgebungsvariable so einstellen , dass profile_namesie in Ihren Anmeldeinformationen gefunden wurde.
Dann konnte sich mein Python verbinden. zB von hier

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
quelle
1
Wenn Sie die Umgebungsvariable unter Win10 im Abschnitt "Computer" festlegen, müssen Sie wahrscheinlich auch einen Neustart durchführen.
Trevor
1
@ Trevor, ich habe dies auf einem Windows 7-Computer mit Jupyter-Notebook getestet. Ich musste den Jupyter-Server neu starten und es hat bei mir funktioniert, aber ich denke, ein Neustart wäre eine gute Idee.
Hrushikesh Dhumal
5

Ich hatte auch das gleiche Problem, es kann gelöst werden, indem eine Konfigurations- und Anmeldeinformationsdatei im Home-Verzeichnis erstellt wird. Unten sehen Sie die Schritte, die ich zur Lösung dieses Problems unternommen habe.

Erstellen Sie eine Konfigurationsdatei:

touch ~/.aws/config

Und in dieser Datei habe ich die Region eingegeben

[default]
region = us-west-2

Erstellen Sie dann die Anmeldeinformationsdatei:

touch ~/.aws/credentials

Geben Sie dann Ihre Anmeldeinformationen ein

[Profile1]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Nachdem Sie alle diese eingestellt haben, dann meine Python-Datei, um Bucket zu verbinden. Wenn Sie diese Datei ausführen, werden alle Inhalte aufgelistet.

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)

Sie können auch auf die folgenden Links verweisen:

Nija I Pillai
quelle
4

vom Terminaltyp: -

aws configure

Geben Sie dann Ihre Schlüssel und Ihre Region ein.

Verwenden Sie danach im nächsten Schritt eine beliebige Umgebung. Abhängig von Ihrem Konto können Sie mehrere Schlüssel haben. Kann mehrere Umgebungen oder Schlüssel verwalten

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

Ich arbeite für ein großes Unternehmen und bin auf denselben Fehler gestoßen, brauchte aber eine andere Lösung. Mein Problem hing mit den Proxy-Einstellungen zusammen. Ich hatte meinen Proxy eingerichtet, also musste ich meinen no_proxy auf Whitelist AWS setzen, bevor ich alles zum Laufen bringen konnte. Sie können es auch in Ihrem Bash-Skript festlegen, wenn Sie Ihren Python-Code nicht mit den OS-Einstellungen durcheinander bringen möchten.

Python:

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

Bash:

export no_proxy = "s3.amazonaws.com"

Bearbeiten: Die oben genannten nehmen eine Region US East S3 an. Für andere Regionen: Verwenden Sie s3. [Region] .amazonaws.com, wobei region so etwas wie us-east-1 oder us-west-2 ist

JJFord3
quelle
2
Ich hatte ein ähnliches Problem - aber zu sagen hatte , no_proxyfür 169.254.169.254so , dass der AWS - Client an den Metadatendienst bekommen konnte das Instanzprofil zu finden.
Ralph Bolton
0

Der boto3 sucht nach den Anmeldeinformationen im Ordner wie

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

Sie sollten zwei Dateien in diesem Ordner speichern credentialsundconfig .

Vielleicht möchten Sie die allgemeine Reihenfolge überprüfen, in der boto3 unter diesem Link nach Anmeldeinformationen sucht . Schauen Sie unter der Unterüberschrift Configuring Credentials nach.

Samuel Nde
quelle
0

Wenn Sie sicher sind, dass Sie Ihre aws richtig konfigurieren, stellen Sie einfach sicher, dass der Benutzer des Projekts aus ./aws lesen kann, oder führen Sie Ihr Projekt einfach als Root aus

Mohamed Hamed
quelle
0

Wenn Sie mehrere aws-Profile in ~/.aws/credentialswie ...

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

Befolgen Sie zwei Schritte:

  1. Erstellen Sie mit dem export AWS_DEFAULT_PROFILE=Profile 1Befehl im Terminal einen Befehl, den Sie standardmäßig verwenden möchten .

  2. Stellen Sie sicher, dass Sie den obigen Befehl im selben Terminal ausführen, von dem aus Sie boto3 verwenden, oder öffnen Sie einen Editor. [Verstehen Sie das folgende Szenario]

Szenario:

  • Wenn Sie zwei offene Terminals haben, rufen Sie t1und an t2.
  • t1Wenn Sie den Exportbefehl in ausführen und JupyterLab oder einen anderen Befehl öffnen t2, wird NoCredentialsError angezeigt: Fehler beim Anmelden der Anmeldeinformationen nicht möglich.

Lösung:

  • Führen Sie den Exportbefehl in aus t1und öffnen Sie JupyterLab oder ein anderes über dasselbe Terminal t1.
Sanket Patel
quelle