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.
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.
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).
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)
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.
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"
Siehe neueste boto s3 Einführung :
from boto.s3.connection import S3Connection
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
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.
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.
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
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.
boto.connect_s3()
#no SchlüsselnBeim 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.