В одной из прошлых статей о NestJS + GraphQL + Lambda я получил очень интересный комментарий. Поэтому и решил поделится своими мыслями и опытом о том, когда все-таки стоит использовать Lambda функцию, а когда - нет.

Я буду говорить про AWS Lambda, потому что имею с AWS больше всего опыта. Для начала давайте рассмотрим основные свойства лямбда - функции:

  • вы платите только за время выполнения и за трафик между лямбда и другими AWS сервисами

  • бесплатный уровень использования 1 млн вызовов и 400 000 ГБ-секунд вычислений в месяц

  • очень хорошо интегрируется с другими сервисами AWS

  • горизонтальное авто масштабирование

Итак из первого свойства мы видим, что AWS не запускает ваш код просто так, а только когда это необходимо. Из этого следует один минус - время холодного старта. Это время с начала вызова лямбда функции и до момента когда приложение поднимется и начнет выполнять что-то полезное. 

И тут есть всем известный лайф-хак.

AWS держит ваше приложение запущенным 15 мин с момента последнего вызова. И при этом вы оплачиваете только время выполнения. Поэтому появилось такое понятие как прогрев лямбда-функции. Для этого можно использовать другую лямбда функцию, которая раз в 12 минут (например) будет вызывать health метод во всех лямбда функциях, которые необходимо прогреть. Но все равно это затратно.

Мой топ использования лямбда функций:

Бесплатный хостинг

Если объединить “оплата только за время выполнения” и “бесплатный уровень использования” можно получить отличный бесплатный хостинг для не нагруженных проектов. Для которых не особо важно время холодного старта. Также еще можно добавить бесплатную MongoDB в том же AWS регионе при помощи этого сервиса mongodb.com и получим полноценный backend. Пример использования описан в этой статье

Обработка файлов

Я очень часто использую S3 для хранения файлов. А лямбда умеет хорошо интегрироваться с сервисом S3. Поэтому можно настроить вызов лямбды при добавление нового файла в S3. Что это дает? Можно например нарезать thumb с одной большой картинки во всех форматах и класть опять же в S3. ( более подробно в этой статье). 

Либо вот пример готового стека, его можно развернуть в течение 5 минут в своем AWS акаунте. В этом примере лямбда вызывается по запросу пользователя в CloudFront и если видео еще не преобразовано, то запускается нарезка видео на кусочки hls потока. При следующем запуске видео уже берется напрямую из S3. Кроме этого уже существует огромное количество готовых решений

Обработка очереди

Лямбда функцию можно использовать как обработчик в очереди AWS SQS. Но тут нужно понимать выгодно ли это. Если большая нагрузка, то чаще всего выгодней поднимать свой обработчик на отдельном сервере.

Ограничения

Нужно не забывать об ограниченях, с которыми сталкиваешься при разработке:

  • максимальное время исполнения - 900 секунд (15 мин). Если у вас задача, для которой надо больше времени, то лямбда это не лучшее решение.

  • время холодного старта (подробнее описал выше)

  • максимальный размер архива лямбды 50 МБ, а распакованный размер всего кода лямбды с модулями не должен превышать 250 МБ. И тут очень важно использовать правильные модули для своих приложений. Так как, бывают такие, которые в себе содержат бинарники с достаточно большим размером.

  • максимальный размер всех лямбда функций, загруженных в этот аккаунт, со всеми версиями этих функций и слоями не должны превышать 75 ГБ. Это очень важное ограничение. (может быть увеличено по запросу)

  • максимальное количество паралельно запущенных лямб - 1000. (может быть увеличено по запросу)

  • для работы с файлами выделяется конкретная папка /tmp, масимальный размер которой не должен превышать 500 МБ

Выводы: использование лямбд очень хорошо ложится в начале пути проекта. А также в местах, не часто вызывающихся. Она удобно и быстро разворачивается, но как только мы приближаемся к статусу High Load - нужно срочно переосмысливать архитектуру проекта и переходить на собственную инфраструктуру, например на kubernetes.io

Комментарии (12)


  1. Korobei
    03.02.2022 21:00
    +1

    Там есть лимит на использование?
    А то какой-нибудь доброжелатель захочет порадовать и напишет робота который будет ваши лямбды дёргать. Потом счёт на пару тысяч выкатят, как они любят.


    1. okosynskyi Автор
      03.02.2022 22:22

      Ох ничего себе опыт взлом! По умолчанию параллельно может быть запущенно 1000 лямбд. Если нужно больше - надо запрашивать


      1. vgoodvin
        04.02.2022 11:43

        Вопрос как я понял наоборот про ограничение количества запусков


    1. funca
      03.02.2022 23:36

      У AWS на этом построен бизнес. Вы либо платите хорошо обученным спецам, и за консалт, а они помогают вам ответить на основные вопросы и собрать нормальное решение. Либо с ужасом собираете всевозможные золотые грабли на бесплатных планах.


    1. vgoodvin
      04.02.2022 11:42

      Есть возможность ораничить максимальное количество параллельно запущенных лямбд. Например разрешить запускаться только по одному экземпляру лямбды на запрос. В таком случае стоит расчитывать что один экземпляр этой лямбды в теории сможет работать без остановки и можно расчитать итоговую сумму.


    1. xSVPx
      05.02.2022 19:42

      В принципе, внутри самого aws есть информация о текущих расходах, и можно настроить так, чтобы он сдал письма.

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

      В целом ещё вопрос что будет дешевле и при штатном использовании, лямбда, или свой небольшой инстанс/инстанцы.


  1. funca
    03.02.2022 23:22
    +1

    Насколько мне известно, использование warmers для решения проблем с холодным стартом не рекомендуется. AWS раскидывает запросы по разным инстансам в разных AZ и создать "вручную" соответствующий паттерн будет проблематично. Реальный запрос может все равно прилететь в непрогретую лямбду. Вместо этого лучше использовать штатный Provisioned Concurrency.

    Лимит в 250Mb на код легко обходится, если вместо zip архивов использовать docker images (для них лимит 10Gb). Как вариант, для некритичных вещей, можно закинуть разделяемый код/данные на EFS и монтировать при старте лямбд.


  1. DimNS
    04.02.2022 07:36

    А почему бы не взять бесплатную машину в Oracle?

    https://www.oracle.com/cloud/free/


    1. okosynskyi Автор
      04.02.2022 09:46

      а она навсегда дается? у Амазона тоже есть на первый год аккаунта бесплатный микро инстанс.


      1. DimNS
        04.02.2022 11:05

        Навсегда, но там нюанс, надо следить за лимитами самостоятельно, если вдруг за них выйти или подключить услуги без "Always Free" тогда включается счетчик 30 дней и после него автоматически начинают снимать деньги или сервер превращается в тыкву


  1. Stas911
    04.02.2022 18:14
    +1

    Время холодного старта сильно зависит от используемого языка, кроме того еще в 2019 его сильно улучшили кардинальными изменениями сетевого стека лямбд. Еще есть слабодокументированный лайфхак - выносить всю инициализацию вне хендлера лямбды, тк эта часть кода выполняется при инциализации контейнера и без ограничений на CPU. Ну и как правильно сказали - не стоит городить костыли, когда есть Provisioned Concurrency. На мой взгляд проблема cold start сильно раздута и в реальной жизни не так много приложений, где она вообще на что-то влияет - так ни один из заказчиков, с которыми я работал за последние годы, пока не страдал от запуска его кода на 100ms позже.


  1. Saiv46
    05.02.2022 06:38

    Если у вас нет вендор-лока на AWS, то лучше воспользуйтесь Cloudflare Workers - также бесплатен, без холодного старта*, мастштабируется бесконечно, но размер скрипта и время его выполнения должно быть меньше.

    * - Холодный старт происходит во время TLS Handshake и заканчивается к моменту отправки HTTP-запроса