UA RU
logo
Веб-разработка      07/12/2022

Далеко не все разработчики это знают: как использовать все возможности AWS Lambda

Сергій Свеженців BLOG

Python Developer, AWS Certified Developer Associate в NIX

Далеко не все разработчики знают о пользе лямбда-функций. И зря! Ведь эти облачные функции могут значительно упростить работу девелопера и повысить эффективность создаваемых приложений. Особенно показательно это свойство на примере сервиса AWS Lambda от Amazon. Об этом дальше и поговорим.

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

Что предлагает AWS

Для начала кратко опишу, что представляют собой Amazon Web Services. В работе с Lambda вам так или иначе придется столкнуться со связанными облачными сервисами Amazon. Составляющие AWS собраны на иллюстрации ниже:

Их можно разделить на несколько групп.

Первая группа — Compute, объединяющая услуги для вычислений:

  • Elastic Compute Cloud — виртуальный сервер в облаке для аренды инстансов;
  • Elastic Container Service — сервис координирования контейнеров;
  • Lambda — функции для запуска кода в облаке без предоставления выделенного сервера.

Вторая группа — это базы данных:

  • реляционная база RDS с поддержкой Oracle, PostgreSQL, MySQL и MariaDB;
  • Онлайн-курс "SMM-спеціаліст" від Laba.
    Від аналізу аудиторії та створення живого контенту — до побудови комʼюніті навколо бренду в соцмережах.Під менторством Senior SMM Specialist в Uklon.
    Дізнатись більше
  • DynamoDB, предоставляющая NoSQL базы данных от Amazon;
  • ElastiCache — сервис кэширования, совместимый с Memcached и Redis.

Третья группа сервисов касается работы сети и доставки контента:

  • API Gateway для разработки, интеграции и управления API в эндпойнтах;
  • Route 53 — система доменных имен DNS;
  • Virtual Private Cloud, позволяющий создавать и управлять виртуальными приватными сетями.

Четвертая группа — хранилища:

  • Simple Storage Service — сервис объектного хранения файлов в облаке;
  • Elastic Block Store — облачное хранилище для инстансов; выступает как SDD- или HDD-диски, которые могут быть подключены только к виртуальным машинам;
  • Основи Web дизайну від Hillel IT School.
    Цей онлайн-курс з основ веб-дизайну дозволить вам опанувати мистецтво створення ефективних та привабливих інтерфейсів для вебсайтів і застосунків. Ви оволодієте ключовими принципами UX/UI дизайну, створюватимете дизайн-макети та прототипи, розроблятимете адаптивні інтерфейси для різних пристроїв, готуючись до професійної кар'єри в галузі веб-дизайну.
    Дізнатися більше
  • Elastic File System — управляемая файловая система для EC2, виртуальных машин и контейнеров; сетевая файловая система, которую можно расшарить между несколькими клиентами.

Пятая группа сервисов связана с безопасностью, идентификацией и управлением требованиями:

  • Cognito — используется для управления пользователями в приложении;
  • Secrets Manager — для хранения в облаке в открытом или зашифрованном виде переменных и секретов, а также предоставления к ним доступа авторизованным пользователям и приложениям;
  • Identity & Access Management — ​​управляет доступом к ресурсам согласно описанным ролям.

Шестая группа — об управлении и администрировании:

  • CloudWatch используется для мониторинга ресурсов и приложений, а также сбора логов и статистики с других сервисов AWS;
  • CloudTrail отслеживает действия пользователей и API;
  • CloudFormation — для моделирования и распределения ресурсов в облачной инфраструктуре.
  • Основи Python для школярів від Hillel IT School.
    Відкрийте для вашої дитини захопливий світ програмування з нашим онлайн-курсом "Програмування Python для школярів". Ми вивчимо основи програмування на прикладі мови Python, надаючи зрозумілі пояснення та цікаві практичні завдання.
    Зареєструватися

На этом сервисе работает множество фреймворков для написания и деплоя лямбда-функций. Для этого создается YAML-файл для описания необходимых ресурсов и их свойств. Затем с помощью консольной утилиты AWS CLI нужно один раз задеплоить результат. И тогда во время апдейтов не нужно деплоить исходный файл заново, а можно редактировать исходный код для обновления ресурсов.

Лямбда-функции относятся к serverless-концепции

Здесь следует выделить несколько преимуществ:

  • Отсутствие управления сервером

Нет серверов — нет управления ими. Вам не придется тратить силы на создание, выделение и обслуживание таких устройств.

  • Гибкость масштабирования

Для увеличения производительности окружения не требуется отслеживать нагрузку на серверы и ресурсы. Разработчику достаточно только менять настройки лямбда-функции. Вы можете увеличить объем памяти, и система сама сделает все остальное.

  • Оплата объема потребленных ресурсов

Платите за время использования лямбда-функций. Даже если она задеплоена, но простаивает, расходы будут нулевыми.

  • Доступность и отказоустойчивость
  • Онлайн-курс Recruiter від Mate academy.
    Обирайте курс Recruiter з гнучким графіком та ставайте спеціалістом у новій сфері! Допоможемо опанувати усі необхідні навички та стати профі!
    Отримати знижку на курс

AWS гарантирует стабильность программы, которая будет доступна во многих регионах мира. Другие услуги, использующие лямбда-функции, тоже будут иметь к ним доступ.

Как работает лямбда-функция

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

  • Сначала вы пишете код локально и загружаете его в сервис лямбда-функции.
  • Затем настраиваете триггер, который должен стать источником ивента.
  • Тот приведет к появлению новой функции. Это могут быть, например, трекинг изменений файла в хранилище S3, HTTP-запрос к созданному через API Gateway эндпойнту или созданию, апдейту и удалению записей в DynamoDB.
  • При получении такого ивента лямбда-функция начнет выполнять заданные действия.
  • По завершению вы получите счет за время выполнения функции:

Теперь лямбда-функции от Amazon поддерживают четыре версии Python: от 3.6 до 3.9. Раньше была поддержка и второй версии, но сейчас она приостановлена. Поэтому старые проекты задеплоить невозможно. Но у Amazon появились ARM-процессоры Graviton. Поэтому в версиях Python 3.8 и 3.9 можно задеплоить от архитектуры ARM.

Курс Python developer від Mate academy.
Опануйте Python та отримайте свою першу роботу в IT! Ми навчимо вас усім необхідним навичкам та допоможемо з працевлаштуванням.
Отримати знижку на курс

Выполняем деплой AWS Lambda

После локального написания кода деплой лямбды может происходить по одному из сценариев:

  • Код упаковываем в ZIP-архив и загружаем в S3, откуда деплоим отдельно на сервис Lambda. Именно так работают практически все фреймворки и консольные утилиты для разработки лямбд.
  • Код собираем в Docker-контейнер и загружаем в репозиторий Elastic Container Registry. Именно из этого реестра контейнеров происходит деплой в сервисе Lambda.

Создание новой функции

Можете не ограничиваться локальным написанием кода. Писать его можно в дашборде Amazon в онлайн-редакторе. Таким образом вы пропустите шаг в типичном создании лямбда-функции и сразу сохраните код в S3.

Для визуализации такого сценария возьмем в качестве примера создание простой функции Hello World. Для этого открываем соответствующий раздел, задаем имя лямбды, а остальные параметры оставляем по умолчанию: это Python 3.8 и архитектура x86.

Далее пишем саму функцию в онлайн-редакторе. Метод лямбды должен принимать два параметра: event и context. В context содержится служебная информация об окружении лямбда-функции (имя и настройки). Сама функция работает с event, откуда должны поступать какие-то данные.

Онлайн курс з промт інжинірингу та ефективної роботи з ШІ від Powercode academy.
Курс-інтенсив для отримання навичок роботи з ChatGPT та іншими інструментами ШІ для професійних та особистих задач, котрі допоможуть як новачку, так і професіоналу.
Записатися на курс

К примеру, если это был определенный HTTP-запрос, все содержится именно там. Здесь мы пишем функцию, которая здоровается с пользователем и возвращает результат. Также есть print с самим объектом ивента:

После функции мы не будем сетить ивент. Создадим тестовый ивент, в котором опишем JSON-объект — в нашем случае имя пользователя John. Замечу, что все параметры, принимаемые лямбда-функцией, должны быть JSON сериализированными. В противном случае функция не запустится:

После написания ивента нажимаем кнопку Test и видим результаты выполнения функции. Должен появится блок Response с возвращаемыми из функции данными.

Также мы получим логи с тремя строчками служебной информации:

  • START. Здесь приводится уникальное ID реквеста и версия лямбда-функции. В примере я задеплоил одну версию, для которой автоматически создан $LATEST — и с ним мы всегда работаем.
  • END. Здесь повторяется тот же самый RequestId.
  • REPORT. Этот блок содержит сведения о выполнении лямбда-функции. Прежде всего — сколько времени в миллисекундах занял весь процесс. Далее рассчитывается оплачиваемое время работы сервиса (округляется в большую сторону). Также указывается объем памяти, заданный в настройках лямбда-функции, и объем памяти, используемой в процессе. Завершает блок Init Duration с потраченным на инициализацию функции временем.
  • Онлайн-курс "Ефективні презентації в PowerPoint" від Laba.
    Навчіться доносити ідеї через актуальні візуалізації.Курс зі створення презентацій, які додивлятися до кінця.Будь то sales offer, чи pitch deck.
    Дізнатись більше

После получения ивента выполняется следующий сценарий:

  • Сначала сервис загружает код из S3 или реестра контейнеров. Если для создания лямбды используете какую-либо утилиту, то она загружает код в S3 в созданный ею бакет. А если код написан в онлайн-редакторе, то он отправляется во внутренний бакет, скрытый от пользователя.
  • После загрузки кода сервис создает окружение с указанными настройками: объем памяти, переменная окружения и т.д.
  • Затем запускается инициализация кода, а дальше — и сама функция.

Два первых блока окрашены в синий цвет и отражают стадию холодного старта. Этот этап выполняется при первом запуске лямбда-функции после долгого простоя. При последующих получениях ивентов выполняются только блоки 3 и 4 — с импортом библиотек и запуском самой функции.

Правда, третий блок спорный. Согласно документации AWS, библиотеки импортируются каждый раз. Хотя авторы сервиса указали, что в случае простоя среда замораживается. Потому импорт библиотек не повторяется. Возможно, это касается не только Python, но и всех поддерживаемых языков.

Ниже приведена схема повторного использования окружения лямбда-функции:

Онлайн-курс "Фінансовий аналіз" від Laba.
Опануйте звітність — від збору даних до обробки результатів, та інтерпретуйте дані ключових звітів CF, BS, P&L зрозумілою мовою.
Детальніше про курс

С появлением триггера происходит холодный старт с загрузкой функции, созданием оцепления и обработкой ивента. После этого среда, в которой выполнялась лямбда, замораживается. Останавливаются все фоновые процессы. Также замораживается директория /tmp, созданная для каждой функции. То есть можно повторно использовать папку для хранения кэша. А еще хранятся объекты, которые были объявлены вне функции.

Поэтому если после запуска функция не использовалась менее пяти минут, среда при поступлении новых ивентов и триггеров размораживается. Но если простой длится больше пяти минут — среда удаляется, а с ней — все данные.

Обработка нескольких ивентов

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

Именно это показано ниже на ивенте 1. При его обработке появляется ивент 2. Механизм лямбда-функции снова ищет свободную среду и не находит ее. Поэтому поднимает еще одно окружение: с холодным стартом, загрузкой библиотек, инициализацией среды и последующей обработкой второго события.

Далее поступает ивент 3. При этом обработка второго продолжается, а первого уже завершилась. Поэтому механизм начинает переиспользовать освободившуюся первую среду.

Если бы три ивента поступили одновременно, механизм создал бы три отдельных среды окружения. В этом и состоит гибкость концепции Serverless, где нет необходимости в менеджменте серверов. Лямбда делает все за нас.

Единственное «но» — ограничение в 1000 лямбда-функций, которые выполняются одновременно. Об этом следует помнить при построении сложных продакшен-систем.

Курс QA engineer від Mate academy.
Після навчання на курсі QA engineer ви зможете розробляти плани тестування додатків та сайтів. Працевлаштування гарантовано.
Отримати знижку на курс

Правда, этот показатель постепенно растет. При необходимости можно пообщаться с техподдержкой Amazon и объяснить свои потребности.

Перфоманс лямбда-функции

Если в виртуальных машинах можно настроить память, ядра, диск и процессор, то в лямбда-функции корректируется только объем оперативной памяти (от 128 МБ до 10 ГБ). При изменении этого параметра изменяется количество ядер и мощность процессора, задействованного для конкретного окружения. Как заявляют в Amazon, на каждые 1700 МБ оперативной памяти выделяется по одному ядру.

Хотя на практике все выглядит несколько иначе и лучше. Это показало опыт работы с лямбда-функциями в нашей команде. К примеру, при изменении памяти со 128 МБ до 1 ГБ в отчетах мы видели данные об использовании только 100 МБ. То есть производительность должна была остаться примерно на том же уровне. Но время на обработку сокращалось примерно втрое! Хотя у нас так же работало только одно виртуальное ядро.

Продолжение статьи о лямбда-функциях скоро читайте на Highload. Stay tuned!

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Онлайн-курс Recruiter від Mate academy.
Обирайте курс Recruiter з гнучким графіком та ставайте спеціалістом у новій сфері! Допоможемо опанувати усі необхідні навички та стати профі!
Отримати знижку на курс

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: