Aws-cli: aws s3 ls - найти файлы по дате изменения?

Созданный на 21 янв. 2015  ·  87Комментарии  ·  Источник: aws/aws-cli

Привет,
Мы хотели бы иметь возможность выполнять поиск в корзине с многими тысячами (вероятно, увеличивающимися до сотен тысяч) объектов и папок / префиксов, чтобы найти объекты, которые были недавно добавлены или обновлены. Выполнение aws s3 ls для всей корзины несколько раз в день с последующей сортировкой по списку кажется неэффективным. Есть ли способ просто запросить список объектов с измененным временем <,>, = определенной меткой времени?

Кроме того, взимается ли плата за запрос aws s3 ls один раз или один раз за каждый объект, возвращаемый запросом?

Новичок в github, если бы я знал достаточно, чтобы внести свой код ... цените помощь.

guidance

Самый полезный комментарий

@jwieder Это не помогает пользователю уменьшить количество вызовов списка к s3. Допустим, вы ежедневно храните в ведре ~ 1000 новостных статей. Затем на стороне клиента вы хотите получать статьи за последние 3 дня по умолчанию (и больше, только если явно запрошено). Необходимость получить список всех статей с начала времен, скажем, 100 тыс., Требует времени и увеличивает сетевые расходы (поскольку один вызов списка возвращает только до 1000 элементов). Было бы намного приятнее сказать: «Дайте мне список элементов, созданных / измененных за 3 дня назад».

Все 87 Комментарий

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

Что касается ценообразования S3 , мы используем запрос ListObjects который возвращает 1000 объектов за раз. Таким образом, с вас будет взиматься плата за запрос LIST за каждые 1000 объектов при использовании aws s3 ls .

Другой альтернативой является хранение вспомогательного индекса вне S3, например, Dynamodb. Дайте мне знать, если у вас есть еще вопросы.

Спасибо

Хотя эта функциональность, похоже, отсутствует в aws-cli, ее довольно легко написать скрипт на bash. Например:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
aws s3 ls s3://bucket.example.com/somefolder/ | grep ${DATE}

@jwieder Это не помогает пользователю уменьшить количество вызовов списка к s3. Допустим, вы ежедневно храните в ведре ~ 1000 новостных статей. Затем на стороне клиента вы хотите получать статьи за последние 3 дня по умолчанию (и больше, только если явно запрошено). Необходимость получить список всех статей с начала времен, скажем, 100 тыс., Требует времени и увеличивает сетевые расходы (поскольку один вызов списка возвращает только до 1000 элементов). Было бы намного приятнее сказать: «Дайте мне список элементов, созданных / измененных за 3 дня назад».

Точно!

Вск, 17 января 2016 г., 23:53, PuchatekwSzortach <
[email protected]> написал:

@jwieder https://github.com/jwieder Это не помогает пользователю уменьшить
количество вызовов списка к s3. Скажите, что каждый день вы храните ~ 1000 новостей
статьи в ведре. Затем на стороне клиента хотите получить статьи за последние 3
дней по умолчанию (и больше, только если явно запрошено). Необходимость получить
список всех статей с начала времен, скажем 100к, требует времени
и накапливает сетевые расходы (потому что один вызов списка вернет только
до 1000 шт.). Было бы намного приятнее сказать: «Дайте мне список
элементы, созданные / измененные 3 дня назад ".

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172425517.

@PuchatekwSzortach @ChrisSLT Вы правы, извините за мой неубедительный ответ; и я согласен, что такая функциональность была бы очень полезна в aws-cli. Сочетание отказа от этой базовой функции и выставления счетов за списки файлов очень подозрительно. Пока AWS не перестанет жаловаться на копейки и не введет листинг по свойствам файлов, вот еще одна идея, которую я использовал, которая более актуальна для этой темы, чем мой 1-й ответ: для файлов, которые необходимо отслеживать таким образом, файлы называются с меткой времени . Список файлов хранится в локальном текстовом файле (или может быть db, если у вас есть миллионы файлов, о которых нужно беспокоиться). Затем поиск даты включает открытие файла, поиск имен файлов, соответствующих сегодняшней дате, может выглядеть примерно так:

при чтении -r имя_файла
делать
если ["$ fileName" == "$ СЕГОДНЯ"]; тогда
aws s3 sync $ BUCKETURL / some / local / directory --exclude "*" --include "$ fileName"
фи
сделано <"$ FILE"

Где $ FILE - это локальный индекс файла, а $ TODAY - это дата, которую вы ищете. Вам нужно будет изменить условие в этом цикле, но, надеюсь, это может дать вам представление.

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

Согласен и спасибо

Во вторник, 19 января 2016 г., в 10:00, Джош Видер [email protected]
написал:

@PuchatekwSzortach https://github.com/PuchatekwSzortach @ChrisSLT
https://github.com/ChrisSLT Вы правы, извините за мой неубедительный ответ; а также
Я согласен, что такая функциональность была бы очень полезна в aws-cli. В
сочетание отказа от этой базовой функции и выставления счетов за списки файлов
очень подозрительно. Пока AWS не перестанет скупать гроши и не представит листинг
свойства файла, вот еще одна идея, которую я использовал, которая более актуальна
в эту ветку, тогда мой первый ответ: Для файлов, которые необходимо отслеживать в этом
Кстати, файлы имеют имена с отметкой времени. Список файлов хранится в локальном
текстовый файл (или может быть db, если у вас есть миллионы файлов, о которых нужно беспокоиться).
Затем поиск даты включает открытие файла и поиск имен файлов.
дата, совпадающая с сегодняшней датой, может выглядеть примерно так:

при чтении -r имя_файла
делать
если ["$ fileName" == "$ СЕГОДНЯ"]; тогда
aws s3 sync $ BUCKETURL / some / local / directory --exclude "*" --include
"$ fileName"
фи
сделано <"$ FILE"

Где $ FILE - это индекс вашего локального имени файла, а $ TODAY - это дата, когда вы находитесь
ищу. Вам нужно будет изменить условие в этом цикле, но
надеюсь, это может дать вам представление.

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

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172878454.

Есть способ сделать это с помощью s3api и функции --query. Это проверено на OSX
aws s3api list-objects --bucket "bucket-name" --query 'Contents [? LastModified> = 2016-05-20 ] []. {Key: Key}'
затем вы можете отфильтровать с помощью jq или grep для обработки с другими функциями s3api.

Изменить: не уверен, почему они не отображаются, но вы должны использовать обратные кавычки, чтобы окружить дату, которую вы запрашиваете

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

да. Хотя вам может быть проще просто использовать префикс даты для ваших ключей (вы не можете запросить комбинацию имени корзины / имени папки с помощью параметра --bucket). Использование префикса даты позволит вам использовать флаг --prefix в cli и ускорить запросы, поскольку AWS рекомендует использовать числа или хэши в начале имен ключей для увеличения времени ответа.

@willstruebing , ваше решение по-прежнему не снижает количество вызовов S3 API, сложность запросов на стороне сервера или объем данных, отправляемых по сети. Параметр --query выполняет только фильтрацию jmespath на стороне клиента.

@kislyuk Полностью согласен, это не отвечает на вопросы эффективности. Однако я хотел ответить на конкретный вопрос:

Is there a way to simply request a list of objects with a modified time <, >, = a certain timestamp?

Этот основной вопрос заключается в том, как я попал в эту цепочку, и поэтому я счел разумным включить ответ на него. Проблема помечена как «aws s3 ls - найти файлы по дате изменения?».

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

# for i in s3cmd ls | awk {'print $3'} ; do aws s3 ls $ i --recursive; сделано >> s3-full.out

Что по умолчанию для файлов, возвращаемых AWS? Возвращает ли он их в алфавитном порядке или по самым последним изменениям, или какие критерии используются, когда вы запрашиваете свой первый пакет из 1000 имен файлов?

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

Я согласен, что эта фильтрация должна быть на стороне сервера и является основной необходимостью.

+1 для запросов / фильтрации на стороне сервера

+1 для фильтрации на стороне сервера

Все еще действительно очень нужен, +1

Согласен с @chescales и остальными, +1 к фильтрации на стороне сервера

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Как это еще не функция?

+100000

+ 1e999

+1

+1

+1

+1

+1

+1

+1

+1

+65535

Комментарий @willstruebing работал у меня, например:

aws s3api list-objects --bucket "mybucket" --prefix "some/prefix" --query "Contents[?LastModified>=`2018-08-22`].{Key: Key}"

о, да ладно - после просмотра сетевого трафика с помощью этой команды я вижу, что все ключи все еще загружаются с s3, а aws cli выполняет фильтрацию на стороне клиента!

+1

+1

+1

+1

как насчет фильтров --exclude и --include?

! / bin / bash

ДАТА = $ (дата +% Y-% m-% d)
aws s3 ls s3: //bucket.example.com/somefolder/ --exclude " " --include " $ {DATE} *"

+1

+1

+1 миллион

+1

+ ∞

+ ∞ + 1

+1

+1

+1

++

+1

+1

+1

+1 :( :(

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

+1

Думаю, поэтому они создали Афину? еще один способ выставить счет, добавив при этом наворотов?

+1

+1

+1

Я должен перечислить объекты ведра s3, которые были изменены между двумя датами, например. С 2019-06-08 по 2019-06-11

есть идеи кто-нибудь?

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query "Contents[?LastModified>='2019-06-08'][].{Key: Key,LastModified: LastModified}" а затем используйте JQ или другой другой инструмент для фильтрации после 2019-06-11

Это не исключает вызовов API. Эти запросы являются клиентскими

Во вторник, 11 июня 2019 г., 14:07 willstruebing [email protected]
написал:

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query
"Содержание [? LastModified> = '2019-06-08'] []. {Key: Key, LastModified:
LastModified} ", а затем используйте JQ или другой другой инструмент, чтобы отфильтровать после
2019-06-11

-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMW5AFAU5BUNM7FEMZ3PZ7SV3A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFMVREXG8
или отключить поток
https://github.com/notifications/unsubscribe-auth/AABLGMVTIZDPPIEUK2CZR6TPZ7SV3ANCNFSM4A2VNZ2A
.

@dmead Полностью согласен. Однако функции фильтрации на стороне сервера в настоящее время не существует (я думаю, именно поэтому так много людей попадают в этот конкретный пост), так что это единственный известный мне обходной путь для выполнения поставленной задачи. У вас есть способ сделать это на стороне сервера или это просто наблюдение за предлагаемым решением? Я хотел бы услышать мнение о том, как это сделать, И уменьшить количество вызовов API.

Если у вас есть время, я бы посмотрел на выбор метаданных в Афине. я
у меня не было шанса, но это казалось возможным решением.

В среду, 12 июня 2019 г., в 10:28 willstruebing [email protected]
написал:

@dmead https://github.com/dmead Я полностью согласен. Однако
функциональность для фильтрации на стороне сервера в настоящее время не существует (я думаю
вот почему так много людей попадают в этот конкретный пост), так что это
единственный известный мне обходной путь для выполнения поставленной задачи. У вас есть
способ сделать это на стороне сервера или это просто наблюдение по поводу предлагаемого
решение? Я хотел бы услышать отзывы о том, как это сделать, И уменьшить количество
Вызовы API.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMTQZD6OWVH4KDMSJPLP2EBY7A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFMVREXG9
или отключить поток
https://github.com/notifications/unsubscribe-auth/AABLGMRLA5OYSYGEYNPUY5DP2EBY7ANCNFSM4A2VNZ2A
.

+24

Все, кто голосует за это, заполнение через AWS CLI не помогает. AWS CLI привязан к S3. Файл с командой S3, а не с github инструмента, если вы хотите, чтобы это было исправлено: P

@ mike-bailey Хорошо, и как мне это сделать?

Если бы это был я лично, я бы подал заявку на AWS, чтобы она попала в сервисную группу. Но я не работаю в AWS. Я просто знаю, что комментируя это «+1», это не меняет.

Есть способ сделать это с помощью s3api и функции --query. Это проверено на OSX
aws s3api list-objects --bucket "bucket-name" --query 'Contents [? LastModified> = 2016-05-20 ] []. {Key: Key}'
затем вы можете отфильтровать с помощью jq или grep для обработки с другими функциями s3api.

Изменить: не уверен, почему они не отображаются, но вы должны использовать обратные кавычки, чтобы окружить дату, которую вы запрашиваете

Перед тем, как попробовать этот ответ, убедитесь, что у вас установлена ​​последняя версия awscli . Я улучшил
awscli 1.11.47 -> 1.16.220
и он делал ужасную фильтрацию на стороне клиента, но это сработало.
+1 для фильтрации на стороне сервера.

+1

+1

Прочтите, пожалуйста, ветку, +1 ничего не делает

Вы не можете сделать это легко, но в этих комментариях похоронен следующий совет:

 aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>=`2016-05-20`][].{Key: Key}'

Это все еще клиентская сторона и будет выполнять множество запросов.

Однако, как отмечалось ранее, он обрабатывает это на стороне клиента. Так что вы все еще потенциально можете захлопнуть ведро с звонками.

Я думаю, что фильтрация должна быть на стороне сервера и является основной необходимостью.

Вот пример использования aws s3 sync, поэтому загружаются только новые файлы. Он объединяет журналы в один файл журнала и удаляет комментарии перед сохранением файла. Затем вы можете использовать grep и другие вещи для получения данных журнала. В моем случае мне нужно было подсчитать количество уникальных обращений к конкретному файлу. Приведенный ниже код был адаптирован по этой ссылке: https://shapeshed.com/aws-cloudfront-log/ Команда sed работает и на Mac и отличается от того, что описано в статье. Надеюсь это поможет!

aws s3 sync s3://<YOUR_BUCKET> .
cat *.gz > combined.log.gz
gzip -d combined.log.gz
sed -i '' '/^#/ d' combined.log

# counts unique logs for px.gif hits
grep '/px.gif' combined.log | cut -f 1,8 | sort | uniq -c | sort -n -r

# above command will return something like below. The total count followed by the date and the file name.
17 2020-01-02 /px.gif
 9 2020-01-03 /px.gif

Я знаю, что это старая проблема, но оставлю здесь элегантное решение:

aws s3api list-objects --output = text --query "Contents [? LastModified> = <DATE_YOU_WANT_TO_START> ]. {Key: Key}"

Была ли эта страница полезной?
0 / 5 - 0 рейтинги