Почнемо з конкретного кейса: fintech-додаток на 50 Lambda-функціях. Після 30-секундного таймауту клієнти скаржилися на затримки. Аудит показав init duration до 800 мс через монолітний бандл вагою 8 MB. Ми застосували tree-shaking, lazy loading та перевели AWS SDK v2 на v3. Init duration впав до 90 мс, вартість виконання знизилася на 20% (економія близько $400/місяць). Як цього досягти? Розберемо методи.
Чому холодний старт Lambda критичний?
Холодний старт складається з трьох фаз: створення контейнера (100–500 мс), ініціалізація runtime (50–200 мс) та виконання init-коду. Перші дві фази керуються AWS, третя — ваша відповідальність. Виміряти затримку можна через CloudWatch Logs: рядок Init Duration у звіті. За даними AWS, init duration може сягати кількох секунд при великому бандлі.
| Фаза | Затримка (без оптимізації) | Оптимізовано | Відповідальний |
|---|---|---|---|
| Container init | 100–500 мс | Не оптимізується | AWS |
| Runtime init | 50–200 мс | 10–20% швидше на arm64 | AWS + архітектура |
| Function init | 300–800 мс | 50–150 мс | Ви (розробник) |
Типова картина: Express-додаток з aws-sdk v2 важить 8–15 MB zip. Після оптимізації — 500 KB–2 MB. Init duration падає з 500 мс до 80 мс. Наприклад, ми оптимізували Lambda-функцію, що обробляє 100 тис. запитів на місяць. Вихідний бандл важив 8 MB, init duration — 700 мс. Після tree-shaking та lazy loading бандл зменшився до 1.2 MB, cold start — до 90 мс, а щомісячна вартість виконання скоротилася на 25% ($350 економії).
Які методи знижують холодний старт?
Зменшення розміру бандла
Використовуйте esbuild з external: ["@aws-sdk/*"] та мініфікацією. esbuild мініфікує бандл у 5 разів швидше за webpack. AWS SDK v3 модульний — імпортуйте лише потрібні клієнти:
import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'; import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { DynamoDBDocumentClient, GetCommand } from '@aws-sdk/lib-dynamodb'; const s3 = new S3Client({ region: process.env.AWS_REGION }); const dynamo = DynamoDBDocumentClient.from(new DynamoDBClient({})); Lazy loading важких модулів
Переносьте імпорти рідкісних залежностей всередину handler через динамічний import(). Lazy loading зменшує init duration на 20–40% порівняно з повною ініціалізацією:
export const handler = async (event) => { if (event.type === 'generate-pdf') { const { PDFDocument } = await import('pdf-lib'); const pdf = await PDFDocument.create(); } }; Ініціалізація поза handler
Клієнти БД, змінні оточення, налаштування — все, що не змінюється між викликами, виносьте з export const handler. Це покращує серверлесс продуктивність:
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb'; import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; const client = new DynamoDBClient({ requestHandler: { requestTimeout: 3000, httpsAgent: { keepAlive: true, maxSockets: 50 } }, }); const dynamo = DynamoDBDocumentClient.from(client); const TABLE_NAME = process.env.TABLE_NAME!; export const handler = async (event) => { const result = await dynamo.send(new GetCommand({ TableName: TABLE_NAME, Key: { pk: event.userId, sk: 'profile' } })); return result.Item; }; Порівняння методів оптимізації
| Метод | Вплив на init duration | Складність | Коли застосовувати |
|---|---|---|---|
| Зменшення бандла | 50–80% | Низька | Завжди |
| Lazy loading | 20–40% | Середня | Важкі рідкісні модулі |
| RDS Proxy | 30–50% | Висока | БД-інтенсивні функції |
| Provisioned Concurrency | 100% (усунення cold start) | Низька | Критичні ендпоінти |
| arm64 | 10–20% | Низька | Нові функції |
Як правильно налаштувати підключення до бази даних?
Звичайний пул з'єднань в serverless призводить до тисяч одночасних підключень при масштабуванні. Рішення — RDS Proxy (AWS-managed connection pooler) або HTTP-based бази на кшталт Neon. RDS Proxy підтримує до 100 000 з'єднань, але економить до 80% з'єднань порівняно з прямими підключеннями. Налаштування просте:
import { Pool } from 'pg'; const pool = new Pool({ host: process.env.RDS_PROXY_ENDPOINT, max: 1, idleTimeoutMillis: 0, }); Коли виправдана Provisioned Concurrency?
Provisioned Concurrency тримає N екземплярів Lambda прогрітими. Init виконується заздалегідь, що повністю усуває cold start — це краще за інші методи, які лише зменшують затримку. Ціна — оплата за idle. Використовуємо лише для критичних ендпоінтів з вимогою <100 мс latency. Налаштування через SAM або Serverless Framework просте.
Архітектура: arm64 vs x86
Перемкніть архітектуру на Graviton2 (arm64) — це дає 10–20% прискорення init та 20% економії. Єдине обмеження: нативні модулі .node потребують перезбирання. Решта TS/JS коду працює без змін.
Покрокова інструкція: як ми оптимізуємо cold start
Команда truetech має 5+ років досвіду в AWS serverless, виконали понад 50 проектів з оптимізації Lambda. Гарантуємо зниження init duration на 50–80%.
- Аудит: вимірюємо init duration всіх функцій через CloudWatch Logs та Lambda Insights.
- Аналіз бандла: визначаємо важкі залежності та дублювання.
- Зменшення бандла: застосовуємо esbuild з tree-shaking, виносимо AWS SDK v3.
- Lazy loading: виносимо рідкісні модулі (PDF, зображення) за межі init.
- Налаштування RDS Proxy: для функцій з прямими підключеннями до БД.
- Конфігурація Provisioned Concurrency: для критичних ендпоінтів.
- Тестування: порівнюємо init duration до та після.
Скільки можна заощадити? У нашому проекті з 50 функціями init duration знизився з 800 мс до 90 мс, що зменшило час виконання на 87% та скоротило щомісячні витрати на Lambda на 30% (близько $400 на місяць після оптимізації). Результат залежить від профілю навантаження.
Що входить в оптимізацію
- Аудит поточних функцій: вимірювання init duration, аналіз бандла
- Зменшення розміру пакету: esbuild, tree-shaking, винос AWS SDK
- Оптимізація ініціалізації: lazy loading, кешування клієнтів
- Налаштування RDS Proxy або альтернативних БД
- Конфігурація Provisioned Concurrency та автоскейлінг
- Рекомендації щодо архітектури (arm64, змінні оточення)
Терміни та вартість
Аудит та базова оптимізація — від 1 дня (від $300). Повний цикл з RDS Proxy та Provisioned Concurrency — до 1 тижня (від $1000). Вартість розраховується індивідуально після оцінки обсягу. Замовте консультацію — підготуємо комерційну пропозицію. Зв'яжіться з нами для безкоштовного аудиту. Отримайте детальний аналіз cold start ваших функцій вже сьогодні.







