Как вы ищите ведро Amazon S3?

159

У меня есть ведро с тысячами файлов в нем. Как я могу искать ведро? Есть ли инструмент, который вы можете порекомендовать?

vinhboy
источник
У меня есть несколько ведер, поэтому я написал короткий сценарий для поиска по всем из них: github.com/laurenfitch/utilities/blob/master/query_s3.py
Лорен Фитч

Ответы:

31

S3 не имеет встроенного «поиска в этом сегменте», поскольку фактическое содержимое неизвестно - также, поскольку S3 основано на ключах / значениях, нет собственного способа получить доступ ко многим узлам одновременно, а более традиционным хранилищам данных, которые предлагают (SELECT * FROM ... WHERE ...)(в SQL) модель).

Что вам нужно будет сделать, это выполнить, ListBucketчтобы получить список объектов в корзине, а затем выполнить итерацию по каждому элементу, выполняя пользовательскую операцию, которую вы реализуете - это ваш поиск.

Коди Коулан
источник
42
Это больше не так. Смотрите ответ Ронды ниже: stackoverflow.com/a/21836343/1101095
Нейт,
11
Для всех пользователей этого комментария: OP не указывает, хотят ли они искать имена файлов или содержимое ключа (например, содержимое файла). Так что ответа @ rhonda все еще может быть недостаточно. Похоже, что в конечном итоге это упражнение остается на усмотрение потребителя, поскольку использование консоли S3 вряд ли доступно пользователям вашего приложения и обычным пользователям. В основном это касается только роли владельца и / или роли IAM.
Коди Коглан
Существует ли какая-либо служба индексации, например lucene.net, для индексирования этих групповых документов.
Мунаввар
Я продолжал возвращаться к этому ответу и создал инструмент, чтобы помочь: bucketsearch.net - позволяет поиск по шаблону и т. Д.
Джон М
251

Просто примечание, которое можно добавить здесь: это сейчас 3 года спустя, но этот пост занимает первое место в Google, когда вы набираете «Как искать S3 Bucket».

Возможно, вы ищете что-то более сложное, но если вы попали сюда, пытаясь выяснить, как просто найти объект (файл) по его названию, это безумно просто:

откройте ведро, выберите «нет» с правой стороны и начните вводить имя файла.

http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html

Ронда Брэдли
источник
43
Это именно то, что я искал. Ужасный дизайн пользовательского опыта с нулевыми визуальными подсказками
Кит Энцерот
2
Нужно выбрать файл в ведре, а затем начать печатать.
cabe56
30
Еще только давайте по поиску по префиксу имени элемента.
Даниэль Флиппанс
21
Это абсолютно бесит! Люди говорят о чем-то справа или о желтом поле, но я ничего не могу найти. Точно такое же сообщение "Введите префикс ...". Как «Поиск Bucket» не по умолчанию? Это почти так же
невозможно обнаружить,
40
Этот ответ все еще актуален? Я не вижу никаких «нет» справа и ссылка на документацию в ответе теперь переходит на другую страницу.
BiscuitBaker
112

Вот краткий и уродливый способ поиска по именам файлов с помощью интерфейса командной строки AWS :

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
Абе Воелкер
источник
1
aws s3 ls s3: // ваше ведро --recursive | grep your-search Достаточно хорош для моего поиска, спасибо Абе Фолькер.
Человек 2067067
3
Все ведра: aws s3 ls | awk '{print $ 3}' | пока читаешь строку; сделать echo $ line; aws s3 ls s3: // $ line --recursive | grep your-search; сделано
Аком
1
что вырезать -c 32- без этого тоже поиск работает
sunil
1
cut -c 32-просто отсекает временную метку и информацию о размере файла из вывода, который в моей системе занимает 32 символа. Вам это не нужно, но если вы передаете вывод в другую команду, может быть полезно иметь «чистый» вывод.
Абе
CLI поддерживает include/exclude. Итак,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Могниш
25

Существует (как минимум) два разных варианта использования, которые можно описать как «поиск в корзине»:

  1. Ищите что-то внутри каждого объекта, хранящегося в ведре; это предполагает общий формат для всех объектов в этом сегменте (скажем, текстовых файлов) и т. д. и т. д. Для чего-то подобного вы вынуждены делать то, что только что ответил Коди Коглан. Документы AWS S3 содержат пример кода, показывающего, как это сделать с помощью AWS SDK для Java: перечисление ключей с помощью AWS SDK для Java (там вы также найдете примеры PHP и C #).

  2. Элемент списка Поиск чего-либо в ключах объекта, содержащихся в этом сегменте; S3 , делает имеет частичную поддержку для этого, в виде префикса позволяет точные совпадения + рушатся матчи после того, как разделитель. Это объясняется более подробно на Руководстве для разработчиков AWS S3 . Это позволяет, например, реализовать «папки», используя в качестве ключей объекта что-то вроде

    папка / подпапка / file.txt
    Если вы будете следовать этому соглашению, большинство графических интерфейсов S3 (таких как Консоль AWS) покажет вам представление вашей корзины в виде папки.

Эдуардо Пареджа Тобес
источник
документы для использования префикса в рубине
Джеймс
22

AWS выпустил новый сервис для запроса сегментов S3 с помощью SQL: Amazon Athena https://aws.amazon.com/athena/

hellomichibye
источник
2
ааааа ... я понимаю ... "Афина недоступна на западе США (Северная Калифорния). Пожалуйста, выберите другой регион".
Клинт
2
Это все накладные расходы со всеми этими SQL-запросами, учитывая, что мне нужен только grep
Али Гаджани,
4
@Clintm - изменить на нас-восток-1 (Северная Вирджиния)
Северная slocumro
21

Есть несколько вариантов, ни один из которых не является простым полнотекстовым решением «один выстрел»:

  1. Поиск по шаблону имени ключа : Поиск ключей, начинающихся с некоторой строки - если вы тщательно продумываете имена ключей, у вас может быть довольно быстрое решение

  2. Поиск метаданных, прикрепленных к ключам : при публикации файла в AWS S3 вы можете обрабатывать содержимое, извлекать некоторую мета-информацию и прикреплять эту мета-информацию в виде пользовательских заголовков к ключу. Это позволяет извлекать ключевые имена и заголовки без необходимости извлечения полного содержимого. Поиск должен быть выполнен последовательно, для этого не существует опции поиска "sql like". С большими файлами это может сэкономить много сетевого трафика и времени.

  3. Сохранение метаданных в SimpleDB : как и в предыдущем пункте, но с сохранением метаданных в SimpleDB. Здесь у вас есть sql как операторы select. В случае больших наборов данных вы можете достичь пределов SimpleDB, которые могут быть преодолены (разделить метаданные на несколько доменов SimpleDB), но если вы зайдете очень далеко, вам может понадобиться использовать другой тип базы данных metedata.

  4. Последовательный полнотекстовый поиск контента - обработка всех ключей по одному. Очень медленно, если у вас слишком много ключей для обработки.

Мы храним 1440 версий файла в день (по одной в минуту) в течение нескольких лет, используя ведро с версиями, это легко возможно. Но получение более старой версии требует времени, поскольку нужно последовательно переходить от версии к версии. Иногда я использую простой CSV-индекс с записями, показывающими время публикации плюс идентификатор версии, имея это, я могу довольно быстро перейти к более старой версии.

Как видите, AWS S3 не предназначен для полнотекстового поиска, это простой сервис хранения.

Ян Влчинский
источник
4

Поиск по префиксу в консоли S3

непосредственно в представлении консоли AWS.

введите описание изображения здесь

Скопируйте нужные файлы, используя s3-dist-cp

Если у вас есть тысячи или миллионы файлов, другой способ получить нужные файлы - скопировать их в другое место с помощью распределенной копии . Вы запускаете это на EMR в Hadoop Job. Крутая вещь в AWS состоит в том, что они предоставляют свою собственную версию S3 s3-dist-cp . Это позволяет группировать нужные файлы с помощью регулярного выражения в поле groupBy. Вы можете использовать это, например, в пользовательском шаге на EMR

[
    {
        "ActionOnFailure": "CONTINUE",
        "Args": [
            "s3-dist-cp",
            "--s3Endpoint=s3.amazonaws.com",
            "--src=s3://mybucket/",
            "--dest=s3://mytarget-bucket/",
            "--groupBy=MY_PATTERN",
            "--targetSize=1000"
        ],
        "Jar": "command-runner.jar",
        "Name": "S3DistCp Step Aggregate Results",
        "Type": "CUSTOM_JAR"
    }
]
H6.
источник
Может показаться, что представление сегмента консоли AWS не идет файл за файлом, применяя фильтр. Он может возвращать результаты очень быстро, если подстрока файла (ов) я ищу. Есть ли клиент / инструмент / API, который я могу использовать, кроме консоли AWS, чтобы получить результаты в то же самое время? @ high6. В прошлом я пытался использовать boto, но лучший подход, казалось, заключался в том, чтобы итерировать всю корзину, применяя критерии поиска к каждому имени файла. IE. очень медленно
копирование и вставка
4

Если вы работаете в Windows и у вас нет времени, чтобы найти хорошую grepальтернативу, быстрый и грязный способ будет:

aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt

а затем выполните быстрый поиск в myfile.txt

Бит «папка» не является обязательным.

PS если у вас не установлен AWS CLI - вот один вкладыш, использующий менеджер пакетов Chocolatey

choco install awscli

PPS Если у вас нет менеджера пакетов Chocolatey - получите его! Ваша жизнь в Windows станет в 10 раз лучше. (Я никак не связан с Chocolatey, но на самом деле это просто необходимо).

Alex
источник
Если пользователь может установить awscli, он может установить grep, нет? Или использовать родную находку Windows?
Дин Рэдклифф
2

Учитывая, что вы находитесь в AWS ... Я думаю, вы захотите использовать их инструменты CloudSearch. Поместите данные, которые вы хотите найти, в их службу ... пусть они указывают на клавиши S3.

http://aws.amazon.com/cloudsearch/

Эндрю Симер
источник
7
Не совсем то, что ОП искал вообще
Клинт
для меня это означало бы сохранить там все данные - дублирование данных
Б.Г. Бруно
1

Другой вариант - отразить ведро S3 на вашем веб-сервере и пройти локально. Хитрость в том, что локальные файлы пусты и используются только в качестве каркаса. В качестве альтернативы, локальные файлы могут содержать полезные метаданные, которые вы обычно должны получать из S3 (например, размер файла, mimetype, author, timestamp, uuid). Когда вы предоставляете URL для загрузки файла, выполняйте локальный поиск и указывайте ссылку на адрес S3.

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

Вы можете разрешить пользователям загружать файлы непосредственно на ваш сервер через FTP или HTTP, а затем передавать пакет новых и обновленных файлов в Amazon в непиковое время, просто возвращаясь к каталогам для файлов любого размера. По завершении передачи файла в Amazon замените файл веб-сервера на пустой файл с тем же именем. Если локальный файл имеет какой-либо размер файла, подайте его напрямую, поскольку он ожидает пакетной передачи.

Дилан Валаде
источник
Отличный способ разбить пространство хранения вашего узла на диске EXTFS2 / 3, если у вас есть миллионы файлов в вашей
корзине
1

Я так и сделал: у меня тысячи файлов в s3. Я видел панель свойств одного файла в списке. Вы можете увидеть URI этого файла, и я скопировал и вставил его в браузер - это был текстовый файл, и он хорошо отображался. Теперь я заменил uuid в url на uuid, который был у меня под рукой, и бум там файл.

Хотелось бы, чтобы у AWS был лучший способ поиска файла, но это сработало для меня.

Роза
источник
1

Попробуйте эту команду:

aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'

Затем вы можете передать это в grep, чтобы заставить определенные типы файлов делать с ними что угодно.

Роберт Эванс
источник
1
Примечание: --output textуказывает, что выводом будет простой текст, а не JSON и т. Д., И --query 'Contents[].{Key: Key, Size: Size}'просто фильтрует вывод списка по имени и размеру файла. Он не ищет Key: Keyили тому подобное.
Мэтт
1

Я пробовал следующим образом

aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv

Это выводит фактический путь, где файл существует

2019-04-05 01:18:35     111111 folder1/2019/03/20/filename.csv
Dheeraj
источник
1

Это немного старая ветка - но, возможно, поможет кто-то, кто все еще ищет - я тот, кто ищет это год.

Решением может быть « AWS Athena », где вы можете искать по таким данным

'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'

https://aws.amazon.com/blogs/developer/introducing-support-for-amazon-s3-select-in-the-aws-sdk-for-javascript/

В настоящее время цена составляет 1 долл. США за данные объемом 1 ТБ. Например, если при поиске по одному файлу объемом 1 ТБ в три раза стоимость составляет 15 долл. США, но, например, если в «преобразованном столбчатом формате» есть только 1 столбец, который вы хотите прочитать, вы заплатите 1 / 3 цены означает $ 1,67 / ТБ.

Б.Г. Бруно
источник
Кажется, что это не выполнимо для любого приложения, которое требует интенсивного поиска, поскольку его стоимость довольно высока ...
tnkh
@tnkh Я согласен - я бы хотел больше вариантов с # s3
BG Bruno
0

Я сделал что-то, как показано ниже, чтобы найти шаблоны в моем ведре

def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = {
    var s3Client = new AmazonS3Client()
    var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter)
    var objectListing: ObjectListing = null
    var res: List[String] = List()

    do {
      objectListing = s3Client.listObjects(listObjectsRequest)
      res = res ++ objectListing.getCommonPrefixes
      listObjectsRequest.setMarker(objectListing.getNextMarker)
    } while (objectListing.isTruncated)
    res
  }

Для больших сегментов это занимает слишком много времени, поскольку Aws возвращает все сводки объектов, а не только те, которые соответствуют префиксу и разделителю. Я ищу способы улучшить производительность, и до сих пор я обнаружил, что я должен называть ключи и правильно организовывать их в сегменты.

Рагхвендра Сингх
источник
0

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

SSEARCH - это полностью открытый инструмент поиска S3. Он был реализован всегда с учетом того, что производительность является критическим фактором, и в соответствии с эталонными показателями он выполняет поиск в сегменте, который содержит ~ 1000 файлов в течение нескольких секунд.

Установка проста. Вы загружаете только файл docker-compose и запускаете его с

docker-compose up

Будет запущен SSEARCH, и вы сможете искать что угодно в любом вашем ведре.

Арда Гючлю
источник
0

Перейдем к 2020 году, и с помощью aws-okta в качестве нашей 2fa, следующей команды, хотя и медленно, чтобы перебрать все объекты и папки в этом конкретном сегменте (+270 000), все работало нормально.

aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
jamescampbell
источник
0

Используйте Amazon Athena для запроса корзины S3. Также загрузите данные в поиск Amazon Elastic. Надеюсь это поможет.

Спросите меня
источник
0

Не технический ответ, но я создал приложение, которое позволяет выполнять поиск по шаблону: https://bucketsearch.net/

Он будет асинхронно индексировать ваше ведро, а затем позволит вам искать результаты.

Это бесплатно для использования (donationware).

Джон М
источник