Как скопировать множество файлов из AWS S3 за один вызов без рекурсии? - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно скопировать много файлов (> 10000) из aws s3.Это ведро содержит сотни тысяч файлов, и я не хочу загружать их все. Этот процесс необходимо повторять автоматически / программно каждый час, так как новые файлы часто попадают в корзину.

Единственные поддерживаемые способы, которые я могу найти, - это использовать собственные параметры awscliявляются:

  1. Используйте параметр aws s3 cp --recursive s3://the_bucket/ local_location.Поскольку корзина содержит сотни тысяч файлов, этот процесс загружает много, многие файлы, которые мне не нужны, и очень медленный.
  2. Используйте aws s3 sync.Этот подход загружает только те файлы, которые мне нужны, но очень медленный.Если корзина обновляется только несколькими файлами, sync должен проверить всю корзину на наличие новых файлов.Это очень медленно.
  3. Используйте aws s3 ls s3://the_bucket/ local_location, чтобы найти все файлы в корзине и сравнить с индексом файлов, которые я ранее скачал, и которые я не хочу загружать снова.aws s3 ls очень быстро, однако мне приходится звонить aws s3 cp s3://the_bucket/the_file local_location один за другим , что очень медленно.

tl; dr

Как я могу скопировать много файлов, которые мне нужны, из корзины aws s3 без использования рекурсии (т.е. aws s3 cp --recursive s3://the_bucket/ local_location или многократного вызова awscli)?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Вы действительно находитесь в сложной ситуации.

Как только количество объектов в корзине увеличивается, их перечисление занимает много времени.Вызов API для списка объектов возвращает только 1000 объектов одновременно.Команды aws s3 sync и aws s3 cp ...* должны перечислять объекты для их копирования.

Альтернативой является использование Amazon S3 Inventory - Amazon Simple Storage Service , которая может обеспечитьЕжедневный CSV-файл со списком всех объектов, но это не соответствует вашему требованию загружать новые файлы каждый час.

Более сложный метод (но он будет работать) - создание события Amazon S3 всякий раз, когда новыйобъект создан.Затем вы можете обработать событие одним из двух способов:

  • Переместить событие в очередь Amazon SQS .Затем каждый час запускайте программу, которая будет обрабатывать сообщения в очереди и копировать файлы или
  • Запускать Лямбда-функцию AWS для каждого события.Функция Lambda может добавлять детали в базу данных, которую затем можно использовать каждый час, чтобы получить список файлов для копирования.
0 голосов
/ 03 апреля 2019

В ваших конкретных обстоятельствах (очень ограниченный доступ к ресурсам AWS) и вашим наблюдением

Используйте aws s3 ls s3: // the_bucket / local_location, чтобы найти все файлы в корзине и сравнить с индексом файлов, которые я ранее скачал, и которые я не хочу загружать снова. aws s3 ls очень быстро , однако, Я должен вызывать aws s3 cp s3: // the_bucket / the_file local_location один за другим, что очень медленно.

Я считаю, что третий вариант - ваша лучшая ставка, хотя с некоторыми замечаниями

1 /

aws s3 ls очень быстро

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

2 /

Мне нужно позвонить aws s3 cp s3://the_bucket/the_file local_location один за другим, который очень медленный.

Когда вы занимаетесь автоматизацией, она не должна быть медленнее, чем ваша система способна. Скорее всего, вы будете ограничены только пропускной способностью вашего Интернета. Подумайте о том, чтобы сделать несколько процессов, если у вас есть тонна небольших файлов, и настройте параллельный аспект CLI , а также

0 голосов
/ 02 апреля 2019

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

...