2016-05-24 6 views
2

Ich benutze Python und Boto3, um mit S3 zu arbeiten.S3 Key nicht sofort nach der Auflistung

Ich liste ein S3-Bucket und Filterung durch einen Präfix:

bucket = s3.Bucket(config.S3_BUCKET) 
for s3_object in bucket.objects.filter(Prefix="0000-00-00/", Delimiter="/"): 

Das gibt mir eine iterable von S3-Objekten.

Wenn ich das Objekt drucke ich sehen:

s3.ObjectSummary(bucket_name='validation', key=u'0000-00-00/1463665359.Vfc01I205aeM627249')

Wenn ich gehe, um den Körper zu bekommen, obwohl ich eine Ausnahme erhalten:

content = s3_object.get()["Body"].read() 

botocore.exceptions.ClientError: An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.

So Boto gab mir nur den Schlüssel, aber dann sagt es, dass es nicht existiert?

Dies gilt nicht für alle Schlüssel. Nur etwas. Wenn ich in der AWS-Konsole nach dem ungültigen Schlüssel suche, findet er ihn nicht.

Antwort

2

Es kann davon ausgegangen werden, dass Sie den Standardendpunkt verwenden. Dies alles gilt in erster Linie für sie und nicht für die regionalen Endpunkte. S3 ist atomar und eventually consistent. The documentation gives several examples, dies einschließlich:

A process writes a new object to Amazon S3 and immediately lists keys within its bucket. Until the change is fully propagated, the object might not appear in the list.

Gelegentlich Verzögerungen von manyhours gesehen worden, und meine anecdata stimmt this statement, die 99% der Daten innerhalb von 2 Sekunden existiert auch über.

können Sie aktivieren Lesen-nach-Schreib-Konsistenz, die „Korrekturen“ dies, indem Sie Ihre Endpunkt von s3.amazonaws.com zu s3-external-1.amazonaws.com Wechsel:

s3client = boto3.client('s3', endpoint_url='s3-external-1.amazonaws.com') 
+0

Danke für den Tipp auf Lese-nach-Schreiben Konsistenz, dass genau löst mein Problem. – Kong

+2

Kühl. Es ist esoterisch. – tedder42

+0

Beachten Sie, dass neuere Versionen von boto3/botocore auch Unterstützung für 's3-external-1' als Regionsnamen haben, so dass Sie' boto3.client ('s3', region_name = 's3-external-1') '' verwenden können oder die übliche 'AWS_DEFAULT_REGION', Region in der Konfigurationsdatei usw. – jamesls