Рейтинг:2

Как *на самом деле* исключить каталог из синхронизации AWS S3?

флаг in
DMJ

авс s3 синхронизация команда имеет --исключать флаг, который позволяет исключить папку из синхронизации. Однако даже если файлы не загружаются из этого каталога, команда все равно просматривает и обрабатывает все файлы в этой папке. Причина, по которой я хотел исключить эту папку в первую очередь, заключалась в том, что это очень большая папка, содержащая много данных, причем данные, которые я действительно хочу синхронизировать, занимают всего несколько МБ в родительской папке и нескольких других подпапках. Однако синхронизация этих нескольких МБ занимает несколько минут из-за нескольких ГБ данных в этой подпапке данных. Есть ли способ, которым я могу на самом деле исключить (например, даже из просмотра или обработки) эту подпапку, чтобы команда синхронизации выполнялась в разумные сроки?

Рейтинг:3
флаг cn

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

S3 на самом деле не имеет никакой структуры, ведро просто имеет плоский набор объектов с полной строкой, которую можно рассматривать как «путь», являющийся ключом каждого объекта.
Действие API ListObjectsV2 однако предоставляет такие функции, как указание префикса (возвращает только объекты, имеющие ключ, начинающийся с определенной строки) и возможность указания разделителя (разделяет ключи по указанному разделителю и группирует повторяющиеся сегменты ключа), которые позволяют представить содержимое ведро, как если бы оно имело структуру (например, как это делает консоль AWS).

авс s3 синхронизация утилита предположительно тоже начинает работать с нормального Действие API ListObjectsV2, но этот API не имеет функций, эквивалентных --исключать (или же --включать) в утилите синхронизации, только возможность получить список, отфильтрованный по префиксу ключа.
Следовательно, может показаться, что утилита синхронизации должна выполнять обработку этих более гибких параметров фильтрации на стороне клиента, поскольку она обрабатывает полный список объектов для указанного префикса, что никогда не будет действительно эффективным, если имеется большое количество объектов. под указанным префиксом, которые должны быть пропущены.

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

флаг in
DMJ
Я вижу, это имеет смысл в контексте загрузки с S3. Однако это не имеет смысла в контексте загрузки: файловая система, из которой я загружаю, действительно имеет определенную структуру, даже если S3 — это просто пары ключ-значение. Я полагаю, возможно, в этой ситуации это просто отсутствие оптимизации для этого варианта использования?
флаг cn
@DMJ Правильно, если вы специально рассматриваете случай «загрузка из локальной файловой системы в s3», я полагаю, не имеет большого значения, что противоположный случай еще более проблематичен для оптимизации. Дополнительная проблема, которая также применима к локальному случаю, заключается в том, что `--exclude` может быть шаблоном, написанным для соответствия любой части пути, поэтому использование шаблона, который по существу соответствует начальному каталогу, кажется, что его можно оптимизировать для локального файловая система, общий случай по-прежнему требует рекурсивного просмотра всех файлов локально. Я могу представить, что они не оптимизированы для этого особого случая.
Рейтинг:0
флаг in
DMJ

Хотя ответ Хакана Линдквиста кажется технически правильным, он, к сожалению, не решил проблему. Синхронизация (загрузка) нескольких МБ занимала целых 30 минут из-за большой подпапки, которая все равно исключалась. Поскольку интерфейс командной строки AWS изначально не поддерживает нужные мне функции, вместо этого я обратился к другому инструменту: скрипту оболочки.

#!/бин/ш

для локального файла в /home/path/to/source/files/*.*
делать 
aws s3 cp "$localfile" s3://path/to/bucket/
сделано

aws s3 sync /home/path/to/source/files/subfolder1 s3://path/to/bucket/subfolder1
aws s3 sync /home/path/to/source/files/subfolder2 s3://path/to/bucket/subfolder2
aws s3 sync /home/path/to/source/files/subfolder3 s3://path/to/bucket/subfolder3
# Намеренно пропускаем подпапку 4
aws s3 sync /home/path/to/source/files/subfolder5 s3://path/to/bucket/subfolder5
aws s3 sync /home/path/to/source/files/subfolder6 s3://path/to/bucket/subfolder6
aws s3 sync /home/path/to/source/files/subfolder7 s3://path/to/bucket/subfolder7
aws s3 sync /home/path/to/source/files/subfolder8 s3://path/to/bucket/subfolder8
aws s3 sync /home/path/to/source/files/subfolder9 s3://path/to/bucket/subfolder9
aws s3 sync /home/path/to/source/files/subfolder10 s3://path/to/bucket/subfolder10

Хотя этот подход решил проблему, с которой я столкнулся в моих конкретных обстоятельствах, он не лишен недостатков:

  • авс s3 кп команда всегда загружает файл, даже если он не изменился с прошлого раза
  • Запуск авс s3 кп команда в цикле for кажется мне заметно медленнее, чем авс s3 синхронизация команда обычно находится при нормальных обстоятельствах.
  • Основываясь на ответе Хокана Линдквиста, я не уверен, что этот подход поможет кому-то, кто загружает, а не загружает
  • Не кроссплатформенный (это не сработает в Windows. К счастью для меня, я на Linux.)

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

Ответить или комментировать

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