Сжатие изображений для S3 с помощью AWS Lambda
Важно: Lambda не проверяет загружаемые файлы от пользователей по умолчанию. Ограничьте размер и типы файлов, чтобы избежать злоупотреблений и перегрузки функций.
Быстрые ссылки
Почему уменьшать размер?
Начало работы

Краткое определение терминов
- Lambda — серверless-сервис AWS для запуска кода в ответ на события.
- S3 — объектное хранилище AWS для файлов и статического контента.
Почему уменьшать размер
Один из основных источников расходов в AWS — трафик. Передача больших изображений стоит дорого. Сжатие уменьшает объём передаваемых данных и объём хранения. Это снижает ежемесячный счёт и ускоряет загрузку страниц для пользователей.
JPEG включает контроль качества в стандарте. Файлы JPEG при кодировании примерно на 70% часто остаются резкими и визуально мало отличаются от 100% для веб-использования. Это даёт значительную экономию места без заметной потери качества.
Если вы разрешаете пользователям загружать изображения и не обрабатываете их, вы рискуете получить гигабайты больших фотографий, загруженных злоумышленниками или неосмотрительными пользователями. Это может замедлить приложение и увеличить затраты.
AWS не предоставляет встроенный инструмент, который автоматически сжимает пользовательские изображения в S3, поэтому оптимальным решением часто становится Lambda — функция, запускающаяся по событию (например, загрузке в бакет). Для видео существуют отдельные сервисы AWS, потому что кодирование видео требует больше CPU и специализированных инструментов.
Начало работы
- Откройте консоль Lambda и нажмите «Создать функцию».

- В репозитории безсерверных приложений уже есть готовое приложение для базового сжатия изображений. Нажмите «Обзор репозитория Serverless App Repository».

- В поле поиска введите:
evanchiu
Это приложение использует трансформации: оно создаёт исходный бакет, следит за загрузками и запускает функцию при появлении новых объектов. Функция сжимает изображение и кладёт результат в целевой бакет.
- Создайте целевой бакет вручную в консоли S3 — приложение создаёт только входной (source) бакет автоматически, а выходной (destination) бакет должен существовать заранее:

В настройках приложения в Lambda укажите имя целевого бакета (destination) и имя исходного бакета (source), которое будет создано приложением. Убедитесь, что имя исходного бакета ещё не занято, так как приложение должно владеть этим бакетом.
Укажите качество JPEG. Значение ~70 даёт хорошее соотношение «качество/размер», но проводите собственное A/B-тестирование для ваших изображений.

Нажмите «Deploy» — через несколько минут приложение развернётся. Вы увидите созданный входной бакет. При загрузке изображения в него Lambda автоматически создаст сжатую версию в целевом бакете.
При необходимости модифицируйте приложение: на вкладке «Функции» можно отредактировать код, изменить триггеры и настройки среды.

Практические рекомендации
- Ограничивайте максимальный размер загружаемых файлов и типы (MIME). Это защитит от загрузки нескольких гигабайтных файлов.
- Логируйте успешные и неуспешные трансформации в CloudWatch для диагностики и затратного анализа.
- Используйте версии и метаданные в целевом бакете, если нужно сохранять оригиналы.
- Для больших объёмов трафика рассмотрите доставку через CDN (CloudFront) вместе с сжатыми изображениями.
Альтернативные подходы
- Сжатие на стороне клиента: выполняйте базовое ресайз/сжатие в браузере перед загрузкой. Экономит ресурсы сервера и трафик.
- Контейнерная обработка (ECS/EKS): если нужен сложный pipeline или массовая перекодировка — контейнеры дают больше контроля над временем выполнения и зависимостями.
- Использовать специализированные сторонние сервисы оптимизации изображений (например, сервисы-оптимизаторы CDN). Они предлагают кэширование и преобразования на краю.
Когда этот метод не подходит
- Если нужно массово перекодировать большие архивы изображений или видео, Lambda с ограничением времени выполнения может оказаться неудобной.
- Если требуются нестандартные или очень дорогие алгоритмы (AI-улучшение, глубокая обработка), стоит использовать серверы с GPU или специализированные сервисы.
Мини-методология развертывания
- Подготовка: выберите политику IAM с минимумом прав на доступ к бакетам.
- Развёртывание: разверните приложение из Serverless App Repository и укажите бакеты.
- Тестирование: загрузите контрольные изображения, проверьте качество и размер.
- Наблюдение: включите CloudWatch логирование и метрики (ошибки, время выполнения).
- Итерация: скорректируйте качество JPEG и правила фильтрации файлов.
Ролевые чек-листы
Разработчик:
- Проверил код функции и зависимости.
- Настроил среду выполнения и переменные окружения.
DevOps/инженер по облаку:
- Создал и настроил целевой бакет в S3.
- Настроил политики IAM для функции.
- Включил CloudWatch и оповещения.
Продуктовый менеджер:
- Уточнил требования к качеству изображений.
- Определил лимиты на размер и типы файлов.
Критерии приёмки
- При загрузке тестового изображения в исходный бакет появляется сжатая копия в целевом бакете.
- Размер сжатого файла уменьшился по сравнению с оригиналом, а визуальная деградация принята командой.
- Нет неожиданных ошибок в логах Lambda и CloudWatch.
Контроль рисков и безопасность
- Применяйте минимально необходимые права IAM. Не давать функции больше прав, чем нужно.
- Валидируйте тип контента и размер на входе, чтобы избежать обхода ограничений и DOS-перегрузки.
- Если обрабатываете пользовательские файлы, удаляйте временные файлы и ограничьте время жизни объектов.
Быстрое руководство для тестирования (чек-лист)
- Загрузите высокоеразмерное изображение (несколько мегабайт) и проверьте появление сжатой версии.
- Проверьте качество при 70%, 85% и 50%, чтобы выбрать компромисс между качеством и размером.
- Убедитесь, что права доступа к целевому бакету защищают результаты.
Заключение
Сжатие изображений с помощью Lambda и готового приложения из Serverless Application Repository — простой и экономичный способ снизить расход трафика и хранение в S3. Подберите оптимальное значение качества JPEG, ограничьте входные файлы и мониторьте поведение функции. Для сложных задач рассмотрите контейнерные решения или специализированные сервисы.
Короткая справка:
- JPEG ~70% часто достаточно.
- Ограничьте типы файлов и размер.
- Логи и мониторинг — обязательны.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone