Перейти до вмісту

Модуль 1.8: AWS Lambda та безсерверні патерни

Час на виконання: 2 години

Розділ «Час на виконання: 2 години»

Перед початком цього модуля ви повинні завершити:


Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

У 2019 році компанія з надання послуг таксі обробляла дані телеметрії GPS від 50 000 водіїв. Кожної секунди телефон кожного водія надсилав оновлення локації. Це 50 000 подій на секунду з величезними сплесками в години пік та майже нульовим трафіком о 3 годині ночі. Вони запускали це на флоті з 200 екземплярів EC2, які масштабувалися від 80 до 200 залежно від навантаження. Проблема: масштабування завжди відставало на 3-4 хвилини від реального трафіку. Починалася година пік, запити накопичувалися в чергах, і дані про локацію ставали застарілими. У періоди затишшя вони платили за 80 серверів, що майже нічого не робили.

Вони замінили рівень прийому даних на функції Lambda, що тригерилися через Amazon Kinesis. Під час години пік AWS автоматично запускав тисячі екземплярів Lambda одночасно. О 3 годині ночі витрати були нульовими. Масштабування стало миттєвим. Рахунок за інфраструктуру впав на 62%, тому що вони перестали платити за простій.

AWS Lambda — це оригінальна безсерверна (serverless) платформа. Випущена у 2014 році, вона втілила ідею: ви пишете код, а хмарний провайдер бере на себе все інше — підготовку серверів, масштабування, патчі та високу доступність. Ви платите тільки за мілісекунди, протягом яких ваш код реально працює. У цьому модулі ви дізнаєтеся, як працює Lambda, які джерела подій її запускають, як боротися з “холодними стартами” (cold starts) та як будувати реальні пайплайни обробки даних.


Модель виконання Lambda фундаментально відрізняється від контейнерів чи віртуальних машин.

Життєвий цикл середовища виконання

Розділ «Життєвий цикл середовища виконання»
  1. INIT Phase (Cold Start): AWS завантажує ваш код, запускає рантайм (Python, Node.js тощо) та виконує код поза межами функції-обробника (handler). Це займає від 100 мс до кількох секунд.
  2. INVOKE Phase: Виконується безпосередньо ваша функція handler. Ви платите за цей час.
  3. WARM State: Після завершення роботи AWS зберігає середовище “теплим” протягом 5-15 хвилин. Наступний запит пропустить фазу INIT і виконається миттєво.

Критичне правило: Код поза межами функції handler виконується один раз при “холодному старті” і перевикористовується при наступних викликах. Саме тут слід ініціалізувати підключення до баз даних та завантажувати важкі бібліотеки.

import boto3
import os
# INIT CODE - виконується один раз при холодному старті
# Клієнт буде перевикористаний між викликами
s3 = boto3.client('s3')
def handler(event, context):
# HANDLER CODE - виконується при кожному виклику
# ... логіка роботи з S3 ...
return {"status": "ok"}

Джерела подій (Triggers)

Розділ «Джерела подій (Triggers)»

Lambda не працює сама по собі. Її запускають події від інших сервісів.

Основні патерни виклику:

Розділ «Основні патерни виклику:»
  1. Синхронний (Synchronous): Викликач чекає відповіді від Lambda. Наприклад: API Gateway -> Lambda.
  2. Асинхронний (Asynchronous): Викликач просто кидає подію і забуває. Lambda обробляє її в черзі з вбудованою логікою повторів (2 спроби). Наприклад: S3 -> Lambda (при завантаженні файлу).
  3. На основі потоків/черг (Polling): Lambda сама опитує джерело (SQS, Kinesis) і обробляє записи пачками (batches).

ОбмеженняЗначення
Макс. час виконання15 хвилин
Пам’ять128 МБ - 10 ГБ
vCPUПропорційно пам’яті (1.7 ГБ = 1 full vCPU)
Тимчасове сховище (/tmp)512 МБ - 10 ГБ
Кількість одночасних запусків1,000 (дефолт на регіон)

Шари (Layers) дозволяють винести спільні залежності (бібліотеки, кастомні бінарні файли) в окремий пакет. Це зменшує розмір самої функції і дозволяє перевикористовувати код між багатьма Lambda.


Step Functions: Оркестрація воркфлоу

Розділ «Step Functions: Оркестрація воркфлоу»

Коли однієї Lambda замало, AWS Step Functions дозволяє з’єднувати багато функцій у ланцюжки (state machines) з логікою розгалуження, повторів та обробки помилок.

Чому Step Functions краще за виклик однієї Lambda з іншої?

  • Ви не платите за очікування (одна Lambda чекає, поки інша закінчить роботу).
  • Візуальний моніторинг кожного кроку.
  • Вбудована логіка ретраїв без написання коду.

ПомилкаЧому це стаєтьсяЯк виправити
Ініціалізація клієнтів всередині handlerКод виглядає звичним для веб-розробниківВинесіть створення DB connections та SDK клієнтів за межі handler
Використання Lambda для довгих процесівЗдається простішим за ECSЯкщо процес триває більше 5-10 хв, використовуйте ECS Fargate
Рекурсивні викликиLambda пише в S3, що тригерить ту саму LambdaВикористовуйте різні бакети або фільтри за префіксами/суфіксами
Занадто мало пам’яті для CPU задачСпроба економіїДля обробки відео/зображень виділяйте 1-2 ГБ пам’яті, щоб отримати більше CPU

1. Що таке "холодний старт" (cold start) у Lambda?

Це затримка при першому виклику функції (або після тривалої паузи), коли AWS потрібно підготувати нове середовище виконання: завантажити код та запустити рантайм. Подальші виклики використовують вже підготовлене середовище і працюють набагато швидше.

2. Як Lambda масштабується під великим навантаженням?

Lambda масштабується горизонтально. Кожен новий вхідний запит (або батч запитів) запускає новий незалежний екземпляр функції. AWS автоматично керує кількістю цих екземплярів, обмежуючи їх лише загальним лімітом конкурентності на акаунт (concurrency limit).


Практична вправа: Генератор мініатюр (thumbnails) через S3

Розділ «Практична вправа: Генератор мініатюр (thumbnails) через S3»

У цій вправі ви створите пайплайн: при завантаженні картинки в один бакет S3, Lambda автоматично створить її мініатюру і покладе в інший бакет.

Terminal window
# 1. Створення функції (приклад створення через CLI)
aws lambda create-function \
--function-name thumbnail-generator \
--runtime python3.12 \
--role arn:aws:iam::ACCOUNT_ID:role/lambda-s3-role \
--handler lambda_function.handler \
--zip-file fileb://function.zip
# 2. Надання дозволу S3 викликати Lambda
aws lambda add-permission \
--function-name thumbnail-generator \
--principal s3.amazonaws.com \
--statement-id s3-trigger \
--action lambda:InvokeFunction \
--source-arn arn:aws:s3:::upload-bucket
# 3. Налаштування тригера в S3
aws s3api put-bucket-notification-configuration \
--bucket upload-bucket \
--notification-configuration file://s3-config.json

Далі: Модуль 1.9: Secrets Manager — навчіться безпечно зберігати паролі до баз даних та API-ключі з автоматичною ротацією.