DEV Community

Cover image for ->> Day-24 Highly Available and Scalable Architecture Using Terraform
Amit Kushwaha
Amit Kushwaha

Posted on • Edited on

->> Day-24 Highly Available and Scalable Architecture Using Terraform

Deploying a Scalable Dockerized Django Application on AWS using Terraform

Modern applications are not deployed on a single EC2 instance anymore.

In this project, I built a production-style architecture on AWS using Terraform, where:

  • A Dockerized Django application runs on EC2 instances
  • Instances are deployed in private subnets
  • Application Load Balancer handles incoming traffic
  • Auto Scaling Group maintains availability
  • NAT Gateways provide outbound internet access
  • docker images are pulled from Docker Hub

Everything was provisioned using Infrastructure as Code.


Project Goal

  • Deploy a containerized Django app securely
  • Follow real production architecture patterns
  • Keep EC2 instance private
  • Enable horizontal scaling
  • Automate the full infrastructure using Terraform

Architecture Diagram


Internet → ALB (Public) → EC2 Instances (Private) → NAT Gateways → Internet
                                ↓
                          Django Docker App
Enter fullscreen mode Exit fullscreen mode

Networking Design

VPC

  • Custom VPC created using Terraform
  • CIDR-based subnet planning

Public Subnets (AZ1 & AZ2)

  • Host Application Load Balancer
  • Host NAT Gateways
  • Connected to Internet Gateway

Private Subnets (AZ1 & AZ2)

  • Host EC2 instances
  • No direct internet access
  • Outbound access via NAT Gateway

Why this matters:

Private subnets ensure your application servers are not publicly exposed.


Application Load Balancer (ALB)

The ALB:

  • Listens on HTTP (80) / HTTPS (if configured)
  • Forwards traffic to target group
  • Performs health checks
  • Distributes traffic across instances in multiple AZs

Auto Scaling Group (ASG)

Configured with:

  • Minimum: 1 instance
  • Desired: 2 instances
  • Maximum: 5 instances

The ASG:

  • Maintains desired capacity
  • Replaces unhealthy instances
  • Works across multiple availability zones

If one AZ fails, traffic shifts automatically.


EC2 + Docker Deployment

EC2 instances are launched using a Launch Template.

Inside the user data script:

  • Docker is installed
  • Django image is pulled from Docker Hub
  • Container is started with port mapping
docker run -d -p 80:8000 your-django-image
Enter fullscreen mode Exit fullscreen mode

Port mapping:

  • Django runs internally on 8000
  • Exposed externally via port 80
  • ALB forwards traffic to port 80

NAT Gateway Usage

Since EC2 instances are in private subnets:

They cannot directly access the internet.

NAT Gateway allows:

  • Pulling Docker images from Docker Hub
  • Installing updates
  • Accessing external services

Deployment Steps

terraform init
terraform plan
terraform apply
Enter fullscreen mode Exit fullscreen mode

Github Repo

>> Connect With Me

If you enjoyed this post or want to follow my #30DaysOfAWSTerraformChallenge journey, feel free to connect with me here:

💼 LinkedIn: Amit Kushwaha

🐙 GitHub: Amit Kushwaha

📝 Hashnode / Amit Kushwaha

🐦 Twitter/X: Amit Kushwaha

Found this helpful? Drop a ❤️ and follow for more AWS and Terraform tutorials!

Questions? Drop them in the comments below! 👇

Top comments (0)