Відповіді:
S3 не має власного "пошуку цього відра", оскільки фактичний вміст невідомий - також, оскільки S3 заснований на ключі / значенні, немає рідного способу отримати доступ до багатьох вузлів одночасно, а більше традиційних сховищ даних, які пропонують (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-
cut -c 32-
просто відсікає інформацію про розмітки часу та розмір файлу з виводу, який у моїй системі містить 32 символи. Вам це не потрібно, але якщо ви переносите вихід в іншу команду, можливо, буде зручно мати "чистий" вихід.
include/exclude
. Отже,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Існують (принаймні) два різних випадки використання, які можна охарактеризувати як "пошук у відрі":
Шукайте щось усередині кожного об'єкта, що зберігається у відрі; це передбачає загальний формат для всіх об'єктів у цьому відрі (скажімо, текстові файли) тощо тощо. Для чогось подібного ви змушені робити те, на що щойно відповів Коді Каулан. Документи AWS S3 мають приклад коду, який показує, як це зробити за допомогою AWS SDK для Java: Клавіші лістингу Використання AWS SDK для Java (там ви також знайдете приклади PHP та C #).
Елемент списку Шукайте щось у клавішах об'єктів, що містяться у цьому відрі; S3 , робить має часткову підтримку для цього, у вигляді префікса дозволяє точні співпадіння + руйнуються матчі після того, як роздільник. Це детальніше пояснюється в Посібнику для розробників AWS S3 . Це дозволяє, наприклад, реалізувати "папки" за допомогою використання в якості об'єктних клавіш чогось подібного
папка / підпапка / file.txtЯкщо ви будете дотримуватися цієї конвенції, більшість графічних інтерфейсів S3 (наприклад, консоль AWS) покажуть вам папку вашого відра.
AWS випустила нову Службу для запиту відер S3 за допомогою SQL: Amazon Athena https://aws.amazon.com/athena/
Існує кілька варіантів, жоден з них не є простим повнотекстовим рішенням "один кадр":
Пошук шаблонів імен ключів : пошук клавіш, починаючи з якогось рядка - якщо ви ретельно проектуєте імена ключів, можливо, у вас досить швидке рішення.
Пошукові метадані, приєднані до ключів : під час опублікування файлу в AWS S3 ви можете обробляти вміст, витягувати деяку метаінформацію та додавати цю мета-інформацію у вигляді спеціальних заголовків у ключ. Це дозволяє отримувати ключові імена та заголовки без необхідності отримувати повний вміст. Пошук повинен здійснюватися послідовно, для цього немає варіанту пошуку "sql like". З великими файлами це може заощадити багато мережевого трафіку та часу.
Зберігати метадані на SimpleDB : як попередній пункт, але зі збереженням метаданих у SimpleDB. Тут у вас є sql, як select оператори. У разі великих наборів даних ви можете потрапити на обмеження SimpleDB, яке можна подолати (метадані розділу в декількох доменах SimpleDB), але якщо ви дійсно далеко, вам може знадобитися використовувати інший тип бази даних.
Послідовний повнотекстовий пошук вмісту - обробка всіх ключів одна за одною. Дуже повільно, якщо у вас занадто багато ключів для обробки.
Ми зберігаємо 1440 версій файлу в день (по одній хвилині) протягом декількох років, використовуючи перероблене відро, це легко можливо. Але отримання старшої версії вимагає часу, оскільки послідовно слід переходити до версії. Колись я використовую простий індекс CSV із записами, показуючи час публікації плюс ідентифікатор версії, маючи це, я можу досить швидко перейти до старішої версії.
Як бачите, AWS S3 не розроблений для пошуку в повному обсязі тексту, це проста послуга зберігання даних.
безпосередньо у вікні відра консолі AWS.
Якщо у вас є тисячі або мільйони файлів, інший спосіб отримати шукані файли - скопіювати їх в інше місце, використовуючи розподілену копію . Ви запускаєте це на 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"
}
]
Якщо ви працюєте в 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, але ей, справді це обов'язково).
Зважаючи на те, що ви перебуваєте в AWS ... я думаю, ви хочете скористатися їх інструментами CloudSearch. Покладіть дані, які ви хочете шукати, в їх службу ... нехай вони вказують на клавіші S3.
Ще один варіант - віддзеркалення відра S3 на вашому веб-сервері та обхід локально. Хитрість полягає в тому, що локальні файли порожні та використовуються лише як скелет. Крім того, локальні файли можуть містити корисні метадані, які вам зазвичай потрібно отримати від S3 (наприклад, розмір файлів, mimetype, автор, часова марка, uuid). Коли ви надаєте URL-адресу для завантаження файлу, виконайте пошук на локальному рівні та надайте посилання на S3-адресу.
Локальне пересування файлів є простим, і такий підхід для управління S3 є агностичним мовою. Локальне переміщення файлів також дозволяє уникнути збереження та запитів у базу даних файлів або затримок із здійсненням серії віддалених викликів API для аутентифікації та отримання вмісту відра.
Ви можете дозволити користувачам завантажувати файли безпосередньо на ваш сервер через FTP або HTTP, а потім передавати партію нових та оновлених файлів в Amazon у вихідний час, просто повторюючи каталоги файлів будь-якого розміру. Після завершення передачі файлу в Amazon замініть файл веб-сервера порожнім одним і тим же ім'ям. Якщо локальний файл має будь-який розмір файлів, то подайте його безпосередньо, оскільки його чекає пакетна передача.
Як я це зробив: у s3 є тисячі файлів. Я побачив у списку панель властивостей одного файлу. Ви можете бачити URI цього файлу, і я копіюю його, вставивши його в браузер - це був текстовий файл, і він добре відобразився. Тепер я замінив uuid у URL-адресі на uuid, який я мав під рукою, і бум там файл.
Я б хотів, щоб AWS мав кращий спосіб пошуку файлу, але це працювало для мене.
Спробуйте цю команду:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
Потім ви можете передати це в греп, щоб отримати конкретні типи файлів, щоб робити з ними все, що завгодно.
--output text
Вказує, що на виході буде звичайний текст, а не JSON тощо., А --query 'Contents[].{Key: Key, Size: Size}'
лише фільтрує вихідний список у назві та розмірі файлу. Це не шукає Key: Key
тощо.
Це трошки стара тема - але, можливо, допомогти тому, хто все ще шукає - я той, хто шукає цього року.
Рішення може бути " AWS Athena ", де ви можете шукати подібні дані
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
В даний час ціна на 1 ТБ становить 5 доларів - так, наприклад, якщо ваш запит на пошук в одному файлі розміром 1 Тб тричі перевищує вашу вартість 15 доларів США, - але, наприклад, якщо у “перетвореному стовпчиковому форматі” є лише 1 стовпець, що ви хочете прочитати, ви заплатите 1 / 3 ціни означає 1,67 дол. / ТБ.
Погляньте на цю документацію: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Для фільтрації імен можна використовувати Perl-Compatible Regular Expression (PCRE).
Я зробив щось, як показано нижче, щоб знайти візерунки у своєму відрі
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, а не лише ті, що відповідають префіксу та роздільнику. Я шукаю шляхи для підвищення продуктивності, і поки що я виявив, що я повинен називати ключі та правильно їх організовувати у відра.
Я зіткнувся з тією ж проблемою. Пошук у S3 повинен бути набагато простішим, ніж поточна ситуація. Тому я реалізував цей інструмент з відкритим кодом для пошуку в S3.
SSEARCH - це повний інструмент пошуку S3 з відкритим кодом. Він був реалізований завжди, маючи на увазі, що продуктивність є найважливішим фактором, і відповідно до еталонів він здійснює пошук у відро, яке містить ~ 1000 файлів протягом декількох секунд.
Установка проста. Ви завантажуєте лише докер-композиційний файл і запускаєте його
docker-compose up
SSEARCH буде запущено, і ви зможете шукати що завгодно у будь-якому відрі.
Перемотка вперед до 2020 року, використовуючи aws-okta як наш 2fa, наступна команда, в той час як повільно, як пекло, переглядати всі об'єкти та папки в цьому конкретному відрі (+270 000) спрацювало чудово.
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
Використовуйте Amazon Athena для запиту відра S3. Крім того, завантажуйте дані в пошук Amazon Elastic. Сподіваюся, це допомагає.
Не технічна відповідь, але я створив додаток, який дозволяє шукати підстановку: https://bucketsearch.net/
Це асинхронно індексує ваше відро, а потім дозволить шукати результати.
Це безкоштовно для використання (пожертвування).
Статус 2018-07: Amazon має рідний sql, як пошук файлів csv та json!