Serverless-обработка файлов: Lambda + S3 trigger под ключ

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Serverless-обработка файлов: Lambda + S3 trigger под ключ
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    956
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Serverless-обработка файлов: Lambda + S3 trigger под ключ

При загрузке изображений в S3 нужно автоматически генерировать thumbnails, но Lambda не справляется с большими файлами. Нужна отказоустойчивая архитектура с очередями и мониторингом. Мы — команда с опытом serverless-разработки — построили десятки таких систем. В этой статье разберём типовую архитектуру, обработку ошибок и подводные камни.

Lambda + S3 trigger — классический serverless паттерн для обработки файлов. Файл загружается в S3, событие автоматически запускает Lambda, которая обрабатывает файл и сохраняет результат. Не нужен постоянно работающий сервер, масштабирование автоматическое. Однако без правильной схемы с очередями вы рискуете потерять события. Экономия на инфраструктуре может достигать 70% по сравнению с выделенным сервером, а стоимость обработки одного файла снижается в 3-5 раз. Рассмотрим, как построить production-grade обработку с очередями, DLQ и мониторингом.

Какие задачи решает Lambda + S3 и базовая архитектура

Типовые задачи: генерация thumbnail при загрузке изображения, конвертация видео в разные форматы и разрешения, обработка CSV/Excel файлов с импортом данных в БД, PDF-генерация из шаблонов, антивирусное сканирование загружаемых файлов, OCR и извлечение текста из документов, трансформация данных (XML → JSON, нормализация).

Тип файла Примеры Рекомендуемый подход
Изображения JPG, PNG, WebP Lambda + Pillow
Документы PDF, DOCX Lambda + pdfminer, python-docx
Видео MP4, AVI AWS MediaConvert
Таблицы CSV, XLSX Lambda + pandas (стриминг)
Архивы ZIP, RAR Lambda + zipfile (стриминг)

Базовая архитектура:

[Пользователь] → S3 upload → [S3 Event Notification]
                                      ↓
                              [Lambda Function]
                                      ↓
                      [Обработанный файл → S3 Output]
                      [Метаданные → DynamoDB]
                      [Нотификация → SQS/SNS]
# S3 bucket для входящих файлов
resource "aws_s3_bucket" "uploads" {
  bucket = "myapp-uploads"
}

# S3 bucket для обработанных файлов
resource "aws_s3_bucket" "processed" {
  bucket = "myapp-processed"
}

# Объединённая конфигурация: S3 → SNS → SQS
resource "aws_s3_bucket_notification" "upload_trigger" {
  bucket = aws_s3_bucket.uploads.id

  topic {
    topic_arn = aws_sns_topic.file_events.arn
    events    = ["s3:ObjectCreated:*"]
  }
}

resource "aws_sns_topic_subscription" "to_sqs" {
  topic_arn = aws_sns_topic.file_events.arn
  protocol  = "sqs"
  endpoint  = aws_sqs_queue.file_processing.arn
}

Как масштабировать обработку при пиковых нагрузках?

Lambda масштабируется автоматически, но при резком всплеске загрузок может возникнуть троттлинг. Мы используем SQS-очередь для буферизации: S3 → SNS → SQS → Lambda. Это гарантирует, что ни одно событие не потеряется. При превышении лимита concurrent executions очередь накапливает сообщения, и Lambda обрабатывает их по мере освобождения. Для критичных задач настраиваем Reserved Concurrency.

Обработчик Lambda и большие файлы

import boto3
import json
import os
from urllib.parse import unquote_plus
from PIL import Image
import io

s3 = boto3.client('s3')

def handler(event, context):
    results = []
    
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = unquote_plus(record['s3']['object']['key'])
        
        try:
            result = process_image(bucket, key)
            results.append({'key': key, 'status': 'success', **result})
        except Exception as e:
            print(f"Error processing {key}: {e}")
            results.append({'key': key, 'status': 'error', 'error': str(e)})
    
    return results

def process_image(bucket: str, key: str) -> dict:
    # Скачать оригинал
    obj = s3.get_object(Bucket=bucket, Key=key)
    image_data = obj['Body'].read()
    
    image = Image.open(io.BytesIO(image_data))
    
    thumbnails = {}
    for size_name, (width, height) in [('sm', (150, 150)), ('md', (400, 400)), ('lg', (800, 800))]:
        thumb = image.copy()
        thumb.thumbnail((width, height), Image.LANCZOS)
        
        buffer = io.BytesIO()
        thumb.save(buffer, format=image.format or 'JPEG', quality=85)
        buffer.seek(0)
        
        output_key = key.replace('images/', f'thumbnails/{size_name}/')
        s3.put_object(
            Bucket=os.environ['OUTPUT_BUCKET'],
            Key=output_key,
            Body=buffer,
            ContentType=f'image/{(image.format or "JPEG").lower()}'
        )
        thumbnails[size_name] = output_key
    
    return {'thumbnails': thumbnails, 'original_size': image.size}

Lambda имеет ограничения: /tmp до 10 ГБ, timeout до 15 минут, память до 10 ГБ. Для файлов >100 МБ применяем стриминг, обрабатывая данные по частям без загрузки в память целиком.

Почему SNS+SQS надёжнее прямого вызова Lambda?

S3 event notifications не поддерживают DLQ напрямую. Если Lambda завершится ошибкой, событие теряется. Схема с SNS и SQS гарантирует доставку: неудачные вызовы после N попыток попадают в DLQ. Вы сможете проанализировать и перезапустить обработку. Это соответствует best practices AWS для продакшена.

Подробнее о конфигурации DLQ

Для SQS-очереди настраивается redrive policy: после, например, 5 неудачных попыток сообщение перемещается в DLQ. Это позволяет не терять события и анализировать ошибки.

Lambda vs ECS: что выбрать?

Критерий Lambda ECS Fargate
Макс. время выполнения 15 мин Не ограничено
Макс. память 10 ГБ 30 ГБ
Стоимость За миллисекунды За vCPU/час
Масштабирование Мгновенное 30–60 сек
Оптимально для Краткие задачи (<15 мин) Долгие задачи, high memory

Для обработки изображений и документов Lambda проще и дешевле. Для видео-транскодинга используем MediaConvert.

Конфигурация Lambda для обработки файлов

resource "aws_lambda_function" "processor" {
  filename         = "processor.zip"
  function_name    = "file-processor"
  role             = aws_iam_role.processor.arn
  handler          = "handler.handler"
  runtime          = "python3.12"
  timeout          = 300
  memory_size      = 1024
  
  ephemeral_storage {
    size = 2048
  }
  
  environment {
    variables = {
      OUTPUT_BUCKET = aws_s3_bucket.processed.bucket
    }
  }
}

Мониторинг и метрики

  • Число обработанных файлов в час
  • Среднее время обработки по типу файла
  • Error rate + содержимое DLQ
  • Lambda duration distribution

CloudWatch Dashboard с этими метриками + алерт при росте DLQ.

Что входит в работу и ориентировочные сроки

  • Разработка Lambda-функции на Python (или Node.js/Go) под ваш тип файлов
  • Инфраструктура Terraform / Pulumi с S3, SNS, SQS, DLQ
  • Настройка мониторинга CloudWatch + алерты
  • Код-ревью и тестирование на нагрузку до 1000 файлов/мин
  • Документация архитектуры и инструкция по деплою
  • Обучение команды заказчика (1-2 часа)
  • Поддержка 2 недели после сдачи

Ориентировочные сроки:

  • Анализ требований и прототип — 2-3 дня
  • Полный pipeline с DLQ, мониторингом — 4-6 дней
  • Интеграция с вашим приложением (API Gateway, Cognito — опционально) — 2-5 дней

Реальные сроки зависят от сложности обработки. Свяжитесь с нами — оценим ваш проект за 1 день. Закажите консультацию и получите предварительную оценку без обязательств.

Serverless-разработка: AWS Lambda, Vercel Functions, Cloudflare Workers, Edge

Serverless не означает «без сервера». Серверы есть — вы просто не управляете ими. Правильнее читать это как «без менеджмента серверов»: нет патчинга ОС, нет настройки nginx, нет мониторинга дискового пространства. Функция получает событие, обрабатывает, возвращает ответ. Провайдер сам решает, на чём это запустить.

AWS Lambda: мощь и операционная сложность

Lambda — самая зрелая платформа с наибольшим набором триггеров: API Gateway, SQS, SNS, S3, DynamoDB Streams, EventBridge. Это важно для сложных event-driven архитектур.

Cold start — главная боль Lambda на Node.js: от 200ms до 1.5s в зависимости от размера бандла и VPC. В VPC холодный старт был до 10 секунд до 2019 года, сейчас улучшили, но он всё ещё дольше. Для production-функций с latency-требованиями: Provisioned Concurrency (держит инстансы прогретыми), SnapStart для Java, минимизация бандла через tree-shaking.

Практический кейс: функция обработки загружаемых изображений (ресайз, WebP-конвертация, загрузка в S3). Бандл с sharp весил 40MB из-за нативных бинарников. Решение — Lambda Layer с sharp, основная функция 800KB. Cold start упал с 3.2s до 400ms.

Lambda Layers — общие зависимости между функциями. До 5 слоёв на функцию, каждый до 250MB. Стандартная практика: layer с heavy dependencies (sharp, puppeteer, ffmpeg), layer с общей бизнес-логикой.

Инфраструктура Lambda через AWS CDK или Terraform. SAM — для тех, кто только начинает, CDK — для серьёзных проектов с типобезопасностью.

Vercel Functions и Edge Runtime

Vercel Functions — это Lambda под капотом (us-east-1 по умолчанию), но с минимальным порогом входа для Next.js-проектов. API Routes и Route Handlers деплоятся автоматически. Serverless функции на Node.js runtime с лимитом в 300 секунд на Vercel Pro.

Edge Runtime принципиально другой: функция запускается на V8 isolate в ближайшей к пользователю точке CDN-сети Vercel (120+ регионов). Нет cold start как такового — isolate стартует за ~0ms. Но жёсткие ограничения: нет Node.js API (fs, crypto через Web API), нет доступа к базам данных через TCP (только через HTTP API), размер бандла до 4MB.

Edge Runtime идеален для: middleware (auth check, redirect, A/B test), трансформации ответов, геолокационной логики, Edge Config. Не подходит для: обращения к PostgreSQL, тяжёлых вычислений, работы с файловой системой.

Cloudflare Workers: настоящий Edge

Workers запускаются на V8 isolates в 300+ точках присутствия Cloudflare. Latency для пользователя — буквально ближайший дата-центр. Cold start < 1ms.

Workers Durable Objects решают проблему состояния в Edge: каждый Durable Object — это одна точка координации, выполняется в одном регионе. Идеально для: игровых комнат, документов с реальным временем, rate limiting без гонок.

Workers KV — eventually consistent хранилище. Запись распространяется по всем регионам за ~60 секунд. Не подходит для финансовых транзакций, подходит для конфигов, feature flags, кэша.

D1 — SQLite на Edge. На одной реплике для чтения работает отлично, write latency зависит от расстояния до primary региона. Для глобальных write-heavy приложений — не лучший выбор.

Ecosystem: Hono.js — минималистичный роутер, работающий на Workers, Deno, Bun, Node.js. Если нужен единый код для Edge и сервера — хороший выбор.

Когда serverless не подходит

Длительные вычисления (>15 минут на Lambda, >30 секунд на Vercel) — нужен Fargate или обычный сервер. WebSocket-сервер с состоянием — нет постоянного процесса. Задачи с частым обращением к диску — эфемерный storage, /tmp на Lambda 512MB–10GB. Если функция вызывается тысячи раз в секунду постоянно — EC2 или Fargate дешевле.

Vendor lock-in — реальная проблема. Lambda-специфичный код (handler-сигнатура, Lambda context) сложно портировать. Hono.js, Remix, или адаптеры типа @hono/node-server помогают держать логику portable.

Observability

Без нормального observability serverless — чёрный ящик. Стандарт: AWS X-Ray или Powertools for AWS Lambda (structured logging, tracing, metrics из коробки). Для мультиоблачного стека — OpenTelemetry с экспортом в Grafana Cloud или Honeycomb.

Distributed tracing критичен когда функция А вызывает функцию Б через SQS — без trace ID невозможно связать логи.

Процесс работы

Начинаем с анализа паттерна нагрузки: если трафик непредсказуемый или редкий — serverless даст экономию. Если стабильно высокий — может оказаться дороже. Проектируем границы функций по принципу single responsibility. Разрабатываем локально через SST, Wrangler или LocalStack. CI/CD с preview deployments обязательно.

Сроки

Serverless API для стартапа (10–20 функций): 2–5 недель. Миграция монолитного Laravel/Node API на Lambda: 4–10 недель в зависимости от объёма. Edge Middleware + Workers для глобального продукта: 2–4 недели.