Как перестать ждать завершения операций в S3

23 июн 2026

Репозиторий давно не обновлялся

Последнее обновление было 1 год назад.

4,198
347
35
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 в деле.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.