Якщо ви прагнете розгорнути безсерверну інфраструктуру на платформі AWS, або хоча б її складову, сервіс AWS Lambda стане ключовим елементом у цьому процесі.
Це обчислювальна функція, що працює без сервера (зазвичай розроблена на Node.js або Python), яку можна створювати та запускати, не турбуючись про управління серверами чи їх кластерами. Ви можете комбінувати різні функції AWS Lambda для реалізації складніших процесів.
Проте, важливо пам’ятати про обмеження на тривалість виконання лямбда-функції. Це обмеження, по суті, визначає, в яких випадках використання AWS Lambda буде найефективнішим.
Джерело: aws.amazon.com
Що означає “інтервал очікування”?
Тайм-аут функції AWS Lambda – це параметр, що визначає максимальний час, протягом якого функція може виконуватися, перш ніж її буде автоматично припинено.
Лямбда-функції розроблені як тимчасові та безстатусні, і саме в такому контексті вони повинні використовуватися. Часто можна спостерігати, як розробники намагаються використовувати Lambda для тривалих процесів, спокушені безсерверною природою AWS Lambda. Адже запуск коду без потреби в налаштуванні сервера з певними параметрами процесора та пам’яті, часто є економічно вигіднішим. Намір цілком зрозумілий.
Однак, занадто довге виконання функції може викликати проблеми з використанням ресурсів та продуктивністю. Існує ризик блокування ресурсів, і з огляду на тривалість процесу, часто відсутня мотивація до оптимізації його окремих кроків. Час очікування в п’ять хвилин в такому випадку не здається значною проблемою. Його можна залишити навіть якщо для самого процесу він не є потрібним.
За замовчуванням час очікування для Lambda становить лише 3 секунди. Отже, код, що виконується в межах функції, повинен завершитись протягом цього часу. Це ідеально підходить для архітектур з швидкою взаємодією та миттєвою відповіддю, можливо, з мільйонами транзакцій за короткий проміжок часу. Однак, це суттєво обмежує можливості застосування Lambda. Тому, цей ліміт можна збільшити до 900 секунд (15 хвилин). По досягненню цього часу, Lambda припинить виконання функції та поверне код помилки.
Як налаштувати тайм-аут?
Джерело: aws.amazon.com
Ви можете налаштувати час очікування для функції Lambda через консоль керування AWS, інтерфейс командного рядка AWS або пакети SDK AWS.
Ось конкретні кроки, як це зробити:
- Відкрийте консоль керування AWS та перейдіть до сервісу Lambda.
- Виберіть функцію Lambda, яку потрібно змінити.
- На вкладці “Конфігурація” знайдіть розділ “Загальна конфігурація” та параметр “Час очікування”.
- Натисніть кнопку “Редагувати” поруч.
- Введіть нове значення тайм-ауту в секундах (від 1 до 900) і натисніть кнопку “Зберегти”.
- Натисніть кнопку “Зберегти” у верхній частині сторінки, щоб зберегти зміни.
Також можна скористатися командним рядком AWS CLI для зміни часу очікування. Приклад команди:
aws lambda update-function-configuration --function-name [Назва_Моєї_Lambda_Функції] --timeout 900
Ця команда встановить час очікування для функції [Назва_Моєї_Lambda_Функції] до 15 хвилин. Замініть вказане ім’я функції на своє та введіть потрібне значення часу очікування в секундах.
Деякі міркування
Заданий час очікування застосовується до всієї функції, а не до окремих її частин чи дій. Тому, якщо функція виконує тривалу операцію, таку як обробка великого файлу або мережевий запит, переконайтеся, що встановленого часу очікування достатньо для її завершення навіть у найгіршому випадку.
Лямбда-функції розроблені як короткочасні та безстатусні. Їх призначення – виконання невеликих, незалежних завдань. Якщо ви виявляєте, що функція Lambda потребує багато часу, можливо, варто розглянути можливість розбиття її на декілька менших функцій. Потім їх можна викликати послідовно за допомогою тригерів. Наприклад, якщо вихідні дані попередньої функції Lambda зберігаються в певному сховищі S3.
Крім того, якщо потрібно виконати процес, що перевищує 15-хвилинний ліміт, можна використовувати покрокові функції AWS Step Functions для оркестрування серії функцій Lambda або інших сервісів AWS для досягнення потрібного результату.
Рекомендації
Інтервал очікування сам по собі не є складною темою. Часто розробники встановлюють 15 хвилин для всіх функцій Lambda, не бачачи в цьому негативних наслідків.
Тим не менш, є кілька корисних рекомендацій, яких варто дотримуватись.
#1. Визначте оптимальне значення
Значення часу очікування повинно базуватися на очікуваному часі виконання функції. Іншими словами, потрібно встановити значення, яке не є ні занадто коротким, ні занадто довгим.
Наприклад, ви можете вирішити, що жодна функція Lambda не повинна виконуватися довше трьох хвилин, виходячи з архітектурних міркувань або загальної продуктивності програми.
Аналогічно, можна встановити мінімальний час виконання, наприклад, три хвилини. Це може бути необхідно, якщо певні ресурси, потрібні для виконання коду, можуть бути тимчасово недоступні.
Тому, перед встановленням максимального тайм-ауту в 15 хвилин, подумайте про оптимальне значення часу виконання. Точніше значення стане ще одним інструментом для встановлення меж у вашій команді розробників.
#2. Моніторинг з часом
Після встановлення часу очікування, стежте за часом виконання ваших функцій Lambda. Це дозволить зрозуміти, чи було ваше початкове рішення правильним, або потребує коригування.
Використовуйте метрики та журнали CloudWatch для відстеження часу виконання функцій. Визначте функції, які працюють довше, ніж очікувалося, або ж набагато швидше.
#3. Асинхронний виклик
Якщо ваша лямбда-функція запускається подією, яка не потребує миттєвої відповіді, наприклад, завантаженням файлу або повідомленням з черги, використовуйте асинхронний виклик, щоб зменшити ризик тайм-ауту. Це дозволить функції працювати у фоновому режимі, не чекаючи на відповідь. Це, звісно, зменшить кількість випадків тайм-ауту. Адже вам не потрібно включати до загального часу виконання Lambda час, що необхідний функції для очікування певного ресурсу.
#4. Використовуйте покрокові функції для складних процесів
Для виконання тривалих процесів, що перевищують 15-хвилинний ліміт, використовуйте AWS Step Functions для організації послідовності функцій Lambda або інших сервісів AWS. Step Functions розбиває процес на менші завдання, що можуть бути виконані в межах часу очікування.
Також можна запускати кілька лямбда-функцій паралельно в межах покрокової функції. Потім step function може дочекатися завершення всіх цих функцій перед тим, як продовжити. Це форма горизонтального масштабування, де кілька лямбда-функцій можуть розділити одну задачу та частково вирішити її разом.
Зрештою, вам потрібно буде зібрати часткові результати та створити кінцеве рішення. Для цього може бути достатньо однієї наступної незалежної лямбда-функції.
#5. Оптимізуйте код
Оптимізуйте код ваших функцій Lambda, щоб зменшити час їх виконання та підвищити продуктивність. Це стане в нагоді, якщо інтервал очікування інколи виявляється недостатнім. В такому випадку оптимізація коду допоможе уникнути помилок.
Як тайм-аут впливає на виставлення рахунків?
Джерело: aws.amazon.com
Встановлення часу очікування для функції AWS Lambda безпосередньо не впливає на вартість її використання. AWS Lambda виставляє рахунки на основі кількості запитів та тривалості виконання функції.
Збільшення часу очікування може призвести до довшого часу виконання функції, але тільки у тому випадку, якщо функція дійсно потребує додаткового часу. Якщо це поєднати з вищою частотою виконання функції, що потребує більше часу, тоді можна очікувати зростання витрат.
Проте, якщо функція не викликається часто, або завершує свою роботу раніше, ніж досягне тайм-ауту, то вплив на виставлення рахунків буде мінімальним.
Тому, встановлення 15-хвилинного тайм-ауту за замовчуванням для всіх функцій Lambda, не є основною причиною зростання вартості вашої загальної обробки.
Але воно, безсумнівно, призводить до опосередкованого збільшення витрат. Розробники, відчуваючи запас часу, можуть не оптимізувати код так ретельно, якби тайм-аути були більш обмежувальними, але все ж таки реалістичними.
Варто пам’ятати про безкоштовний рівень AWS Lambda, що включає 1 мільйон безкоштовних запитів та 400 000 ГБ-секунд обчислювального часу на місяць. Якщо ваше використання функції Lambda вписується в межі безкоштовного рівня, ви не будете платити за час виконання функції, незалежно від значення тайм-ауту.
На завершення
AWS Lambda є потужним інструментом, особливо для безсерверної обробки в хмарі AWS. Він має свої призначення та обмеження, які ми повинні враховувати. Не варто намагатися застосовувати його там, де він не розрахований.
Він ідеально підходить для простих, асинхронних та дискретних дій, що не потребують більше 15 хвилин виконання. Для складніших завдань використовуйте Step Functions для об’єднання кількох лямбда-функцій в організований процес, або відмовтеся від дешевшої безсерверної обробки на користь серверів з відповідною конфігурацією та обчислювальною потужністю.
Наостанок, рекомендую ознайомитися з посібником для початківців по AWS Lambda.