*Лохотрон* YandexBot (Яндекс.БОТ) — Моментальная прибыль с автовыводом

Что такое Serverless в самом бытовом понимании?

Не буду очень глубоко уходить в дебри, на Хабре регулярно появляются обзорные статьи на эту тему. Это возможность разместить в облаке функцию, на каком-то из поддерживаемых платформой языков программирования, задать условие её срабатывания — и всё. Когда случится триггер — поднимется виртуальное окружение, в нем отработает функция, и выключится. Вместе с окружением.


В чем преимущества такого подхода?

Безопасность

Вы получаете безопасное изолированное окружение с последней версией компилятора / интерпретатора.

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

Стабильность и отказоустойчивость

Вместо того чтобы конфигурировать pm2, настраивать политику перезагрузок, следить за утечкой памяти и постигать нюансы деплоя — да, вы просто загружаете программу на сервер, а всё остальное берёт на себя провайдер услуги.

Цена, особенно в условиях домашних малонагруженных проектов

При тарификации учитывается объём памяти, резервируемый под функцию за время её исполнения и количество вызовов. Согласно документации 10 000 000 запусков функции, работающей 800ms с ограничением по памяти 512мб будут стоить 3 900₽.

Что это означает для меня? Мой типичный петпроджект — бот отвечающий на вопросы по расписанию для широко известного в узких кругах мероприятия. Запускать его нужно раз в год, на протяжении нескольких дней. В прошлом году он ответил на 1000 запросов от участников, ему более чем хватит 128мб, время выполнения функции 300ms. Такой сценарий использования будет стоить 0.046₽.

Да, 4.6 копеек. Плюс я не буду тратить время на настройки, что ещё приятней. Никаких правил для pm2, никакой актуализации Dockerfile или окружения, и вишенкой на торте — SLA 99,9.

Из пока нерешённых задач (но, полагаю, это вопрос времени) — привязка внешних доменов, а так же тонкая настройка http методов, которые служат триггером функции. Сейчас http триггер срабатывает на любой из DELETE, GET, HEAD, OPTIONS, PATCH, POST или PUT запросов на авто-генерируемую точку входа типа https://functions.yandexcloud.net/xxxxxxxxxxxxxxxx.

Из хороших новостей — это полноценный https, который отвечает всем требованиям Telegram для работы с api через webHooks. Но у AWS Lambda есть дополнения в виде API Gateway, да и сама настройка триггера шире, если вам это нужно.

Очевидное ограничение самого serverless подхода, не зависимо от платформы — пользоваться приходится ровно тем, что дают. Написать код на неподдерживаемых языках программирования или использовать нестандартные параметры компилятора/интерпретатора вы не сможете. Также возможны дополнительные ограничения призванные защитить всех участников процесса разработки.

Как создать .js файл, чтобы работать в Яндекс.Облаке?

Краткий гайд через веб интерфейс:

  • создаём Функцию
  • создаём в веб интерфейсе файл с любым именем и расширением js
  • выбираем интерпретатор — nodejs10 или nodejs12
  • в файле пишем функцию с одним параметром в exports.myFunction (ну, в произвольное поле в exports)
  • указываем таймаут работы функции, оперативную память (128МБ-1024МБ с шагом в 128МБ), точку входа (имяфайла.myFunction)
  • делаем функцию публичной

Функция написанная в файле может:

Получить данные http запроса через входящий параметр:

функция не получает request в чистом виде, и конечно же не управляет ходом запроса — она получает в своём единственном параметре объект с информацией о запросе:

{     "httpMethod": "<название HTTP метода>",     "headers": "<словарь со строковыми значениями HTTP-заголовков>",     "multiValueHeaders": "<словарь со списками значений HTTP-заголовков>",     "queryStringParameters": "<словарь queryString-параметров>",     "multiValueQueryStringParameters": "<словарь списков значений queryString-параметров>",     "requestContext": "<словарь с контекстом запроса>",     "body": "<содержимое запроса>",     "isBase64Encoded":  }

Ответить на http запрос

согласно документации:

{     "statusCode": <http>"headers": "<словарь со строковыми значениями HTTP-заголовков>",     "multiValueHeaders": "<словарь со списками значений HTTP-заголовков>",     "body": "<содержимое ответа>",     "isBase64Encoded":  }</http>

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий