2016-05-24 2 views
2

Я использую Python и boto3 для работы с S3.S3 Key Not Im Immediatly After Listing

я перечисляю в S3 ведро и фильтрации префиксом:

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

Это дает мне Iterable объектов S3.

Если я печатаю объект я вижу:

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

Когда я иду, чтобы получить тело, хотя я получаю исключение:

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

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

Так бот просто дал мне ключ, но тогда он говорит, что этого не существует?

Это не происходит для всех ключей. Лишь некоторые. Если я ищу неверный ключ в консоли AWS, он не находит его.

ответ

2

Можно с уверенностью предположить, что вы используете «стандартную» конечную точку. Все это в первую очередь относится к нему, а не к региональным конечным точкам. S3 является атомарным и eventually consistent. The documentation gives several examples, в том числе это:

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.

Иногда задержки manyhours были замечены, и мой anecdata согласен с this statement, которая существует в течение 2 секунд свыше 99% данных.

Вы можете включить чтение после записи последовательности, которые «исправления» этого, при смене конечной точки от s3.amazonaws.com до s3-external-1.amazonaws.com:

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

Спасибо за отзыв о прочитанных после записи последовательности, что именно решает моя проблема. – Kong

+2

Прохладный. Это эзотерика. – tedder42

+0

Стоит отметить, что последние версии boto3/botocore также поддерживают 's3-external-1' как имя региона, поэтому вы можете использовать' boto3.client ('s3', region_name = 's3-external-1') ' , или обычный 'AWS_DEFAULT_REGION', регион в файле конфигурации и т. д. – jamesls