S3 boto list keys иногда возвращает ключ каталога - PullRequest
13 голосов
/ 31 марта 2012

Я заметил разницу между возвратами из API boto в зависимости от местоположения корзины. У меня есть следующий код:

con = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
bucket = con.get_bucket(S3_BUCKET_NAME)
keys = bucket.list(path)
for key in keys:
  print key

, который я наталкиваюсь на два ведра, одно в США-западе и одно в Ирландии. Путь в этом сегменте - это подкаталог, против Ирландии я получаю подкаталог и все ключи внизу, против нас - запад, я получаю только ключи ниже.

Итак, Ирландия дает:

<Key: <bucketName>,someDir/>
<Key: <bucketName>,someDir/someFile.jpg>
<Key: <bucketName>,someDir/someOtherFile.jpg>

где в соответствии со стандартом США:

<Key: <bucketName>,someDir/someFile.jpg>
<Key: <bucketName>,someDir/someOtherFile.jpg>

Очевидно, я хочу иметь возможность писать один и тот же код независимо от местоположения сегмента. Любой, кто знает, что я могу сделать, чтобы обойти эту проблему, получит такие же предсказуемые результаты. Или даже если это Бото, вызывающее проблему или S3. Я заметил, что в Ирландии действует разная политика именования сегментов. У разных местных жителей есть свои собственные версии API?

Спасибо

Steve

Ответы [ 4 ]

18 голосов
/ 01 апреля 2012

Спасибо Штеффену, который предложил посмотреть, как создаются ключи.С дальнейшим расследованием я думаю, что у меня есть понимание того, что здесь происходит.Мое первоначальное предположение, что это было связано с областью ведра, было красной сельдью.Похоже, это связано с тем, что делает консоль управления при манипулировании ключами.

Если вы создаете каталог в консоли управления, он создает 0-байтовый ключ.Это будет возвращено при выполнении списка.

Если вы используете boto для создания / загрузки файла, тогда папка не создается.Интересно, что если вы удаляете файл из папки (из консоли AWS), то создается ключ для папки, в которой он содержался.Если вы затем снова загрузите бей с помощью boto, то у вас будет точно такая же структура, как в интерфейсе, но на самом деле у вас будет поддельный дополнительный ключ для каталога.Это то, что происходило со мной, когда я тестировал наше приложение, я очищал ключи и затем находил разные результаты.

Стоит знать, что это происходит.В пользовательском интерфейсе отсутствует индикатор, показывающий, является ли папка созданной (папка, которая будет возвращена в качестве ключа) или интерпретированной (на основе имени ключа).

6 голосов
/ 31 марта 2012

У меня нет четкого ответа на ваш вопрос, но я могу добавить хотя бы несколько частичных:

Фон

Каталог / Имитация папки

Amazon S3 на самом деле не имеет родной концепции папок / каталогов, а представляет собой плоскую архитектуру хранения, состоящую только из контейнеров и объектов / ключей - представление стиля каталогов, которое можно увидеть в большинстве инструментов для S3 ( включая AWS Management Console ) основана исключительно на соглашении, то есть имитирует иерархию для объектов с одинаковыми префиксами - см. мой ответ на Как указать префикс срока действия объекта, который не соответствует каталогу ? для получения более подробной информации об этой архитектуре, включая цитаты / ссылки из документации AWS.

Различия API по регионам

Я заметил, что в Ирландии существует другая политика именования сегментов, у разных местных жителей есть свои версии API?

Очевидно, что это действительно так для Amazon S3 , в частности, который является одним из их самых старых предложений, см., Например, Ограничения и ограничения на ведро :

Во всех регионах , за исключением стандартного региона США , Вы должны использовать следующие указания при именовании ведра. [...] [Акцент мой]

Эти особенности для стандарта США * можно увидеть и в других местах документации S3 , а Стандарт США - сама по себе необычная конструкция по сравнению с в остальном четко географически ограниченные Регионы :

Стандарт США - Использование серверов Amazon S3 в США

Это регион по умолчанию. Стандартный регион США автоматически направляет запросы на объекты в Северной Вирджинии или Тихом океане Северо-Запад с использованием сетевых карт. Чтобы использовать этот регион, выберите стандарт США как регион при создании ведра в консоли. Стандарт США Регион обеспечивает возможную согласованность для всех запросов. [Акцент мой]

Это неявное поведение CDN является уникальным для этого региона по умолчанию для S3 (т. Е. Стандарт США ) и не встречается нигде в других сервисах AWS, как мне кажется.

Вероятная причина

У меня слабая память о том, что S3 фактически помещает объект / ключ с нулевым байтом в корзину для моделируемого каталога / папки в более поздних регионах (т. Е. Во всех, кроме Стандарт США ), тогда как унаследованное решение для стандартная область США может отличаться, например, просто на основе установленного соглашения об именах для разделения каталогов на / и полного исключения выделенного объекта / ключа для этого.

Решение

Если анализ верен, вы ничего не можете сделать, кроме как поддерживать отдельные пути кода для обоих случаев, я боюсь

Удачи!

5 голосов
/ 07 декабря 2012

У меня была такая же проблема. В качестве обходного пути вы можете отфильтровать все ключи с конечным символом '/', чтобы исключить записи каталога.

def files(keys):
    return (key for key in keys if not key.name.endswith('/'))

s3 = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
bucket = s3.get_bucket(S3_BUCKET_NAME)
keys = bucket.list(path)
for key in files(keys):
    print(key)
0 голосов
/ 03 февраля 2014

Я использую тот факт, что "Папка" не имеет "." на своем пути. Файл делает. медиа / изображения не будут удалены media / images / sample.jpg будет удален

например. чистые файлы ведра

def delete_all_bucket_files(self,bucket_name):
        bucket = self.get_bucket(bucket_name)
        if bucket:
            for key in bucket.list():
                #delete only the files, not the folders
                if period_char in key.name:
                    print 'deleting: ' + key.name
                    key.delete()
...