Бессерверные вычисления были предметом обсуждения в последнее время. Бессерверные вычисления - это абстракция серверов, ОС и инфраструктуры с сохранением основной функции - вычислений. Бессерверные вычисления имеют свои преимущества. Разработчикам не следует беспокоиться о настройке целых серверов, прежде чем они смогут фактически использовать свои функции. Кроме того, некоторые приложения лучше подходят для выставления счетов на основе вычислений, чем для выставления счетов на основе времени. Лямбды помогают добиться именно этого. Проще говоря, лямбды - это изолированные функции, которым назначается только одна задача. Масштабируемость и беспроблемное распределение ресурсов - вот некоторые из других преимуществ использования этого типа архитектуры. Все основные поставщики облачных сервисов (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 использует этот параметр для передачи данных события обработчику. Этот параметр обычно имеет тип Pythondict
. Это также может быть тип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
выполните:
Actions
—Enable CORS
: настройки по умолчанию.Actions
— _31 _ (_ 32_ метод тестирования): отметьтеUse Lambda Proxy integration
, добавьте также имя лямбда-функцииtest
.- Щелкните этот только что созданный метод 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.
Ваше здоровье!