webentwicklung-frage-antwort-db.com.de

Warum sind keine Amazon S3-Authentifizierungshandler bereit?

Ich habe meine Umgebungsvariablen "$ AWS_ACCESS_KEY_ID" und "$ AWS_SECRET_ACCESS_KEY" ordnungsgemäß festgelegt und führe diesen Code aus:

import boto
conn = boto.connect_s3()

und erhalte diesen Fehler:

boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']

Was ist los? Ich weiß nicht, wo ich mit dem Debuggen anfangen soll.


Es scheint, dass boto die Werte nicht aus meinen Umgebungsvariablen bezieht. Wenn ich die Schlüssel-ID und den geheimen Schlüssel als Argumente an den Verbindungskonstruktor übergeben, funktioniert dies einwandfrei.

43
user334856

Boto wird nimmt Ihre Anmeldeinformationen aus den Umgebungsvariablen. Ich habe dies mit V2.0b3 getestet und es funktioniert gut. Berechtigungsnachweise, die explizit im Konstruktor angegeben werden, werden Vorrang eingeräumt, sie werden jedoch auch aus den Umgebungsvariablen übernommen.

Am einfachsten ist es, wenn Sie Ihre Anmeldeinformationen in eine Textdatei einfügen und den Speicherort dieser Datei in der Umgebung angeben.

Zum Beispiel (unter Windows: Ich gehe davon aus, dass es unter Linux genauso funktioniert, aber ich habe das nicht persönlich ausprobiert)

Erstellen Sie eine Datei mit dem Namen "mycred.txt" und legen Sie sie in C:\temp .__ ab. Diese Datei enthält zwei Zeilen:

AWSAccessKeyId=<your access id>
AWSSecretKey=<your secret key>

Definieren Sie die Umgebungsvariable AWS_CREDENTIAL_FILE , um auf C:\temp\mycred.txt zu zeigen

C:\>SET AWS_CREDENTIAL_FILE=C:\temp\mycred.txt

Nun dein Code-Fragment oben:

import boto
conn = boto.connect_s3()

wird gut funktionieren.

33
liamf

Ich bin ein Neuling sowohl für Python als auch für Boto, konnte jedoch Ihren Fehler (oder zumindest die letzte Zeile Ihres Fehlers) reproduzieren.

Sie können Ihre Variablen wahrscheinlich nicht in Bash exportieren. Wenn Sie nur dann definieren, sind sie nur in der aktuellen Shell gültig, exportieren Sie sie und Python erbt den Wert. Somit:

$ AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

funktioniert nicht, wenn Sie auch Folgendes hinzufügen:

$ export AWS_ACCESS_KEY_ID

Oder Sie können alles in einer Zeile erledigen:

$ export AWS_ACCESS_KEY_ID="SDFGRVWGFVVDWSFGWERGBSDER"

Ebenso für den anderen Wert. Sie können dies auch in Ihre .bashrc einfügen (vorausgesetzt, bash ist Ihre Shell und vorausgesetzt, Sie erinnern sich an den Export).

13
OpenID-test2

Folgen Sie der Antwort von nealmcb zu IAM-Rollen. Bei der Bereitstellung von EMR-Clustern mit einer IAM-Rolle hatte ich ein ähnliches Problem, bei dem dieser Fehler (nicht jedes Mal) auftrat, wenn boto mit s3 verbunden wurde.

boto.exception.NoAuthHandlerFound: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler']

Der Metadaten-Service kann beim Abrufen von Anmeldeinformationen ein Zeitlimit überschreiten. Wie aus den Dokumenten hervorgeht, habe ich in der Konfiguration einen Boto-Abschnitt hinzugefügt und die Anzahl der Wiederholungsversuche zum Abrufen der Berechtigungsnachweise erhöht. Beachten Sie, dass der Standardwert 1 Versuch ist.

import boto, ConfigParser
try:
    boto.config.add_section("Boto")
except ConfigParser.DuplicateSectionError:
    pass
boto.config.set("Boto", "metadata_service_num_attempts", "20")

http://boto.readthedocs.org/de/latest/boto_config_tut.html?highlight=retries#boto

Scrollen Sie nach unten zu: You can control the timeouts and number of retries used when retrieving information from the Metadata Service (this is used for retrieving credentials for IAM roles on EC2 instances)

9
dyltini

Ich bin gerade auf dieses Problem gestoßen, als ich Linux und SES verwendet habe, und ich hoffe, es kann anderen bei einem ähnlichen Problem helfen. Ich hatte awscli installiert und meine Schlüssel dabei konfiguriert:

Sudo apt-get install awscli
aws configure

Dies wird verwendet, um Ihre Anmeldeinformationen in ~/.aws/config genau wie @huythang einzurichten. Aber boto sucht nach deinen Anmeldeinformationen in ~/.aws/credentials kopiert sie also

cp ~/.aws/config ~/.aws/credentials

Angenommen, eine geeignete Richtlinie wird für Ihren Benutzer mit diesen Anmeldeinformationen eingerichtet. Sie sollten keine Umgebungsvariablen festlegen müssen.

8
Gavin Palmer

Ich habe meine Antwort gefunden hier .

Unter Unix: erstelle aws config:

#vim ~/.aws/config
[default]
region = Tokyo
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxx

Und Umgebungsvariablen setzen

export AWS_ACCESS_KEY_ID="aws_access_key_id"
export AWS_SECRET_ACCESS_KEY="aws_secret_access_key"
3
huythang

Siehe neueste boto s3 Einführung :

from boto.s3.connection import S3Connection
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
3
Bijan

In meinem Fall bestand das Problem darin, dass in IAM "Benutzer standardmäßig keine Berechtigungen haben". Ich habe den ganzen Tag gebraucht, um das aufzuspüren, da ich an das ursprüngliche AWS-Authentifizierungsmodell (pre-iam) gewöhnt war, bei dem die sogenannten "root" -Anmeldeinformationen der einzige Weg waren.

Es gibt viele AWS-Dokumente zum Erstellen von Benutzern, aber nur an einigen Stellen, an denen sie feststellen, dass Sie ihnen Berechtigungen erteilen müssen, damit sie etwas tun können. Eines ist Arbeiten mit Amazon S3-Buckets - Amazon Simple Storage Service , aber es wird nicht einfach nur gesagt, dass Sie zur Registerkarte Richtlinien gehen, eine gute Startrichtlinie vorschlagen und erklären, wie sie angewendet wird.

Der Assistent ermutigt Sie einfach zu "Erste Schritte mit IAM-Benutzern" und stellt nicht klar, dass noch viel mehr zu tun ist. Selbst wenn Sie ein bisschen herumstochern, sehen Sie nur z. "Verwaltete Richtlinien Dem Benutzer sind keine verwalteten Richtlinien zugeordnet." was nicht bedeutet, dass Sie eine Richtlinie benötigen, um irgendetwas zu tun.

Informationen zum Einrichten eines root-ähnlichen Benutzers finden Sie unter: Erstellen einer Administratorgruppe mit der Konsole - AWS Identity and Access Management

Ich sehe keine spezifische Richtlinie, die einfach nur Lesezugriff auf alle S3 (meine eigenen Eimer sowie öffentliche Eigner anderer) erlaubt.

2
nealmcb

Sie können diese jetzt als Argumente im Aufruf der connect-Funktion festlegen.

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

Ich dachte nur, ich würde das hinzufügen, falls jemand anderes gesucht hätte wie ich.

1
The_Cthulhu_Kid

Ich hatte vorher s3-parallel-put erfolgreich verwendet, aber es funktionierte unerklärlicherweise nicht mehr und gab den obigen Fehler aus. Dies trotz des Exports von AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY.

Die Lösung bestand darin, die Anmeldeinformationen in der Konfigurationsdatei von boto anzugeben:

$ nano ~/.boto

Geben Sie die Anmeldeinformationen wie folgt ein:

[Credentials]
aws_access_key_id = KEY_ID
aws_secret_access_key = SECRET_ACCESS_KEY
1
KalenGi

Ich hatte dieses Problem mit einer Kolbenanwendung auf ec2. Ich wollte keine Anmeldeinformationen in die Anwendung einfügen, verwaltete jedoch die Berechtigung über IAM-Rollen. Auf diese Weise können hartcodierte Schlüssel im Code vermieden werden. Dann habe ich eine Richtlinie in der AWS-Konsole festgelegt (ich habe sie nicht einmal programmiert, ich habe nur den Richtliniengenerator verwendet)

Mein Code ist genau wie bei OPs. Die anderen Lösungen hier sind gut, aber es gibt eine Möglichkeit, große Erlaubnis ohne hartcodierende Zugangsschlüssel zu erhalten.

  1. Erstellen Sie eine IAM-Sicherheitsgruppe, die Zugriff auf die S3-Ressource gewährt
  2. Vergeben Sie die Richtlinie an die EC2-Instanz
  3. Verbinden Sie sich mit nichts als boto.connect_s3() #no Schlüsseln
0
billmanH

Beim Mac muss der Schlüsselexport folgendermaßen aussehen: key=value. Der Export von AWS_ACCESS_KEY_ID environment var sollte also folgendermaßen aussehen: AWS_ACCESS_KEY_ID=yourkey. Wenn Sie, wie in den obigen Antworten erwähnt, Zitate um Ihre Werte haben, gibt boto den oben genannten Fehler aus. 

0
C0D3LIC1OU5