Мы создаем веб-решение на основе API на Python, которое будет поставляться отдельным клиентам. У каждого клиента будет отдельный набор данных.
В настоящее время развернуть экземпляр приложения + базы данных для каждого клиента не проблема, но это станет кошмаром с большим количеством клиентов: представьте себе сотни таких экземпляров и расходы на администрирование на это. Очевидно, решение должно стать более «централизованным».
Однако данные довольно чувствительны, поэтому мы не можем хранить все в одной базе данных: взлом сервера и пароля БД приведет к утечке всех данных. Такие риски недопустимы.
Какие технологии следует учитывать при разработке серверной платформы с распределенным API? Какие умные методы сделают решение более «централизованным», чтобы мы избавились от такого количества экземпляров, но при этом сохраняли изолированность данных?
Короче говоря, AWS + Cloudformation + Ansible (или какое-то другое программное обеспечение CM).
С помощью облачной информации вы можете определить свою инфраструктуру «на болтах и болтах» - сети, серверы, экземпляры RDS и т. Д. И развернуть эту инфраструктуру надежным и повторяемым образом. Этот же манифест облачной информации будет развернут один раз для каждого клиента.
После развертывания инфраструктуры используйте систему управления конфигурацией для настройки серверов, развертывания кода и т. Д. Ansible - это то, что мы используем, и я обнаружил, что он на голову выше своих конкурентов (Puppet, Chef, Saltstach, и т. д.) в части простоты использования и гибкости. Ansible - это проект на Python, и, будучи магазином Python, вам будет легко освоить его.
Кроме того, подумайте о том, сможете ли вы развернуть свое приложение с помощью AWS Elastic Beanstalk. Если это возможно, это избавит вас от необходимости развертывать, обновлять серверы и масштабировать.
Если вас беспокоит сохранение соотношения клиентов и экземпляров сервера 1: 1, рассмотрите возможность развертывания нескольких экземпляров вашего приложения на одном сервере с помощью Docker. Это позволит обеспечить разумную степень разделения между экземплярами приложения, в то же время упростив контролируемое развертывание.