Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Zappa, Chalice и друзья: запускаем код без серверов с помощью AWS Lambda

Zappa, Chalice и друзья: запускаем код без серверов с помощью AWS Lambda

Михаил Новиков (fstrk.io) @ MoscowPython Meetup 69

"Технологии Serverless несколько лет, и с каждым годом её популярность растет. Для высоконагруженных систем это простой способ бесконечного масштабирования, а для простых сайд-проектов - это отличная возможность бесплатного хостинга. Принцип в том, что вы деплоите не вебсервер, а функции, и платите только за время выполнения этих функций (обычно это миллисекунды).
В докладе мы рассмотрим, как устроены эти функции, какие есть инструменты для их создания - и зачем это обычному питонисту. Также мы увидим, как деплоить уже готовые приложения на Django и Flask в serverless-режиме."

Видео: http://www.moscowpython.ru/meetup/69/zappa-chalice-and-friends/

Moscow Python Meetup

October 30, 2019
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Zappa, Chalice и друзья Запускаем код без серверов с помощью

    AWS Lambda Михаил Новиков Founder & Dev Lead, fstrk.io "Пишу чатботов на джанго" (c) @nooovikov 1
  2. План 1. Что такое Serverless / FaaS ? 2. Где

    это может пригодиться? @nooovikov 2
  3. План 1. Что такое Serverless / FaaS ? 2. Где

    это может пригодиться? 3. Как деплоить Serverless @nooovikov 2
  4. План 1. Что такое Serverless / FaaS ? 2. Где

    это может пригодиться? 3. Как деплоить Serverless 4. Ограничения и хаки @nooovikov 2
  5. План 1. Что такое Serverless / FaaS ? 2. Где

    это может пригодиться? 3. Как деплоить Serverless 4. Ограничения и хаки 5. Цены @nooovikov 2
  6. План 1. Что такое Serverless / FaaS ? 2. Где

    это может пригодиться? 3. Как деплоить Serverless 4. Ограничения и хаки 5. Цены 6. Отечественный Serverless @nooovikov 2
  7. 1. Что такое Serverless / FaaS ? • Деплоим код,

    не разворачивая сервера @nooovikov 3
  8. 1. Что такое Serverless / FaaS ? • Деплоим код,

    не разворачивая сервера • Платим только за время обработки запросов @nooovikov 3
  9. 1. Что такое Serverless / FaaS ? • Деплоим код,

    не разворачивая сервера • Платим только за время обработки запросов • Не храним стейт в функции (внешняя БД, внешний кэш, авторизация и пр.) @nooovikov 3
  10. 1. Что такое Serverless / FaaS ? • Деплоим код,

    не разворачивая сервера • Платим только за время обработки запросов • Не храним стейт в функции (внешняя БД, внешний кэш, авторизация и пр.) • Не занимаемся (кое-чем) с инфраструктурой @nooovikov 3
  11. 2. Где это может пригодится? • ⚡ Вебхуки, интеграции •

    " API & микросервисы • # ETL-пайплайны @nooovikov 7
  12. 2. Где это может пригодится? • ⚡ Вебхуки, интеграции •

    " API & микросервисы • # ETL-пайплайны • $ Бэкенды для ботов, SPA @nooovikov 7
  13. 2. Где это может пригодится? • ⚡ Вебхуки, интеграции •

    " API & микросервисы • # ETL-пайплайны • $ Бэкенды для ботов, SPA • % IoT @nooovikov 7
  14. Где это нельзя использовать • ⏳ Длинные задачи (напр. получасовой

    парсинг сайта) • " Приложения с большим кол-вом зависимостей @nooovikov 8
  15. Где это нельзя использовать • ⏳ Длинные задачи (напр. получасовой

    парсинг сайта) • " Приложения с большим кол-вом зависимостей • # Приложения, хранящие в себе стейт @nooovikov 8
  16. Это удобно? • Нет! • Нет контроля версий • Сложности

    с зависимостями (в Lambda нельзя сделать pip install) @nooovikov 13
  17. Это удобно? • Нет! • Нет контроля версий • Сложности

    с зависимостями (в Lambda нельзя сделать pip install) • Код либо пишешь в редакторе, либо загружаешь в ZIP-архиве @nooovikov 14
  18. Нам нужен фреймворк: • Чтобы работать в своем уютном IDE

    • Чтобы zip-архивы сами загружались в облако @nooovikov 15
  19. Нам нужен фреймворк: • Чтобы работать в своем уютном IDE

    • Чтобы zip-архивы сами загружались в облако • Чтобы решались проблемы с зависимостями @nooovikov 15
  20. Serverless Framework • YML конфиг позволяет не касаться админки AWS

    • Деплой одной командой • Можно настроить ВСЁ • Много доков и примеров • Есть энтерпрайз версия! ! @nooovikov 17
  21. Но... Он написан на Node.js. ! npm install serverless npm

    install serverless-python-requirements @nooovikov 18
  22. 3.3. Деплой с Chalice • Написан на питоне • Поддерживается

    амазоном: https://github.com/aws/chalice • Еще проще деплоить • Очень амбициозное название @nooovikov 19
  23. Странности Chalice API похож на Flask, но не совсем: @app.route('/')

    def view(): # request нужно доставать из аппы request = app.current_request # получение JSON-пейлоада body = request.json_body # получение GET-параметров params = requst.query_params @nooovikov 21
  24. Странности Chalice Заявляет, что поддерживает вебсокеты, но это не заводится:

    app = Chalice(app_name="echo-server") app.websocket_api.session = Session() app.experimental_feature_flags.update(['WEBSOCKETS']) @app.on_ws_message() def message(event): app.websocket_api.send( connection_id=event.connection_id, message=event.body ) @nooovikov 22
  25. Странности Chalice • Требует все файлы класть в папку chalicelib

    • Некоторые зависимости пакует автоматически, а некоторые - нет • chalice logs выдает ВСЕ логи за всю историю проекта (осторожно) @nooovikov 23
  26. Zappa • Пишем просто Flask-приложение • Все настройки в zappa_settings.json

    • Можно мигрировать текущие проекты без доработок (ну почти) @nooovikov 25
  27. Сравнение фреймворков • SLS Framework: • Меньше всего магии, больше

    всего гибкости • Сложно для начинающих • Chalice: • Питоничные обертки над амазоновскими командами. АПИ со странностями • Подходит для простых проектов • Zappa: • Максимум магии, но проще всего использовать • Просто Flask @nooovikov 27
  28. 4.1. Время выполнения • Синхронные функции: до 30 сек •

    Асинхронные функции: до 15 мин Как быть? @nooovikov 29
  29. 4.1. Время выполнения • Синхронные функции: до 30 сек •

    Асинхронные функции: до 15 мин Как быть? Amazon SQS + 2 функции @nooovikov 30
  30. 4.3. Зависимости • На AWS Lambda нельзя сделать pip install

    • Все засимости пакуем в zip и загружаем вместе с приложением • Поэтому на Lambda сложно запускать проекты с тяжелыми зависимостями ./requests 376K ./psycopg2 564K ./PIL 11M ./numpy 23M ./pandas 65M Как быть? @nooovikov 35
  31. 4.4. Хранение стейта • Можем запустить на Амазоне инстанс Postgres.

    • Но это покупка сервера (от $15/мес) @nooovikov 37
  32. 4.4. Хранение стейта • Можем запустить на Амазоне инстанс Postgres.

    • Но это покупка сервера (от $15/мес) • Можем подключиться к AWS DynamoDB (от $0/мес) @nooovikov 37
  33. 4.4. Хранение стейта • Можем запустить на Амазоне инстанс Postgres.

    • Но это покупка сервера (от $15/мес) • Можем подключиться к AWS DynamoDB (от $0/мес) • Но это проприетарная NoSQL база со своими особенностями @nooovikov 37
  34. 4.4. Хранение стейта • Можем запустить на Амазоне инстанс Postgres.

    • Но это покупка сервера (от $15/мес) • Можем подключиться к AWS DynamoDB (от $0/мес) • Но это проприетарная NoSQL база со своими особенностями • [хак] Можем хранить SQLite базу на S3 @nooovikov 37
  35. 4.4. Хранение стейта • Можем запустить на Амазоне инстанс Postgres.

    • Но это покупка сервера (от $15/мес) • Можем подключиться к AWS DynamoDB (от $0/мес) • Но это проприетарная NoSQL база со своими особенностями • [хак] Можем хранить SQLite базу на S3 • Это Serverless SQL! @nooovikov 37
  36. Serverless SQLite Ограничения • Несколько параллельных SELECT - ок •

    Несколько параллельных UDPATE/DELETE - не ок. Закоммитится только последний. @nooovikov 43
  37. Serverless SQLite Ограничения • Несколько параллельных SELECT - ок •

    Несколько параллельных UDPATE/DELETE - не ок. Закоммитится только последний. • Подходит для сервисов с редкой записью, частым чтением @nooovikov 43
  38. Пример Serverless SQL https://clc.to/board Serverless мессаджборд Zappa + Flask +

    S3sqlite registry.register("s3sqlite", "dialect", "S3SQLiteDialect") engine = create_engine('s3sqlite:///messageboard.sqlite') class Board(Base): id = Column(Integer, primary_key=True) name = Column(String) class Post(Base): id = Column(Integer, primary_key=True) content = Column(String) created_at = Column(DateTime) board = relationship("Board", back_populates="posts") @nooovikov 44
  39. 5. Цены Service Units Price per unit Free quota Lambda

    GB-second $0.00001667 ✅ 1 million requests $0.2 ✅ GB of data out $0.09 ✅ RDS Postgres Instance hour $0.021(μ)/$0.164(L) ✅ (1y) GB-month of storage $0.133 ✅ DynamoDB 1 million PUT $1.25 1 million GET $0.25 GB-month of storage $0.25 ✅ @nooovikov 46
  40. 6. Отечественный Серверлесс Mom, can we have serverless? No, we

    have serverless at home. Serverless at home: Yandex Cloud Functions @nooovikov 47
  41. Yandex Cloud Functions • Синтаксис идентичен AWS Lambda (ну почти)

    • Можно работать как в интерфейсе, так и в консоли (установить Yandex CLI) @nooovikov 49
  42. Yandex Cloud Functions • Синтаксис идентичен AWS Lambda (ну почти)

    • Можно работать как в интерфейсе, так и в консоли (установить Yandex CLI) • Не нужно создавать HTTP-ручку - она подключается сама @nooovikov 50
  43. Yandex Cloud Functions • Синтаксис идентичен AWS Lambda (ну почти)

    • Можно работать как в интерфейсе, так и в консоли (установить Yandex CLI) • Не нужно создавать HTTP-ручку - она подключается сама • Workflow идентичен: пишем код, пакуем зависимости, загружаем zip- архив @nooovikov 51
  44. ./deploy.sh mkdir ./package && cp * ./package pip install -r

    requirements.txt -t ./package zip ./package.zip ./package/* yc serverless function version create \ --function-name=hello \ --runtime python37 \ --entrypoint handler.handler \ --memory 128m \ --execution-timeout 5s \ --source-path ./package.zip rm ./package.zip && rm -rf ./package @nooovikov 53
  45. ./deploy.sh mkdir ./package && cp * ./package pip install -r

    requirements.txt -t ./package zip ./package.zip ./package/* yc serverless function version create \ --function-name=hello \ --runtime python37 \ --entrypoint handler.handler \ --memory 128m \ --execution-timeout 5s \ --source-path ./package.zip rm ./package.zip && rm -rf ./package @nooovikov 54
  46. ./deploy.sh mkdir ./package && cp * ./package pip install -r

    requirements.txt -t ./package zip ./package.zip ./package/* yc serverless function version create \ --function-name=hello \ --runtime python37 \ --entrypoint handler.handler \ --memory 128m \ --execution-timeout 5s \ --source-path ./package.zip rm ./package.zip && rm -rf ./package @nooovikov 55
  47. ./deploy.sh mkdir ./package && cp * ./package pip install -r

    requirements.txt -t ./package zip ./package.zip ./package/* yc serverless function version create \ --function-name=hello \ --runtime python37 \ --entrypoint handler.handler \ --memory 128m \ --execution-timeout 5s \ --source-path ./package.zip rm ./package.zip && rm -rf ./package @nooovikov 56
  48. ./deploy.sh mkdir ./package && cp * ./package pip install -r

    requirements.txt -t ./package zip ./package.zip ./package/* yc serverless function version create \ --function-name=hello \ --runtime python37 \ --entrypoint handler.handler \ --memory 128m \ --execution-timeout 5s \ --source-path ./package.zip rm ./package.zip && rm -rf ./package @nooovikov 57
  49. ./deploy.sh mkdir ./package && cp * ./package pip install -r

    requirements.txt -t ./package zip ./package.zip ./package/* yc serverless function version create \ --function-name=hello \ --runtime python37 \ --entrypoint handler.handler \ --memory 128m \ --execution-timeout 5s \ --source-path ./package.zip rm ./package.zip && rm -rf ./package @nooovikov 58
  50. Yappa github.com/kurtgn/yappa • Выполняет под капотом упаковку и деплой •

    Упрощает типовые задачи (yappa logs, yappa status, ...) @nooovikov 63
  51. Yappa github.com/kurtgn/yappa • Выполняет под капотом упаковку и деплой •

    Упрощает типовые задачи (yappa logs, yappa status, ...) • Можно писать навыки для Алисы @nooovikov 63
  52. YCF vs. AWS Lambda • Сделаем функцию, которая считает тяжелый

    цикл • Задеплоим на 512MB AWS Lambda @nooovikov 64
  53. YCF vs. AWS Lambda • Сделаем функцию, которая считает тяжелый

    цикл • Задеплоим на 512MB AWS Lambda • Задеплоим на 512MB Yandex Cloud Functions @nooovikov 64
  54. YCF vs. AWS Lambda • Сделаем функцию, которая считает тяжелый

    цикл • Задеплоим на 512MB AWS Lambda • Задеплоим на 512MB Yandex Cloud Functions • Купим сервера в двух ДЦ, дадим нагрузку @nooovikov 64
  55. YCF vs. AWS Lambda • Сделаем функцию, которая считает тяжелый

    цикл • Задеплоим на 512MB AWS Lambda • Задеплоим на 512MB Yandex Cloud Functions • Купим сервера в двух ДЦ, дадим нагрузку • Пусть победит сильнейший! @nooovikov 64
  56. YCF vs. AWS Lambda Результаты • Amazon - тяжелый и

    прожорливый (но 250 RPS) • Yandex - легкий и экономный (но 20 RPS) @nooovikov 67
  57. 8. Итог Особенности Serverless • ! Код - это "клей",

    а не основа • " Процессы эфемерны, в них нельзя хранить стейт @nooovikov 68
  58. 8. Итог Особенности Serverless • ! Код - это "клей",

    а не основа • " Процессы эфемерны, в них нельзя хранить стейт • # Платим только за время выполнения @nooovikov 68
  59. 8. Итог Особенности Serverless • ! Код - это "клей",

    а не основа • " Процессы эфемерны, в них нельзя хранить стейт • # Платим только за время выполнения • $ Автоматическое горизонтальное масштабирование @nooovikov 68
  60. 8. Итог Особенности Serverless • ! Код - это "клей",

    а не основа • " Процессы эфемерны, в них нельзя хранить стейт • # Платим только за время выполнения • $ Автоматическое горизонтальное масштабирование • % Странный workflow, но фреймворки упрощают жизнь @nooovikov 68
  61. 8. Итог Применение Serverless • ✅ REST API бэкенды, боты

    • ✅ ETL пайплайны • ✅ Бесплатный хостинг для пет проджектов @nooovikov 69
  62. 8. Итог Применение Serverless • ✅ REST API бэкенды, боты

    • ✅ ETL пайплайны • ✅ Бесплатный хостинг для пет проджектов • ❌ Не подходит для долгих тасков @nooovikov 69
  63. 8. Итог Применение Serverless • ✅ REST API бэкенды, боты

    • ✅ ETL пайплайны • ✅ Бесплатный хостинг для пет проджектов • ❌ Не подходит для долгих тасков • ❌ Не подходит для энтерпрайза @nooovikov 69
  64. 8. Итог Применение Serverless • ✅ REST API бэкенды, боты

    • ✅ ETL пайплайны • ✅ Бесплатный хостинг для пет проджектов • ❌ Не подходит для долгих тасков • ❌ Не подходит для энтерпрайза • ❌ Не подходит для постоянного хайлоада @nooovikov 69