Mit boto für AWS S3-Buckets für die Signatur-V4
Ich habe ein problem mit der Python-Boto SDK für S3-Buckets für die region Frankfurt. Nach Amazon link dieser region wird nur support V4.
Diese Dokument erläutert, wie V4-Unterstützung für Boto SDK.
Ich habe eine neue Sektion Hinzugefügt:
if not boto.config.get('s3', 'use-sigv4'):
boto.config.add_section('s3')
boto.config.set('s3', 'use-sigv4', 'True')
und dann habe ich eine neue Verbindung erstellt und habe alle Eimer:
connection = S3Connection(accesskey, secretkey, host=S3Connection.DefaultHost)
buckets = connection.get_all_buckets()
funktioniert es einwandfrei, aber dann habe ich versucht, alle Schlüssel in meinem Eimer:
for bucket in buckets:
bucket.get_all_keys()
und ich bekam die folgende:
S3ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-central-1'</Message><Region>eu-central-1</Region>
Warum geschah es?
Danach habe ich mich der region verbunden und haben alle benötigten Daten:
region_con = boto.s3.connect_to_region('eu-central-1', aws_access_key_id=accesskey, aws_secret_access_key=secretkey)
bucket = region_con.get_bucket(bucket.name)
bucket.get_all_keys()
Wie kann ich es beheben richtig?
- Was passiert, wenn Sie tatsächlich Veränderungen in Ihrem boto config-Datei, anstatt zu versuchen, es zu tun programmgesteuert?
- Ja, ich habe versucht es vor, bekam aber das gleiche Ergebnis. Welchen Unterschied sollte Ihr Konzept haben?
- Wohl keiner, aber Sie ändern nur den Wert der in-memory-Konfiguration in Ihrer Umgebung. Wenn ein anderes config wurde erstellt irgendwo sonst wäre es nicht die updates, denn es würde das Lesen der config direkt aus der config-Datei. Ich fragte mich nur, ob das irgendeinen Unterschied machen würde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche Problem mit Boto. Die region war in Frankfurt und habe Fehler über falsche Regionen. Die Lösung war für mich nur zu Punkt a host (eine URI hat von dieser Seite http://docs.aws.amazon.com/general/latest/gr/rande.html) zu 's3.eu-central-1.amazonaws.com' anstelle von Standard - 's3.amazonaws.com'
Versuchen, entfernen s3 von boto config, folgender code funktioniert bei mir
if 's3' in boto.config.sections():
boto.config.remove_section('s3')
hsrv die Antwort der oben genannten arbeiten für boto-2. Für
boto3
folgende ist weitgehend äquivalent:Alternativ können Sie die
region
Feld in Ihrer.aws/config
:Dieser legt die Standard-region, können Sie dennoch wählen eine bestimmte region in Python wie oben.
Die Bedeutung der region variiert von service zu service (zum Beispiel, wenn Sie nicht gesessen in einer VPC können Sie auf einem S3-bucket von überall). In diesem Fall ist aber die wichtigste Sache ist, dass neuere Regionen (z.B. Frankfurt) unterstützen nur die neueren Authentifizierungsschema (AWS4-HMAC-SHA256). Boto läuft in Probleme, wenn Sie versuchen, eine Verbindung zu etwas in so einer region, aus einer region, die noch mit dem alten Schema (z.B. Dublin).
für boto2 -- das hinzufügen dieser auf die .boto config gearbeitet