Бессерверные вычисления были предметом обсуждения в последнее время. Бессерверные вычисления - это абстракция серверов, ОС и инфраструктуры с сохранением основной функции - вычислений. Бессерверные вычисления имеют свои преимущества. Разработчикам не следует беспокоиться о настройке целых серверов, прежде чем они смогут фактически использовать свои функции. Кроме того, некоторые приложения лучше подходят для выставления счетов на основе вычислений, чем для выставления счетов на основе времени. Лямбды помогают добиться именно этого. Проще говоря, лямбды - это изолированные функции, которым назначается только одна задача. Масштабируемость и беспроблемное распределение ресурсов - вот некоторые из других преимуществ использования этого типа архитектуры. Все основные поставщики облачных сервисов (AWS, GCP) предоставляют возможности лямбда-выражения. Вот руководство по созданию базовой лямбда-выражения Python в AWS. Кроме того, есть пример кода для запуска этой лямбды с помощью вызова API, наиболее распространенного типа запроса.

Ниже приведены шаги, которым мы должны следовать:

  • Создание лямбда
  • Лямбда-развертывание
  • Конфигурация шлюза API

Это руководство предполагает наличие активной учетной записи AWS и некоторое терпение.

Создание лямбда

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

def lambda_handler(event, context):
    #lambda function here
    ...
 
    return { 'status' : 200, 'body' : 'Lambda executed successfully!' }

Этот метод войдет в точку входа, назовем ее main .py. Вспомни на потом.

Следующее взято из официальных документов:

  • event - AWS Lambda использует этот параметр для передачи данных события обработчику. Этот параметр обычно имеет тип Python dict. Это также может быть тип list, str, int, float или NoneType.
  • context - AWS Lambda использует этот параметр для предоставления информации о времени выполнения вашему обработчику. Это параметр типа LambdaContext.

Обработка дополнительных зависимостей

Лямбды размещаются на серверах Linux, на которых уже установлены базовые пакеты. Все дополнительные зависимости должны быть явно помещены в пакет развертывания в фиксированном формате, который описан ниже.

Чтобы упростить этот процесс, создайте виртуальную среду для конкретного проекта. Чтобы создать пакет развертывания, создайте zip-архив с файлом основной точки входа main.py на корневом уровне zip-архива. Дополнительные папки и файлы могут присутствовать в ZIP-архиве в любом формате, который вы сочтете нужным. Убедитесь, что в вашем проекте нет абсолютных путей.

Это должно выглядеть примерно так:

lambda-test.zip/
├── main.py (точка входа лямбда, содержащая метод lambda_handler
├── Folder1 /
│ ├── File1
│ ├── File2
│ ├── some_method.py
│ └── docs
├── SomeOtherFolder /
│ ├── File1
│ └── docs
├── package1
├── package2
├── package3
└── package4

Добавление зависимостей: скопируйте все файлы и папки из venv/lib/python2.7/site-packages/ в корень zip-архива (packageX на рисунке выше). Здесь venv - папка виртуальной среды для проекта. Придерживайтесь ограничений по размеру, установленных Amazon. Назовем этот zip-пакет lambda-test.zip.

Лямбда-развертывание

Хрустите костяшками пальцев, это противно.

  • Войдите в свою учетную запись AWS. В разделе служб перейдите к лямбдам. Создайте новую функцию, назовите ее test, измените среду выполнения на Python2.7 и назначьте ей подходящую роль. Проверьте область лямбды вверху справа. Допустим, это было так:
ARN - arn:aws:lambda:us-east-1:xxx:function:test

Нам нужно запомнить регион на будущее: us-east-1

  • Добавьте триггер API gateway из меню слева. В его конфигурации создайте новый API. Пусть безопасность пока будет открыта. Назовите этот API в раскрывающемся меню. Добавьте и сохраните триггер.

Код

  • Щелкните функцию test в центре. Есть возможность редактировать код в режиме реального времени, но это подходит для небольших проектов. Вместо этого мы будем использовать наш пакет развертывания. Чтобы использовать это, перейдите в S3 и создайте новый сегмент. Убедитесь, что область сегмента совпадает с областью лямбда us-east-1 . Я потратил много времени, чтобы разобраться в этом, не тратьте время на это! Загрузите свой пакет развертывания lambda-test.zip в эту корзину и получите ссылку на zip-архив. Убедитесь, что у ведра есть необходимые параметры безопасности.
  • Вернувшись на панель лямбда-анализа, вставьте эту ссылку в code entry type - Upload a zip from Amazon S3.. Убедитесь, что среда выполнения - Python2.7, а для обработчика установлено значение main.lambda_handler. Adjust время ожидания в настройках ниже в соответствии с вашими потребностями. Приложениям с малым временем обработки не следует назначать большие тайм-ауты. Помните, что мы масштабируемся по горизонтали и платим за счет вычислительной мощности. Я потратил (прочитал) еще немного времени на размышления, почему мои запросы истекли. Не стоит. Сохраняйте и, если ошибок нет, радуйтесь.

Настройка шлюза API

  • Выберите шлюз API на панели лямбда-анализа. И заходим в созданный API , test.

В своем API test создайте новый ресурс - назовем его number . В number выполните:

  1. Actions Enable CORS: настройки по умолчанию.
  2. Actions — _31 _ (_ 32_ метод тестирования): отметьте Use Lambda Proxy integration, добавьте также имя лямбда-функции test.
  3. Щелкните этот только что созданный метод GET для number, а затем значок тестируемого болта. Здесь вы сможете запустить фиктивный тест. Если все пойдет хорошо, вы должны увидеть следующее справа под Response Body.
{
  "body": "Lambda executed successfully!",
  "status": 200
}

Примечание. test - это набор API. number - это ресурс в этом наборе. GET - метод этого ресурса. в этом люксе. И life это загадка.

Теперь ваша лямбда работает!

Прежде чем закончить, я покажу вам еще одну вещь - получение параметра из вызова GET. Для этого выполните следующие действия:

  • Перейдите к GET методу number , и нажмите Method Request.
  • В поле URL Query String Parameters добавьте строку запроса, скажем, input. input - это параметр, который мы получим от вызова GET. При желании вы можете сделать это обязательным. (Надеюсь, вы цените здесь частое использование каламбуров.)
  • В вашей лямбда-функции main.py внесите следующие изменения:
def lambda_handler(event, context):
    #get number from the GET call
    
     input = int(event['queryStringParameters']['input'])
     return { 'status' : 200, 'body' : 'Lambda executed successfully! Got the number : %d'%input }

(Вам нужно будет снова создать пакет развертывания, загрузить его в S3 и вернуть в лямбда-функциях, но это не должно быть проблемой, поскольку теперь вы являетесь экспертом.)

  • Вернитесь к номеру ресурса и щелкните тест (значок с болтом) в методе GET. Введите следующее в Query Strings {number}.
input=2
  • Хит-тест. Если все пойдет хорошо, результат должен быть таким:
Lambda executed successfully! Got the number : 2

Вот статья, посвященная развертыванию моделей глубокого обучения (большого размера) на лямбдах AWS.

Ваше здоровье!

Эта история опубликована в The Startup, крупнейшем предпринимательском издании Medium, за которым следят + 378 907 человек.

Подпишитесь, чтобы получать наши главные новости здесь.