Deploy a scalable, highly available and infra-as-code managed web application (Omaha server) on AWS Cloud
Learn how to deploy scalable, highly available and infra-as-code managed web application (Omaha server).
In this post, I’ll be showing you how to leverage AWS CloudFormation to deploy a scalable, highly available and manageable 3-tier web application on AWS Cloud.
I’ll use Crystalnix’s Omaha Server as an example web application but it should equally apply to other modern web app you wish to deploy onto AWS Cloud.
What is Omaha Server?
An open-source implementation of Google’s Omaha update protocol, which for example powers Chrome’s automatic update mechanism. Omaha server is used by organizations large and small for products that require sophisticated update logic and advanced usage statistics.
Technologies
- AWS CloudFormation
- Amazon VPC
- AWS ALB
- Amazon ElastiCache (redis)
- Amazon RDS (postgres)
- AWS S3
- Amazon ECS with EC2 launch type
- and Docker.
High-level Architecture
Let’s get started and have fun learning!
Clone the repository from Github
$ git clone https://github.com/tuladhar/omaha-server-on-aws
Set the AWS profile and environment variables
$ export AWS_PROFILE=REPLACE_ME
$ export AWS_REGION=us-east-1$ export ENV_LABEL=omaha
$ export ENV_TYPE=nonprod
Deploy stack: Virtual Private Cloud (VPC)
$ export SECOND_OCTET=254$ make -C 01_NETWORK/01_VPC create-stack
Deploy stack: Multi-AZ Public Load-balancer
$ make -C 01_NETWORK/02_ALB create-stack
Deploy stack: Multi-AZ ElastiCache Redis Cluster
$ make -C 02_DATABASE/01_REDIS create-stack
Deploy stack: Multi-AZ RDS (postgres) with read-replica
$ make -C 02_DATABASE/02_RDS create-stack
Deploy stack: S3 bucket
$ make -C 03_S3 create-stack
Deploy stack: ECS Cluster
$ make -C 04_COMPUTE/01_ECS/01_CLUSTER create-stack
Deploy stack: ECS service that runs Omaha Server (Django App) container
$ make -C 04_COMPUTE/01_ECS/02_SERVICE create-stack
Demo: Omaha Server Dashboard
Conclusion
And that’s it.
What’s next?
- For production, use SSM to store RDS credentials.
- Use separate subnet for stateless and stateful resources, learn more about it here.