⚠️ 26.07.2021: Актуальная версия проекта - в форке https://github.com/turokg/yappa
Деплоим Python в Yandex Cloud Functions легко и быстро.
- Первый запуск
- Использование
- Ограничения
- Разработка навыков для Алисы
- Благодарности
- Если что-то не работает
Для начала нужно скачать и настроить два CLI: яндексовский и амазоновский.
- Настраиваем Yandex CLI
- Настраиваем AWS CLI
pip install yappa
pip install flask
from yappa.flask_yandex import FlaskYandex
app = FlaskYandex(__name__)
@app.route('/')
def main():
return 'Hello from Yappa!'
pip freeze > requirements.txt
Инициализация и создание конфиг-файла:
yappa init
Деплой:
yappa deploy
Профит! Яндекс выдаст URL вида
https://functions.yandexcloud.net/xxxxx
, на котором будет работать наша функция.
После первого деплоя обновление функции выполняется командой:
yappa update
yappa logs
Команда принимает два необязательных параметра --since
и --until
(синтаксис см. здесь).
Например, так можно просмотреть логи за последнюю минуту:
yappa logs --since 1m
yappa undeploy
Это удалит функцию из YCF.
В одном облаке не может быть более 10 функций. Все ограничения см. здесь
Единственный URL, который может быть у приложения, выглядит так:
https://functions.yandexcloud.net/xxxxxx
В отличие от AWS Lambda, здесь нет возможности создавать роуты, например:
https://functions.yandexcloud.net/xxxxxx/dashboard
https://functions.yandexcloud.net/xxxxxx/users
Поэтому единственный роут, который может быть у вашего Flask-приложения, - это /
:
@app.route('/', methods=[...])
И весь роутинг внутри приложения необходимо делать на GET-параметрах:
from flask import request, render_template
@app.route('/', methods=[...])
def main:
if request.args.get('dashboard'):
return render_template('dashboard.html')
elif request.args.get('user'):
return render_template('user.html')
...
Yappa позволяет деплоить можно не только Flask-приложения, но и обычные функции из документации.
Именно такие функции и используются в Алисе.
Для создания навыка Алисы можно написать такую функцию:
def handler(event, context):
"""
Entry-point for Serverless Function.
:param event: request payload.
:param context: information about current execution context.
:return: response to be serialized as JSON.
"""
text = 'Hello! I\'ll repeat anything you say to me.'
if 'request' in event and \
'original_utterance' in event['request'] \
and len(event['request']['original_utterance']) > 0:
text = event['request']['original_utterance']
return {
'version': event['version'],
'session': event['session'],
'response': {
# Respond with the original request or welcome the user if this is the beginning of the dialog and the request has not yet been made.
'text': text,
# Don't finish the session after this response.
'end_session': 'false'
},
}
и деплоить его точно так же командами yappa init
/ yappa deploy
.
При деплое функции, а не Flask-приложения,
необходимо изменить файл yappa-settings.json
так, чтобы поле entrypoint
указывало на эту функцию, например:
{
"project_name": "messageboard-yandex2",
"entrypoint": "myapp.handler",
...
}
Проект представляет собой смесь Flask-Lambda и Zappa, адаптированных под особенности YCF.
Проект тестировался только по Mac OS. Если что-то не работает под Windows/Linux - присылайте PR.