AWS поддерживает массовое удаление до 1000 объектов за запрос с помощью S3 REST API и его различных оболочек. Этот метод предполагает, что вы знаете, какие ключи объекта S3 вы хотите удалить (то есть он не предназначен для обработки чего-то вроде политики хранения, файлов, размер которых превышает определенный размер и т. Д.).
API SEST REST может указывать до 1000 файлов, которые должны быть удалены за один запрос, что должно быть быстрее, чем выполнение отдельных запросов. Помните, что каждый запрос является запросом HTTP (то есть TCP). Таким образом, каждый запрос несет накладные расходы. Вам просто нужно знать ключи объектов и создать HTTP-запрос (или использовать оболочку на выбранном вами языке). AWS предоставляет отличную информацию об этой функции и ее использовании . Просто выберите метод, который вам наиболее удобен!
Я предполагаю, что ваш вариант использования подразумевает, что конечные пользователи указывают несколько конкретных файлов, которые нужно удалить одновременно. Вместо того, чтобы запускать задачу, такую как «очистить все объекты, которые ссылаются на файлы изображений» или «очистить все файлы, которые старше определенной даты» (что, я считаю, легко настроить отдельно в S3).
Если это так, вы будете знать ключи, которые нужно удалить. Это также означает, что пользователю понравится больше отзывов в реальном времени о том, был ли их файл успешно удален или нет. Ссылки на точные ключи должны быть очень быстрыми, поскольку S3 был разработан для эффективного масштабирования, несмотря на обработку чрезвычайно большого объема данных.
Если нет, вы можете посмотреть на асинхронные вызовы API. Вы можете прочитать немного о том, как они будут работать в целом из этого поста в блоге или найти, как это сделать на выбранном вами языке. Это позволило бы запросу удаления занять свой собственный поток, а остальная часть кода может выполняться, не заставляя пользователя ждать. Или вы можете разгрузить запрос в очередь. , , Но обе эти опции неоправданно усложняют либо ваш код (асинхронный код может раздражать), либо вашу среду (вам понадобится сервис / демон / контейнер / сервер для обработки очереди. Поэтому я бы по возможности избегал этого сценария.
Изменить: у меня нет репутации, чтобы публиковать более 2 ссылок. Но вы можете увидеть комментарии Amazon о частоте запросов и производительности здесь: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html А часто задаваемые вопросы о s3, которые массовое удаление является путь, если это возможно.
aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys
и затем удаление объектов (этого было достаточно, чтобы при выполнении одного параллельного процесса достигнут предел скорости удаления объектов):tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _
_
в конце :) Я пропустил это, и затем мне потребовалось много времени, чтобы понять, почему пропущен первый элемент. Дело в том, чтоbash -c
все аргументы передаются как позиционные параметры, начиная с$0
, а «$ @» обрабатывает только параметры, начиная с$1
. Таким образом, подчеркивающий манекен необходим для заполнения позиции$0
.split -l 1000
для разделения файла ключей на 1000 пакетов ключей. Теперь для каждого файла я могу выполнить команду удаления, а затем удалить файл. Если что-то пойдет не так, я могу продолжить.aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'
что будет проще, и вы можете добавить,| grep
чтобы отфильтровать это оттуда.Я был разочарован производительностью веб-консоли для этой задачи. Я обнаружил, что команда CLI AWS делает это хорошо. Например:
aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files
Для большой файловой иерархии это может занять значительное время. Вы можете установить это в сеансе
tmux
илиscreen
сеансе и проверить позже.источник
aws s3 rm --recursive
команда удаляет файлы по отдельности. Хотя это и быстрее, чем веб-консоль, при удалении большого количества файлов это может быть намного быстрее, если массовое удалениеАккуратный трюк использует правила жизненного цикла для обработки удаления для вас. Вы можете поставить правило в очередь, чтобы удалить префикс или объекты, которые вы хотите, и Amazon просто позаботится об удалении.
https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html
источник
Не зная, как вы управляете корзинами s3, это может быть или не быть особенно полезным.
Инструменты AWS CLI имеют опцию «sync», которая может быть особенно эффективной для обеспечения правильности объектов в s3. Если вы или ваши пользователи управляете S3 из локальной файловой системы, вы можете сэкономить массу работы, определяя, какие объекты необходимо удалить с помощью инструментов CLI.
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
источник
Там уже упоминалось о
s3 sync
команде раньше, но без примера и слова о--delete
варианте.Я нашел самый быстрый способ удалить содержимое папки в
S3
корзинеmy_bucket
:источник