Yandex Cloud Functions (Functions as a Service, FaaS) позволяют нам захостить наш код (Python, PHP, Net, NodeJS, R) на серверах (облачный хостинг, Platform as a Service, PaaS) Яндекса не разбираясь во всех сложностях DevOps.
- Не нужно покупать сервер, настраивать, обслуживать.
- Не нужно покупать домен и SSL сертификаты для того чтобы получить доступ к коду по HTTP(s).
- Не нужно нужно разворачивать фреймворки вроде Django или Laravel.
- Не нужно платить за сервер, когда он не используется.
А порой очень важно что вам не нужно ничего делать даже если нагрузка на проект построенный на Yandex Cloud Functions вдруг резко (возможно кратковременно вырастет) — все само по себе масштабируется (главное понимать что за это придется платить)
Для чего использовать Yandex Cloud Functions фрилансеру или инди разработчику
Для меня важны 3 фактора облачной инфраструктуры:
- очень быстрое развертывание нужного РАБОЧЕГО окружения, независимого от других проектов
- относительная (с оговорками) дешевизна
- практически полное отсутствие необходимости поддержки серверной части (но лимиты на бюджет — обязательно)
Если вы подписаны на меня на YouTube, то уже знаете что я частенько пописываю всякие штуки для работы с API Мосбиржи, API Тинькофф Инвестиции, API YT. И это часто простой код кот должен что-то где то взять, обработать и отправить куда-то. Роботы, советники, анализаторы и т.п. Здесь нет авторизаций, кук, загрузки пользовательских данных и прочего. И вот для таких задач для меня идеально подходит Cloud Functions.
Недостатки Cloud Functions
Можно считать недостатком (хотя это скорее просто сам принцип работы) шаблона «функция как услуга» является что после того как функция отработала данные с которыми работала эта функция полностью уничтожаются и сохранить их в рамках Cloud Function нельзя. Т.е. для организации хранения данных нужно использовать иные сервисы (базы данных, виртуальные диски и т.п.). В рамках одного хостера, в данном случае Yandex Cloud, это делается просто, однако за эти ресурсы нужно платить отдельно. И это уже не всегда оправданно для индивидуального разработчика.
Ограниченный набор сред выполнения. Вы не можете собрать свой образ и скажем использовать PHP 8 или PHP 5.6 — вам доступна только одна версия PHP 7.4 и ничего больше. php.ini вам не доступен. Для Python сейчас актуальна версия 3.10, но в Cloud Function вы можете поставить 3.7-3.9.
Разнообразные лимиты, которые раскиданы по всей документации и не всегда очевидны. /tmp < 512Мб, переменные окружения <4кб, память на функцию <2Гб, таймаут <600 сек, запрос/ответ < 3.5Мб, установка зависимости <5 мин.
Не самый удобный способ работы с кодом — загрузка через веб медленна и не удобна, через yc (консоль) быстрее, но есть нюансы. Т.е. подключиться к чему то в облаке по SSH — нельзя.
Есть масса и других нюансов, которые нужно просто понять во время первого запуска.
Альтернативы
Есть мнение что вот эту всю концепцию Functions as a Service (FaaS) придумали в Амазон. И они конечно предлагают эту услугу, только это называется у них AWS Lambda. Есть такие штуки и у всех конкурентов Google Cloud Functions, Microsoft Azure Functions, Oracle Fn.
Как создать Cloud Function (через web или консоль yc)
У вас должен быть создан аккаунт в Yandex Cloud и включен биллинг. Я рассказывал об этом в видео.
Обратите внимание что Яндекс дает гранты на использование своего облака и эти гранты имеют срок истечения. А для функций, возможно они вам и не понадобятся. Возможно стоит завести отдельный аккаунт для работы с функциями без использования грантов, а гранты использовать для чего-то другого. Но как этой схеме отнесется Яндекс я не знаю.
Я настоятельно рекомендую поставить консоль yc. Тогда код можно будет писать в своей IDE и загружать (и запускать функцию) одной командой в консоли. Для IDE от JetBrains у YC есть плагин.
Подробно в видео:
Полезные ссылки
- полный плейлист по Yandex Cloud на Azzrael Code
- описание аргументов методов точки входа
- доступные окружения
- триггеры
- тарификация
- лимиты
Исходники примеров
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import os import json import base64 def timers(e, c): print("Im timer") return {'statusCode': 200} def hola(e, c): body = base64.b64decode(e['body']).decode('utf-8') if e['isBase64Encoded'] else e['body'] token = os.environ['token'] msg = "q: %s body: %s, token: %s" % ( json.dumps(e['queryStringParameters']), body, token ) return { 'statusCode': 200, 'body': msg, } |
Олег 2022-12-01
import telebot
from telebot import types
import requests
from bs4 import BeautifulSoup as b
а в текстовом документе не понимаю как написать правильно