Как скопировать много файлов из AWS S3 за один вызов без рекурсии?

#amazon-web-services #amazon-s3 #aws-cli

#amazon-web-services #amazon-s3 #aws-cli

Вопрос:

Мне нужно скопировать много файлов (> 10 000) из 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 )?

Ответ №1:

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

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

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

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

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

Комментарии:

1. Джон, ты предлагаешь несколько хороших альтернатив. Однако у меня нет разрешения создавать лямбда-функции или помещать что-либо в очередь SQS; У меня есть разрешение только на перечисление файлов и копирование из корзины. Таким образом, мое затруднительное положение.

Ответ №2:

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

Ответ №3:

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

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

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

1/

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

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

2/

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

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

Комментарии:

1. 1: Я протестировал aws s3 ls --recursive , и он успешно рекурсивно перечисляет все элементы корзин, даже более 1000 файлов, даже с помощью всего одного вызова. 2: Я не думаю, что это правильно. При простом вызове awscli программы возникают накладные расходы

2. Хммм, наверняка вызов aws-cli повлечет за собой некоторые накладные расходы, особенно если у вас много очень маленьких файлов и вы вызываете их один за другим. Дело в том, что вы можете запускать столько процессов, сколько захотите, пока у вас не закончатся вычислительные мощности. Я почти уверен, что 20 одновременных процессов aws-cli сохранят вашу пропускную способность занятой, в то время как процессор все еще остается довольно расслабленным