Перейти к содержанию
HexaTransfer
Вернуться к блогу
Технические погружения

S3-совместимая архитектура хранилища для передачи файлов

Постройте системы передачи файлов на S3-совместимом хранилище. Архитектурные паттерны, сравнение провайдеров и оптимизация производительности.

S3-совместимое хранилище — основа большинства современных сервисов передачи файлов, потому что API универсален, цены конкурентоспособны, а архитектура масштабируется без управления физическими дисками. AWS S3 создала эту модель, а клоны — Cloudflare R2, Backblaze B2, Wasabi, MinIO, DigitalOcean Spaces — реализуют тот же REST-интерфейс. Сервис передачи на S3-совместимом хранилище даёт долговечное объектное хранилище (11 девяток у AWS), составные загрузки для больших файлов и presigned URL для прямых передач браузер-в-хранилище в обход серверов приложений. Вот как правильно это проектировать.

Почему S3 API победил

S3 API фактически является стандартом. Amazon опубликовала его в 2006 году, и все крупные провайдеры объектного хранилища реализовали его для захвата рабочих нагрузок. Это означает, что хорошо написанный сервис передачи на AWS SDK for JavaScript (aws-sdk v3) может переключаться между провайдерами, меняя только URL конечной точки. Open-source клиенты minio-js, MinIO mc CLI и rclone работают неизменно у всех провайдеров. Это даёт архитекторам гибкость: начать на AWS S3 для надёжности, перейти на Cloudflare R2 ради нулевых сборов за исходящий трафик или запустить MinIO локально для локализации данных — без переписывания кода приложения. Это важно и для российских компаний, обязанных хранить персональные данные граждан РФ в России согласно 152-ФЗ — MinIO на отечественном оборудовании закрывает этот вопрос.

Сравнение провайдеров для нагрузок передачи

| Провайдер | Хранилище | Исходящий трафик | Бесплатный тариф | Особенности | |---|---|---|---|---| | AWS S3 Standard | $0,023/ГБ | $0,09/ГБ | 5 ГБ, 15 ГБ трафика/мес | 11 девяток надёжности | | Cloudflare R2 | $0,015/ГБ | $0 | 10 ГБ, 1 млн чтений/мес | Нулевые сборы за трафик | | Backblaze B2 | $0,006/ГБ | $0,01/ГБ | 10 ГБ бесплатно | Bandwidth alliance с Cloudflare | | Wasabi | $0,0069/ГБ | $0 | Нет (только платный) | Минимум хранения 90 дней | | MinIO self-hosted | Стоимость железа | Ваш трафик | Open source | AGPL v3, работает везде | | DigitalOcean Spaces | $5/мес за 250 ГБ | 1 ТБ включён | Нет | Фиксированные цены |

Для сервиса передачи, где файлы хранятся недолго и скачиваются, исходящий трафик доминирует в стоимости. Cloudflare R2 и Backblaze B2 (через Bandwidth Alliance) выигрывают по цене. AWS S3 выигрывает по функциям — Intelligent-Tiering, политики жизненного цикла.

Составная загрузка для больших файлов

API составной загрузки S3 — это то, как сервисы передачи обрабатывают файлы свыше 5 ГБ. Вы инициируете через InitiateMultipartUpload, загружаете каждый чанк через UploadPart (минимум 5 МБ, максимум 5 ГБ на часть, 10 000 частей), и завершаете через CompleteMultipartUpload со списком ETag. Части загружаются параллельно. Неудавшиеся части повторяются независимо. Клиенты используют presigned URL для каждой части, чтобы загрузки шли напрямую от браузера в S3, полностью минуя серверы приложений. Максимальный размер объекта в S3 — 5 ТБ, что покрывает практически любой сценарий передачи.

Presigned URL и прямые загрузки

Presigned URL позволяют клиенту загружать или скачивать напрямую в/из S3 без того, чтобы ваши серверы касались байт. Бэкенд генерирует URL, подписанный HMAC-SHA256 и учётными данными AWS, действительный определённое время (обычно 1–24 часа). Клиент PUT или GET по URL. Этот паттерн экономит серьёзные деньги: серверам приложений не нужна пропускная способность для проксирования 10-гигабайтных файлов, и задержка снижается, потому что клиенты обращаются напрямую к конечной точке хранилища. Конфигурация CORS на бакете разрешает загрузки из браузера с вашего origin. Используйте SSE-C (серверное шифрование с ключами клиента) или SSE-KMS для шифрования в покое.

Архитектурные паттерны для сервисов передачи

Типичная S3-backed архитектура передачи имеет три уровня. Фронтенд работает в браузере, инициируя составные загрузки и отслеживая прогресс чанков. API-бэкенд (небольшой сервис на Node.js, Go или Python) обрабатывает аутентификацию, хранение метаданных в PostgreSQL или DynamoDB и генерацию presigned URL. Уровень хранилища — S3-совместимый бакет. Эта архитектура масштабируется горизонтально, потому что уровень приложения не имеет состояния, а уровень хранилища поглощает всю пропускную способность. Добавление CDN (Cloudflare или CloudFront) перед GET-запросами улучшает скорость скачивания глобально и снижает исходящий трафик из S3.

Политики жизненного цикла и автоудаление

Сервисам передачи нужно, чтобы файлы истекали автоматически. Правила жизненного цикла S3 переводят объекты между классами хранилища или удаляют их по возрасту. Правило «удалять объекты старше 7 дней» запускается ежедневно и очищает истёкшие передачи без затрат. Cloudflare R2 поддерживает правила жизненного цикла через Terraform или R2 API. Для более тонкого контроля тегируйте каждый объект временной меткой истечения и запускайте ежедневный Lambda, удаляющий по тегам. У незавершённых составных загрузок должно быть своё правило — AbortIncompleteMultipartUpload через 1–7 дней освобождает хранилище от неполных сессий.

Оптимизация производительности

Пропускная способность S3 масштабируется с префиксом. AWS S3 нацелена на 3 500 PUT/с и 5 500 GET/с на префикс в бакете, используя консистентное хеширование первых символов ключа для распределения нагрузки. Избегайте последовательных ключевых префиксов (001, 002, 003) — они хешируются в одну и ту же партицию, создавая горячие точки; используйте случайные префиксы или ключи на основе хешей (первые 8 символов UUID). Составные загрузки улучшают пропускную способность для отдельных передач; параллельные соединения через ключи улучшают совокупную пропускную способность. Transfer Acceleration маршрутизирует загрузки через ближайшее ребро CloudFront и может сократить время загрузки на 50–500% для удалённых клиентов с дополнительной стоимостью.

Варианты шифрования и их компромиссы

Серверное шифрование предлагает три варианта. SSE-S3 (или шифрование R2 по умолчанию) использует AES-256 с ключами, управляемыми провайдером — прозрачно и бесплатно. SSE-KMS использует ключи AWS KMS, стоит $0,03 на 10 000 запросов плюс ключевые сборы и производит журналы KMS, полезные для соответствия. SSE-C принимает предоставленный клиентом ключ на каждый запрос, сервер шифрует им и уничтожает ключ, поэтому клиент должен предоставлять его при каждом чтении — неудобно, но ключи не попадают под контроль провайдера. Для истинного E2EE шифруйте на стороне клиента перед загрузкой через libsodium или AES-GCM Web Crypto, затем обращайтесь с хранимым объектом как с непрозрачным шифртекстом.

Мониторинг, метрики и неожиданные счета

Следите за метриками бакета в CloudWatch (AWS), дашборде R2 или аналоге провайдера. Ключевые метрики: BucketSizeBytes, NumberOfObjects, AllRequests, 4xxErrors, 5xxErrors и BytesDownloaded. Неожиданные всплески исходящего трафика часто указывают на hotlinking (кто-то встроил ваш presigned URL на популярном сайте) или бот, загружающий в цикле. Установите оповещения о счёте на 50, 80 и 100% бюджета. Cloudflare R2 выставляет счёт иначе: операции Class A (записи) по $4,50 за миллион, Class B (чтения) по $0,36 за миллион, плюс хранилище. Рассчитайте для своего микса трафика перед принятием решения.

Пример интеграции и подход HexaTransfer

Минимальный поток передачи: клиент запрашивает токен загрузки, бэкенд генерирует presigned URL для инициации составной загрузки, клиент загружает чанки напрямую в S3, бэкенд сохраняет метаданные и возвращает шаренную ссылку, получатель кликает на ссылку, бэкенд генерирует presigned URL для скачивания, браузер получает и расшифровывает. HexaTransfer использует этот паттерн с клиентским шифрованием AES-256-GCM, поэтому S3-совместимый бэкенд хранит только шифртекст, а ключ шифрования никогда не покидает браузер.

Попробуйте на hexatransfer.com — бесплатно, без регистрации, до 10 ГБ.

Безопасная отправка больших файлов со сквозным шифрованием

Передавайте файлы до 10 ГБ бесплатно со сквозным шифрованием. Регистрация не требуется. Ваши файлы шифруются в браузере перед загрузкой — никто другой не может их прочитать.

Отправить файл