Так получилось, что до 2020 года я не имел дело с облаками. Когда же, наконец, углубился в эту тему, то немного потерялся от обилия сервисов, предлагаемых в AWS.


Необходимо было создать приложение с такими фичами:


  • Авторизацией через facebook или google.
  • Возможностью загрузки и отображения медиа-файлов.
  • Получением событий с сервера в реальном времени.

В этой статье описаны сервисы, которые понадобились мне для реализации проекта и ощущения от процесса.
image


Архитектура приложения


Веб-сервис


Бизнес-логика нашего приложения реализована в виде веб-сервиса и помещена в докер-контейнер. Для запуска контейнеров в AWS можно использовать два сервиса Fargate и Elastic Beanstalk.


Fargate


Модный PaaS поверх ECS или EKS (EKS-Elastic Kubernetes Service, ECS-Elastic Container Service — проприетарная альтернатива kubernetes). Конфигурация выполняется путем описания высокоуровневой абстракции — задачи (Task), в которой указывается необходимое количество вычислительных ресурсов для ваших контейнеров.


Elastic Beanstalk


Появился задолго до Fargate. Позволяет запустить приложение на виртуалках (EC2). В том числе есть конфигурация и для старта докер-контейнера. Из недостатков — сложен в конфигурировании, виртуалки медленно создаются. Из преимуществ — цена. Elastic Beanstalk значительно дешевле при небольших средних нагрузках.


EC2 Базовая утилизация процессора Цена за час Fargate Цена за час Отношение цен
t2.micro 10% $0.0134 1vCPU,1GB $0.05167 3.85
t2.medium 20% $0.0536 2vCPU,4GB $0.11356 2.12
t2.xlarge 22.5% $0.2144 4vCPU,16GB $0.268 1.25

Еще один небольшой плюс Elastic Beanstalk — возможность мониторить сетевой трафик виртуалок. В Fargate я так и не разобрался как это сделать.


Application Load Balancer


И Fargate, и Elastic Beanstalk предусматривают возможность горизонтального масштабирования. В обоих случаях балансировщик нагрузки конфигурируется автоматически. Предполагается, что вы не меняете настройки балансировщика напрямую. В Fargate масштабирование описывается в Task Definition, Elastic Beanstalk создает Auto Scaling Group.


Application Load Balancer работает на уровне HTTP. В принципе он может обрабатывать и HTTPS, но, так как он находится за CloudFront, то нам это не требуется. От ALB на инстансы идет уже только HTTP.


Состояние


Для хранения состояния используются три сервиса.


DynamoDB


NoSql база данных. Работает очень быстро (в пределах 10–20 миллисекунд на запрос). Поддерживает условные обновления, что позволяет организовать оптимистическую транзакционность.


S3


Хранилище файлов. Практически безразмерное. Позволяет открыть прямой доступ из интернета. Таким образом пользователи могут заливать и скачивать контент без использования вычислительных ресурсов сервиса нашего приложения.


Parameters Store


Хранилище настроек сервиса. Позволяет хранить ключи в зашифрованном виде.


Фасад


Технически, в облаке каждый сервис выставлен в интернет, так что, при наличии прав, клиент может обращаться к нему напрямую. Например, в нашем приложении, клиент напрямую заливает медиа-файлы в S3.


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


Route53


DNS от AWS.


CloudFront


CDN от AWS. В настройках CloudFront задаются правила по перенаправлению запросов к медиа-контенту на S3, а api-вызовов на наш веб-сервис. Также здесь можно настроить редирект с Http на Https (понадобится отдельный публичный S3 bucket с правилом редиректа).


AppSync


AppSync — часть большой перспективной концепции — AWS Amplify. Позволяет быстро разрабатывать мобильные приложения с serverless-бэкендом или даже no-code-бэкендом. Наше приложение не такое “модное”, но мы не могли пройти мимо AppSync, так это чуть ли не единственный сервис AWS, позволяющий публиковать и подписываться на сообщения.


Cognito


Отвечает в aws за регистрацию и авторизацию пользователей. Позволяет создать User Pool c привязкой к аккаунтам в Google, Amazon, Facebook и не только.


DevOps сервисы


Сервисы для базовых девелоперских операций представлены на следующей схеме.
image
Управление доступом к сервисам и ресурсам осуществляется с помощью IAM-Identity and Access Management.


Для автоматизации развертывания ресурсов используется CloudFormation, как с помощью шаблонов, так и из программного кода, с помощью SDK. Единица управления ресурсами называется стеком.


Конвейер обновления версий кода создается с помощью группы сервисов:


  • CodeCommit — менеджер git-репозиториев, может быть безболезненно заменен на github.
  • CodeBuild — сборка и публикация артефактов. Докеровские образы сохраняются в ECR-Elastic Container Repository.
  • CodeDeploy — поставка, в нашем случае в Fargate или Elastic Beanstalk.
  • CodePipeline — оркестрация конвейера.

Все логи накапливаются в CloudWatch. Там же, в пару кликов мыши, можно настроить алерты и дашборды для мониторинга.


Ответ на заглавный вопрос


Итак, для того, чтобы запустить веб-приложение, понадобилось 9 сервисов AWS, а для того, чтобы настроить девелоперские операции — еще 8 сервисов.


Следует отдать должное AWS, они максимально уменьшили порог вхождения, документации и примеров — предостаточно, но все же 17 раз пришлось разбираться с логикой проприетарного сервиса!


Когда я начинал, то не думал, что мне это может понравится. Я сопротивлялся. Так, например, закодил самостоятельно механизм jwt-аутентификации, вместо того, чтобы использовать Cognito.


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