Как выполнить поиск в корзине amazon s3?

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

14 ответов


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

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


просто Примечание, чтобы добавить здесь: это сейчас 3 лет спустя, но этот пост является лучшим в Google, когда вы вводите "как искать ведро S3."

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

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

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


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

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-

есть (по крайней мере) два разных варианта использования, которые можно описать как "поиск в ведре":

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

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

    folder/subfolder/file.txt
    Если вы следуете этому соглашению, большинство GUIs S3 (например, консоль AWS) покажет вам представление папки вашего ковша.

существует несколько вариантов, ни один из которых не является простым полнотекстовым решением "один выстрел":

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

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

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

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

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

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


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


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

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


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

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

enter image description here

копировать нужные файлы с помощью s3-dist-cp

когда у вас есть тысячи или миллионы файлов другой способ получить нужные файлы, чтобы скопировать их в другое место с помощью распределенные копии. Вы запустите это на EMR в работе Hadoop. Самое интересное в 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"
    }
]

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

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

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


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

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

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


взгляните на эту документацию: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list

для фильтрации имен можно использовать регулярное выражение, совместимое с Perl (PCRE).


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

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


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

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, а не только те, которые соответствуют префиксу и разделителю. Я ищу способы улучшить производительность, и до сих пор я только нашел, что я должен назвать ключи и правильно организовать их в ведрах.


статус 2018-07: У Amazon есть собственный sql, такой как поиск файлов csv и json!

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