Подтвердить что ты не робот

Клавиши списка S3 boto иногда возвращают ключ каталога

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

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>

где, как указывается в стандарте US:

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

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

Спасибо,

Стив

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Фон

Моделирование каталогов/папок

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

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

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

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

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

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

Стандарт США. Использует серверы Amazon S3 в США.

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

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

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

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

Решение

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

Удачи!

Ответ 3

У меня была такая же проблема. В процессе работы вы можете отфильтровать все ключи с помощью '/', чтобы исключить записи "directory".

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)

Ответ 4

Я использую тот факт, что в "Папке" нет ".". на своем пути. Файл делает. медиа/изображения не будут удалены 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()