Гид по технологиям

Сжатие изображений для S3 с помощью AWS Lambda

5 min read AWS Обновлено 17 Dec 2025
Сжатие изображений в AWS Lambda для S3
Сжатие изображений в AWS Lambda для S3

Важно: Lambda не проверяет загружаемые файлы от пользователей по умолчанию. Ограничьте размер и типы файлов, чтобы избежать злоупотреблений и перегрузки функций.

Быстрые ссылки

  • Почему уменьшать размер?

  • Начало работы

Логотип Amazon S3

Краткое определение терминов

  • Lambda — серверless-сервис AWS для запуска кода в ответ на события.
  • S3 — объектное хранилище AWS для файлов и статического контента.

Почему уменьшать размер

Один из основных источников расходов в AWS — трафик. Передача больших изображений стоит дорого. Сжатие уменьшает объём передаваемых данных и объём хранения. Это снижает ежемесячный счёт и ускоряет загрузку страниц для пользователей.

JPEG включает контроль качества в стандарте. Файлы JPEG при кодировании примерно на 70% часто остаются резкими и визуально мало отличаются от 100% для веб-использования. Это даёт значительную экономию места без заметной потери качества.

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

AWS не предоставляет встроенный инструмент, который автоматически сжимает пользовательские изображения в S3, поэтому оптимальным решением часто становится Lambda — функция, запускающаяся по событию (например, загрузке в бакет). Для видео существуют отдельные сервисы AWS, потому что кодирование видео требует больше CPU и специализированных инструментов.

Начало работы

  1. Откройте консоль Lambda и нажмите «Создать функцию».

Создание функции в Lambda

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

Обзор репозитория приложений

  1. В поле поиска введите:
evanchiu

Поиск приложения compress

Это приложение использует трансформации: оно создаёт исходный бакет, следит за загрузками и запускает функцию при появлении новых объектов. Функция сжимает изображение и кладёт результат в целевой бакет.

  1. Создайте целевой бакет вручную в консоли S3 — приложение создаёт только входной (source) бакет автоматически, а выходной (destination) бакет должен существовать заранее:

Консоль S3

  1. В настройках приложения в Lambda укажите имя целевого бакета (destination) и имя исходного бакета (source), которое будет создано приложением. Убедитесь, что имя исходного бакета ещё не занято, так как приложение должно владеть этим бакетом.

  2. Укажите качество JPEG. Значение ~70 даёт хорошее соотношение «качество/размер», но проводите собственное A/B-тестирование для ваших изображений.

Настройки приложения: имя бакета и качество JPEG

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

  2. При необходимости модифицируйте приложение: на вкладке «Функции» можно отредактировать код, изменить триггеры и настройки среды.

Вкладка Functions для правки приложения

Практические рекомендации

  • Ограничивайте максимальный размер загружаемых файлов и типы (MIME). Это защитит от загрузки нескольких гигабайтных файлов.
  • Логируйте успешные и неуспешные трансформации в CloudWatch для диагностики и затратного анализа.
  • Используйте версии и метаданные в целевом бакете, если нужно сохранять оригиналы.
  • Для больших объёмов трафика рассмотрите доставку через CDN (CloudFront) вместе с сжатыми изображениями.

Альтернативные подходы

  • Сжатие на стороне клиента: выполняйте базовое ресайз/сжатие в браузере перед загрузкой. Экономит ресурсы сервера и трафик.
  • Контейнерная обработка (ECS/EKS): если нужен сложный pipeline или массовая перекодировка — контейнеры дают больше контроля над временем выполнения и зависимостями.
  • Использовать специализированные сторонние сервисы оптимизации изображений (например, сервисы-оптимизаторы CDN). Они предлагают кэширование и преобразования на краю.

Когда этот метод не подходит

  • Если нужно массово перекодировать большие архивы изображений или видео, Lambda с ограничением времени выполнения может оказаться неудобной.
  • Если требуются нестандартные или очень дорогие алгоритмы (AI-улучшение, глубокая обработка), стоит использовать серверы с GPU или специализированные сервисы.

Мини-методология развертывания

  1. Подготовка: выберите политику IAM с минимумом прав на доступ к бакетам.
  2. Развёртывание: разверните приложение из Serverless App Repository и укажите бакеты.
  3. Тестирование: загрузите контрольные изображения, проверьте качество и размер.
  4. Наблюдение: включите CloudWatch логирование и метрики (ошибки, время выполнения).
  5. Итерация: скорректируйте качество JPEG и правила фильтрации файлов.

Ролевые чек-листы

Разработчик:

  • Проверил код функции и зависимости.
  • Настроил среду выполнения и переменные окружения.

DevOps/инженер по облаку:

  • Создал и настроил целевой бакет в S3.
  • Настроил политики IAM для функции.
  • Включил CloudWatch и оповещения.

Продуктовый менеджер:

  • Уточнил требования к качеству изображений.
  • Определил лимиты на размер и типы файлов.

Критерии приёмки

  • При загрузке тестового изображения в исходный бакет появляется сжатая копия в целевом бакете.
  • Размер сжатого файла уменьшился по сравнению с оригиналом, а визуальная деградация принята командой.
  • Нет неожиданных ошибок в логах Lambda и CloudWatch.

Контроль рисков и безопасность

  • Применяйте минимально необходимые права IAM. Не давать функции больше прав, чем нужно.
  • Валидируйте тип контента и размер на входе, чтобы избежать обхода ограничений и DOS-перегрузки.
  • Если обрабатываете пользовательские файлы, удаляйте временные файлы и ограничьте время жизни объектов.

Быстрое руководство для тестирования (чек-лист)

  • Загрузите высокоеразмерное изображение (несколько мегабайт) и проверьте появление сжатой версии.
  • Проверьте качество при 70%, 85% и 50%, чтобы выбрать компромисс между качеством и размером.
  • Убедитесь, что права доступа к целевому бакету защищают результаты.

Заключение

Сжатие изображений с помощью Lambda и готового приложения из Serverless Application Repository — простой и экономичный способ снизить расход трафика и хранение в S3. Подберите оптимальное значение качества JPEG, ограничьте входные файлы и мониторьте поведение функции. Для сложных задач рассмотрите контейнерные решения или специализированные сервисы.

Короткая справка:

  • JPEG ~70% часто достаточно.
  • Ограничьте типы файлов и размер.
  • Логи и мониторинг — обязательны.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство