CoderCastrov logo
CoderCastrov
AWS Lambda

Как правильно использовать серверные технологии и AWS Lambda, на наш взгляд

Как правильно использовать серверные технологии и AWS Lambda, на наш взгляд
просмотров
2 мин чтение
#AWS Lambda
Table Of Content

Недавно я прочитал и поделился с командой статьей о использовании серверных технологий в контексте веб-API: http://einaregilsson.com/serverless-15-percent-slower-and-eight-times-more-expensive/

Вкратце, автор провел исследование, чтобы решить, нужно ли ему использовать серверные технологии для своего API вместо старой настройки. Он выяснил, что Lambda немного медленнее, чем экземпляр EC2, но это не главная проблема. Главная проблема была в цене, и на самом деле в цене за API Gateway, а не в самой Lambda.

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

Функция Lambda - отличный инструмент для небольших независимых функций (все именно в названии). И особенно это хорошо, когда вам нужно использовать разные API или парсить веб-страницы. В этом случае вы можете вызывать столько лямбд, сколько вам нужно параллельно. Начиная с 1 экземпляра и до миллиона, не изменяя код инфраструктуры. Просто работает, и все.

Каждая лямбда будет запущена на отдельном VPS с собственным IP-адресом, что делает его сложным для блокировки вашего парсера. Потому что единственный способ заблокировать его - запретить весь пул IP-адресов AWS, что, вероятно, плохое решение.

Пример

Слова крутые, но что насчет примера кода? Конечно! Вот он.

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

Мы будем использовать CCXT API для этого, он поддерживает 127 различных рынков обмена криптовалют и имеет реализацию на Python.

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

Когда лямбда готова - следующий шаг - запустить ее. Мы будем получать данные из множества источников и нам нужно сделать это как можно быстрее, потому что все может меняться очень быстро. Для этой цели мы сделаем наш код асинхронным и будем вызывать лямбды параллельно.

Для вызова AWS Lambda нам нужно использовать Boto - AWS SDK для Python. В нашем случае, асинхронная версия Boto - aioboto3.

client = aioboto3.client(
    **'lambda'**,
    region_name=**'[YOUR_LAMBDA_REGION]'**,
    aws_access_key_id=**'[YOUR_AWS_KEY_ID]'**,
    aws_secret_access_key=**'[YOUR_AWS_KEY]'**)response = **await** client.invoke(
    FunctionName=**'[YOUR_LAMBDA_FUNCTION_NAME_OR_ARN]'**,
    InvocationType=**'RequestResponse'**,
    LogType=**'Tail'**,
    Payload=json.dumps(**[PAYLOAD]**),
)

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

А вот код раннера, с которым я закончил:

Основная логика здесь находится в методах __invoke_lambda и invoke.

__invoke_lambda использует код, аналогичный вышеуказанному, для запуска лямбды и получения ее ответа. Это асинхронный метод.

invoke отображает корутину __invoke_lambda на каждую нагрузку, и [asyncio.**gather**](https://docs.python.org/3/library/asyncio-task.html#asyncio.gather)** **планирует их как параллельные задачи.

Бонус

Если вы не хотите писать или использовать асинхронный код - вот то же самое с использованием модуля multiprocessing в Python:


Спасибо за чтение! Надеюсь, вам понравилось.

Герман Генсецкий при поддержке команды Go Wombat.

P.S. В случае возникновения проблем буду рад услышать ваш отзыв. Вы можете связаться со мной по электронной почте: Ignis2497@gmail.com