Как я могу обойти функцию boto3, не допуская заглавных букв в имени корзины? - PullRequest
0 голосов
/ 14 января 2019

Мне нужно получить список ключей s3 из корзины. У меня есть скрипт, который отлично работает с boto3. Проблема заключается в том, что имя используемого ящика имеет заглавные буквы, и это выдает ошибку с boto3.

При просмотре подключиться к корзине с заглавной буквой здесь используется boto, но я бы хотел использовать boto3, но OrdinaryCallingFormat() не подходит для boto3.

Или я мог бы адаптировать скрипт для работы с boto, но я не уверен, как это сделать. Я попробовал:

s3 = boto.connect_s3(aws_access_key_id,aws_secret_access_key, 
calling_format = OrdinaryCallingFormat())

Bucketname = s3.get_bucket('b-datasci/x-DI-S')

но это дало ошибку boto.exception.S3ResponseError: S3ResponseError: 404 Not Found.

С этой попыткой:

conn = boto.s3.connect_to_region(
    'us-east-1',
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,               
    calling_format=boto.s3.connection.OrdinaryCallingFormat(),
)
bucket = conn.get_bucket(Bucketname)

Я получил ошибку: xml.sax._exceptions.SAXParseException: <unknown>:1:0: no element found

Как мне заставить это работать с boto, или же интегрировать OrdinaryCallingFormat() в boto3 для получения списка ключей?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Как указал @John Rotenstein, все имена сегментов должны соответствовать DNS, поэтому прямой слеш для имени сегмента недопустим.

На самом деле 2-й фрагмент кода выше работает, когда я добавил это: для введите bucket.get_all_keys (префикс = 's-DI-S /', разделитель = '/') и взял какой на самом деле был префикс от Bucketname.

Из вышеприведенного комментария OP кажется, что OP, возможно, неправильно понял хранилище объектов S3 с файловой системой каталогов. Каждый объект s3 никогда не хранится в формате иерархии. Так называемый «префикс» - это просто текстовый фильтр, который извлекает имя объекта, которое содержит аналогичный «префикс» в имени объекта.

В OP есть вызов имени сегмента b-datasci, в то время как под контейнером находится много объектов с префиксом x-DI-S.

Кроме того, использование delimiter в get_all_keys - это не то, что считает OP. Если вы ознакомитесь с документацией AWS по иерархическому списку ключей с использованием префикса и разделителя , вы поймете, что это всего лишь вторичный фильтр. т.е.

Параметры префикса и разделителя ограничивают вид результатов, возвращаемых операцией со списком. Префикс ограничивает результаты только теми ключами, которые начинаются с указанного префикса, а разделитель заставляет список сворачивать все ключи, которые имеют общий префикс, в один итоговый список.

p / s: OP должен использовать boto3, потому что boto устарела в AWS более 2 лет.

0 голосов
/ 16 января 2019

Проблема не в заглавных буквах. Это косая черта.

Имя корзины должно соответствовать этому регулярному выражению:

^[a-zA-Z0-9.\-_]{1,255}$

Чтобы перечислить объекты в сегменте «mybucket» с префиксом «b-datasci / x-DI-S», вы переходите на слишком низкий уровень. Используйте это вместо:

import boto3
client = boto3.client('s3')
for obj in client.list_objects_v2(Bucket="mybucket", Prefix="b-datasci/x-DI-S"):
    ...
...