Как перестать ждать завершения операций в S3
Репозиторий давно не обновлялся
Последнее обновление было 1 год назад.
Знакомая ситуация: запускаешь aws s3 cp для увесистого бэкапа или пары тысяч мелких логов, уходишь заварить чай, возвращаешься — а процесс едва перевалил за середину. Стандартный CLI от Amazon надежен, но когда дело доходит до скорости на больших объемах данных, он начинает напоминать неторопливого почтового голубя.
Недавно я наткнулся на инструмент под названием s5cmd. Это CLI-утилита на Go, которая делает ровно одну вещь, но делает её чертовски быстро: управляет объектами в S3 и локальной файловой системе. Если верить тестам, она может быть в 12 раз быстрее официального клиента AWS при загрузке данных.
Почему он работает быстрее других
Разработчики из Peak не стали изобретать велосипед, они просто правильно использовали возможности Go по работе с параллелизмом. Пока стандартный aws-cli последовательно перебирает файлы или использует ограниченный пул потоков, s5cmd агрессивно распараллеливает всё, что только можно.
Интересный факт из бенчмарков: при скачивании s5cmd способен полностью утилизировать канал в 40 Гбит/с, выдавая около 4.3 ГБ/с. Для сравнения, s3cmd на том же железе выжимает жалкие 85 МБ/с. Разница не просто в процентах, она в порядках.

Что умеет s5cmd кроме быстрой загрузки
Конечно, одной скоростью сыт не будешь. В инструменте реализовано много приятных мелочей, которые упрощают жизнь при ежедневной работе с облаком.
Работа с масками и вайлдкардами
В отличие от многих других утилит, s5cmd поддерживает многоуровневые маски. Вы можете написать что-то вроде:
s5cmd cp 's3://my-bucket/logs/2024/*/*.log' ./local-logs/
Утилита сначала соберет список всех объектов по префиксу до первой звездочки, а затем отфильтрует их в памяти и начнет параллельную загрузку. Это экономит кучу времени на лишних запросах к API.
Режим пакетного выполнения
Это, пожалуй, самая мощная фича. Вы можете составить текстовый файл со списком команд (тысячи строк!) и скормить его утилите:
s5cmd run commands.txt
Внутри файла могут быть перемещения, удаления, копирования. s5cmd создаст пул воркеров (по умолчанию 256) и начнет разгребать этот список. Это избавляет от необходимости запускать процесс для каждой команды отдельно, что критично, когда операций действительно много.
Умный Sync
Команда sync здесь работает по принципу «источник — истина». Она сравнивает размер и время модификации файлов. Если файл на источнике новее или отличается по размеру, он будет перезаписан. Можно добавить флаг --delete, чтобы удалять в целевой папке то, чего уже нет в источнике.
Прямая работа с содержимым
Иногда нужно просто глянуть, что внутри файла, не скачивая его целиком. Команда cat выводит содержимое в stdout, а pipe позволяет залить данные в S3 прямо из конвейера:
gzip -c large_log.txt | s5cmd pipe s3://my-bucket/logs/large_log.txt.gz
Практические кейсы
Я вижу три основных сценария, где s5cmd незаменим.
Во-первых, это миграция данных. Когда нужно перекинуть терабайты между бакетами или из локального хранилища в облако, разница между «закончится завтра» и «закончится через час» становится принципиальной.
Во-вторых, очистка старых данных. Удаление миллионов объектов через стандартные средства может затянуться на вечность. s5cmd использует S3 Batch Delete API, удаляя до 1000 объектов за один запрос.
В-третьих, работа с S3-совместимыми хранилищами. Инструмент отлично дружит с Google Cloud Storage, Minio или любым другим self-hosted решением. Достаточно прокинуть эндпоинт:
export S3_ENDPOINT_URL="https://storage.googleapis.com"
s5cmd ls
Технические нюансы и установка
Утилита написана на Go, поэтому установка сводится к скачиванию одного бинарника. Для macOS есть brew:
brew install peak/tap/s5cmd
Для Linux и Windows доступны готовые релизы на GitHub. Если у вас уже стоит Go 1.19+, можно собрать из исходников одной командой go install.
Кстати, про безопасность: s5cmd использует стандартные конфиги AWS (~/.aws/credentials), так что заново настраивать доступы не придется. Он поддерживает и IAM-роли в EC2/EKS, что удобно для автоматизации.
Стоит ли переходить
Если вы раз в неделю заливаете один конфиг в бакет, то aws-cli вам хватит за глаза. Но если ваша работа связана с обработкой больших датасетов, регулярными бэкапами или администрированием нагруженных хранилищ, s5cmd сэкономит вам часы ожидания.
Из минусов я бы отметил отсутствие полной совместимости с флагами aws-cli. Это не клон, а самостоятельный инструмент со своим синтаксисом, так что скрипты придется немного подправить. Также стоит быть аккуратным с количеством воркеров (--numworkers): на слабом железе или при очень агрессивных настройках можно упереться в лимиты API самого S3 (throttling), хотя встроенный механизм повторов (retry) с экспоненциальной задержкой пытается это сгладить.
В целом, это добротный, предсказуемый и очень быстрый инструмент, который просто работает. Если время для вас — ресурс, попробуйте s5cmd в деле.
