Налаштування 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-моделей свої нюанси: у нової версії немає прогрітих екземплярів, перші запити йдуть у холодний старт, а зростання кількості одночасних викликів упирається в ліміти акаунта. Тому ваги зсувають дрібними кроками й із прогрівом, а не одним перемиканням.

Критичною є й сумісність: якщо реліз змінює формат повідомлень у черзі або структуру зберігання, дві версії поряд працювати не зможуть.

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

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

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

Технічні сумніви, які знімаємо до старту

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

Чи доведеться переписувати наявні функції?

Ні. Конвеєр і шаблони опису інфраструктури — це обв'язка навколо коду: той самий обробник, ті самі залежності, той самий спосіб виклику. Змінюється пакування та доставка — збірка артефакту, перевірки, поетапне викочування.

Де зберігаються секрети й ключі доступу?

У захищеному сховищі, а не в репозиторії й не в шаблонах. Конвеєр підставляє їх у момент розгортання, окремим набором на кожне середовище, а ротація проходить без правки коду.

Що буде за паралельних релізів?

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

Як влаштований відкат на попередню версію?

Реліз залишає версіонований артефакт і посилання на попередню стабільну збірку. Повернення — перемикання трафіку на неї, без перезбірки та ручних правок у консолі.

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

Щоб оцінка проєкту й план робіт спиралися на факти, а не на припущення, нам достатньо ввідних: як застосунок збирається зараз, які середовища потрібні, де зберігаються секрети і хто відповідає за викладку в продакшн.

Опишіть задачу у вільній формі — репозиторій, поточний спосіб деплою функцій, вимоги до перевірок перед релізом. Якщо частину деталей ще не сформульовано, розберемо їх разом.

У відповідь ви отримаєте:

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

Опишіть задачу — повернемося з оцінкою проєкту та планом робіт, де буде видно склад етапів, залежності й точки контролю.

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

Останні роботи

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