DEV Community

Puru
Puru

Posted on

Deploy scalable, highly-available and infra-as-code managed web app on AWS

Learn how to deploy a scalable, highly available and infra-as-code managed 3-tier web application on AWS.

In this post, I'll be using Crystalnix’s Omaha Server as an example web application but it should equally apply to any other web app you wish to deploy onto AWS.

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.
omaha-consulting/omaha-server

Technologies

  • AWS CloudFormation

  • Amazon VPC

  • AWS ALB

  • Amazon ElastiCache (redis)

  • Amazon RDS (postgres)

  • AWS S3

  • Amazon ECS with EC2 launch type

  • and Docker.

Architecture

Here's the high-level architecture diagram of what we'll be working on.

Fig: High-level Architecture Diagram

Let’s get started and have fun learning!

1. Clone the repository from Github

$ git clone https://github.com/tuladhar/omaha-server-on-aws
Enter fullscreen mode Exit fullscreen mode

GitHub logo tuladhar / omaha-server-on-aws

Learn how to deploy a scalable, highly available and infra-as-code managed web application on AWS.

2. Setup AWS credentials and environment variables

$ export AWS_PROFILE=REPLACE_ME
$ export AWS_REGION=us-east-1

$ export ENV_LABEL=omaha
$ export ENV_TYPE=nonprod
Enter fullscreen mode Exit fullscreen mode

3. Deploy stack: Virtual Private Cloud (VPC)

Fig: VPC with private & public subnet on AZ1 & AZ2 with Internet and NAT gatewayFig: VPC with private & public subnet on AZ1 & AZ2 with Internet and NAT gateway

$ export SECOND_OCTET=254

$ make -C 01_NETWORK/01_VPC create-stack
Enter fullscreen mode Exit fullscreen mode

Fig: CloudFormation stackFig: CloudFormation stack

4. Deploy stack: Multi-AZ Public Load-balancer

Fig: Publicly reachable load-balancer deployed on public subnet AZ1 & AZ2Fig: Publicly reachable load-balancer deployed on public subnet AZ1 & AZ2

$ make -C 01_NETWORK/02_ALB create-stack
Enter fullscreen mode Exit fullscreen mode

Fig: CloudFormation stackFig: CloudFormation stack

5. Deploy stack: Multi-AZ ElastiCache Redis Cluster

Fig: Multi-AZ ElastiCache Redis ClusterFig: Multi-AZ ElastiCache Redis Cluster

$ make -C 02_DATABASE/01_REDIS create-stack
Enter fullscreen mode Exit fullscreen mode

Fig: Redis CloudFormation stackFig: Redis CloudFormation stack

6. Deploy stack: Multi-AZ RDS (postgres) with read-replica

Fig: Multi-AZ RDS (postgres) with read-replicaFig: Multi-AZ RDS (postgres) with read-replica

$ make -C 02_DATABASE/02_RDS create-stack
Enter fullscreen mode Exit fullscreen mode

7. Deploy stack: S3 bucket

$ make -C 03_S3 create-stack
Enter fullscreen mode Exit fullscreen mode

Fig: S3 Bucket CloudFormation StackFig: S3 Bucket CloudFormation Stack

8. Deploy stack: ECS Cluster

Fig: Deploy ECS cluster with EC2 launch typeFig: Deploy ECS cluster with EC2 launch type

$ make -C 04_COMPUTE/01_ECS/01_CLUSTER create-stack
Enter fullscreen mode Exit fullscreen mode

Fig: Cloudformation stackFig: Cloudformation stack

9. Deploy stack: ECS service that runs Omaha Server (Django App) container

Fig: Deploy the appFig: Deploy the app

$ make -C 04_COMPUTE/01_ECS/02_SERVICE create-stack
Enter fullscreen mode Exit fullscreen mode

Fig: CloudFormation stackFig: CloudFormation stack

Demo: Omaha Server Dashboard

Fig: Omaha Server DashboardFig: Omaha Server Dashboard

Conclusion

And that’s it. I hope you've enjoyed reading and learned something new.

What’s next?

  • Use SSM to store RDS credentials and avoid hard-coding in CloudFormation template.

  • Separate out the VPC subnets for stateless and stateful resources. Read about it in this blog post.

Don’t forget to hit 👏 and follow for more awesome blog posts.

Top comments (0)