Настройка CI/CD для Serverless-приложений (SAM/Serverless Framework)

Ручные шаги в выкладке serverless-приложений тормозят релизы и делают откаты рискованными. Мы настраиваем CI/CD под ключ: конвейер собираем под ваш процесс, сокращая время выпуска и снижая долю сбоев. Обсудим задачу и вернёмся с планом работ.
Часто задаваемые вопросы

Что ломается в CI/CD serverless при росте команды

Пока функций десяток и релизит один человек, выкладка держится на его локальной машине и памяти: собрал, залил, проверил, написал в чат. При росте команды тот же порядок рассыпается — несколько разработчиков правят одну декларацию функций (SAM, Serverless Framework), ручные релизы идут параллельно, и никто не видит полной картины изменений.

Первый симптом — рассинхрон сред. На тестовом контуре другие переменные окружения, роли и лимиты, часть триггеров и очередей когда-то завели руками через консоль. Развёртывание в прод либо затирает эти ресурсы, либо падает на конфликте имён, и релиз превращается в разбор отличий стенда от прода вместо выпуска изменений.

Отката как штатной операции нет. Предыдущая версия функции в облаке остаётся, но переключение трафика на неё делают руками, а если вместе с кодом менялись схема событий или права — возврат становится отдельной аварийной задачей. Ночью это обходится дороже всего: восстановление измеряется не минутами, а часами переписки и ручных команд.

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

Измеримые эффекты: скорость выкладки и доля отказов

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

После перевода на управляемый конвейер конфигурация функций, прав и событий описывается декларативно: на AWS SAM и близких инструментах один файл остаётся источником правды для всех окружений. Сборка идёт в изолированном окружении из зафиксированных зависимостей, поэтому расхождение «локально работает, в облаке нет» перестаёт существовать как класс. Время выкладки сокращается до 5-8 минут, и сама выкладка становится рутиной, а не событием.

Доля успешных релизов растёт с примерно 70% до 95% и выше. Уходят отказы, связанные с конфигурацией: забытая переменная окружения, избыточные права у роли, разошедшиеся версии библиотек. Остаются логические дефекты в коде — их закрывает прогон тестов до продакшена.

Меняется и частота: вместо двух плановых выпусков в неделю — несколько выкладок в день по готовности. Изменения становятся мелкими, поверхность отказа — узкой, а откат занимает 1-2 минуты, потому что артефакт неизменяем и переключается ссылка на него.

Эффект считаем до начала работ и после: время от изменения кода до продакшена, доля выкладок без ручного вмешательства, среднее время возврата на предыдущую версию и число релизов в неделю.

Режимы выкладки в CI/CD serverless: сравнение подходов

Режим выкладки выбирают не по размеру команды, а по тому, как функция получает трафик. Синхронный вызов через шлюз можно развести по весам и посмотреть на долю ошибок, асинхронный триггер из очереди или по расписанию — нет: там новая версия забирает все события сразу, и ограничить влияние можно только переключением привязки или возвратом предыдущей версии.

Вариант Когда уместен Чем ограничен
Полная выкладка одним прогоном Стенд, внутренние сервисы, связка из нескольких функций, меняющихся вместе Промежуточного контроля нет: ошибку видно только по факту, откат — повторная выкладка предыдущего набора
Постепенный релиз долями трафика Прод с живым потоком запросов и метриками на входе Нужны автоматические критерии остановки; асинхронные вызовы по долям не делятся
Переключение сред Критичный сервис, где важен предсказуемый откат за секунды Двойной набор ресурсов; внешние хранилища и схемы данных общие, миграции придётся делать совместимыми
Новая версия с алиасом Нужен мгновенный возврат без пересборки и повторного прогона тестов Требует политики хранения версий и контроля, чтобы алиас не отставал от привязок триггеров

Рабочая схема — не один режим на всё, а свой для каждой группы функций: обработчики API идут долями, фоновые задачи переключаются целиком. В AWS Lambda и родственных платформах веса и алиасы задаются в том же шаблоне, что и сама функция, поэтому стратегия выкладки версионируется вместе с кодом и проходит ревью.

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

Как строится конвейер: от аудита до передачи

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

  1. Аудит сборки и релизного цикла. Разбираем текущие сборки, ручные операции, точки отказа и время от коммита до выкладки. Фиксируем, что автоматизируем первым, а что осознанно оставляем как есть.
  2. Схема окружений. Определяем, сколько сред нужно и чем они отличаются по параметрам, правам и данным. Договариваемся, что один и тот же артефакт продвигается между средами без пересборки — иначе проверки теряют смысл.
  3. Настройка сборочного конвейера. Функции описываются декларативно (SAM или Serverless Framework), конвейер собирает их из описания: прогоняет проверки стиля и модульные тесты, упаковывает артефакт один раз и кладёт в версионируемое хранилище.
  4. Настройка окружений и доступов. Параметры выносятся из кода в конфигурацию среды, секреты — в защищённое хранилище, доступы к облачным ресурсам выдаются ролями с минимально нужными правами вместо долгоживущих ключей.
  5. Проверки перед выкладкой. Интеграционные тесты на развёрнутом стенде, валидация прав и параметров, дымовые тесты сразу после релиза. Откат на предыдущую версию отработан заранее и занимает минуты, а не часы.
  6. Проверка релиза и передача. Прогоняем релиз вместе с командой заказчика, замеряем время сборки и восстановления, обучаем: как запускать выкладку, откатывать, добавлять проверки и менять окружения самостоятельно. Остаются схема сред, описание конвейера и порядок действий при сбое.

Инфраструктура как код, секреты и политики доступа

Всё, что описывает окружение, права и порядок выкладки, живёт в репозитории рядом с кодом — не в переписке и не в памяти инженера, который вёл проект. Среда поднимается из описания, а не собирается руками по памяти, и вернуться к предыдущему состоянию можно так же просто, как откатить коммит. Ниже — состав артефактов, которые остаются у заказчика и работают без нас.

  • Описания среды как код: функции, роли исполнения, таймауты, привязки к событиям и очередям — декларативно, с историей изменений и разбором различий перед применением.
  • Управление секретами: ключи и строки подключения вынесены в хранилище, подставляются на этапе выката, в репозитории остаются только ссылки на имена — утечка кода не даёт доступа к продуктиву.
  • Политики доступа: отдельные роли для конвейера и для самой функции, минимально необходимый набор прав на каждый ресурс, запрет долгоживущих ключей и общих учётных записей.
  • Документация конвейера: стадии, условия запуска, какие проверки блокируют выкат, как читать лог сборки и где искать причину падения.
  • Регламент выкладки и откатов: порядок публикации версии, способ переключения трафика, время возврата к предыдущей версии и условия, при которых откат запускается автоматически.
  • Разделение окружений: отдельные наборы параметров и лимитов для тестового и продуктивного контуров, запрет на общие ресурсы между ними.
  • Инструкция по воспроизведению: как поднять среду с нуля по описанию, не имея доступа к исходному стенду.

Эти документы снимают зависимость от конкретных людей: новый инженер входит в проект за дни, а не за недели расспросов.

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

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

Что изменили в процессе

  • Инфраструктуру перенесли в репозиторий: окружения, права, очереди и триггеры воспроизводятся одной командой.
  • Разделили сборку и выкладку: артефакт собирается один раз и продвигается по окружениям без пересборки.
  • Добавили проверку конфигурации до выкладки — потерянные права и неверные переменные ловятся заранее, а не на проде.
  • Сделали поэтапный выпуск: сначала часть трафика, затем весь, с автоматическим возвратом при росте ошибок.
  • Сохраняем прошлые версии функций и маршруты — возврат занимает минуты вместо часов.
  • Развели параллельные релизы: у каждой ветки свой набор ресурсов, команды больше не ждут друг друга.

Метрики до и после

Время восстановления сократилось с 4–6 часов до 8 минут, сборка — с 18 до 4 минут. Доля выпусков, которые приходилось переигрывать, упала с трети до примерно одного из двадцати: конфигурацию проверяют до выкатки. Параллельно выкладываться теперь могут три команды вместо одной, а расходы на окружения перестали расти — неиспользуемые стенды гасятся по расписанию.

Чем отличается постепенная выкладка от замены среды целиком

Замена среды целиком — это новый стек рядом со старым и переключение указателя на него: простоя почти нет, но прогретые экземпляры и открытые соединения не переносятся, а откат релиза возможен только пока старый стек жив и не разошёлся со схемой данных. Постепенная выкладка работает иначе: две версии живут в одной среде, а трафик между ними делится весами.

Технически это выглядит так: сборка публикует новую версию, псевдоним продолжает указывать на прежнюю, дальше идёт управляемый сдвиг весов — 10%, 25%, 50%, 100% с паузами. На каждой паузе автоматика сверяет метрики: долю ошибок, задержку, число сработавших сигналов тревоги; выход за порог возвращает веса назад без повторной сборки. Срезы трафика дают проверку на живых запросах и реальном профиле нагрузки, чего не даёт синтетический тест.

У serverless-моделей свои нюансы: у новой версии нет прогретых экземпляров, первые запросы уходят в холодный старт, а рост числа одновременных вызовов упирается в лимиты аккаунта. Поэтому веса сдвигают мелкими шагами и с прогревом, а не одним переключением. Критична и совместимость: если релиз меняет формат сообщений в очереди или структуру хранения, две версии рядом работать не смогут.

Отсюда правило выбора. Постепенная выкладка — режим по умолчанию, когда меняется логика, но контракт между версиями прежний: откат релиза здесь это возврат весов, секунды и без риска для данных. Замена среды — когда меняется набор интеграций, формат данных или среда исполнения и старую версию нельзя держать рядом: тогда откат означает обратное переключение указателя плюс отдельный план по уже записанным данным.

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

Технические сомнения, которые снимаем до старта

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

Придётся ли переписывать существующие функции?

Нет. Конвейер и шаблоны описания инфраструктуры — это обвязка вокруг кода: тот же обработчик, те же зависимости, тот же способ вызова. Меняется упаковка и доставка — сборка артефакта, проверки, поэтапный выкат.

Где хранятся секреты и ключи доступа?

В защищённом хранилище, а не в репозитории и не в шаблонах. Конвейер подставляет их в момент развёртывания, отдельным набором на каждую среду, а ротация проходит без правки кода.

Что будет при параллельных релизах?

Каждая ветка получает изолированный набор ресурсов, а состояние инфраструктуры фиксируется и блокируется на время применения. Команды не перетирают изменения друг друга, а конфликт всплывает на этапе проверок, не на боевом контуре.

Как устроен откат на предыдущую версию?

Релиз оставляет версионированный артефакт и ссылку на предыдущую стабильную сборку. Возврат — переключение трафика на неё, без пересборки и ручных правок в консоли.

Обсудим задачу и вернёмся с планом работ

Чтобы оценка проекта и план работ опирались на факты, а не на предположения, нам достаточно вводных: как приложение собирается сейчас, какие среды нужны, где хранятся секреты и кто отвечает за выкладку в продакшн. Опишите задачу в свободной форме — репозиторий, текущий способ деплоя функций, требования к проверкам перед релизом. Если часть деталей ещё не сформулирована, разберём их вместе.

В ответ вы получите:

  • схему конвейера: сборка, проверки, порядок продвижения по средам и условия остановки;
  • конфигурации сборки и выкладки под ваш стек — с разделением общих и средовых параметров;
  • политику работы с секретами и правами между средой сборки и облачным аккаунтом;
  • процедуру откатa на предыдущую версию с указанием, за какое время она возвращается в работу;
  • набор проверок перед продвижением: тесты, валидация конфигурации, статический анализ;
  • оценку проекта: состав этапов, их последовательность, трудозатраты и риски по каждому;
  • план работ с критериями приёмки — что считаем готовым на каждом шаге;
  • перечень того, что потребуется с вашей стороны: доступы, роли, ответственный за прод.

Опишите задачу — вернёмся с оценкой проекта и планом работ, где будет видно состав этапов, зависимости и точки контроля.

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

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

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139