Skip to main content

On This Page

Deploying Highly Available AWS Infrastructure with Terraform

3 min read
Share

These articles are AI-generated summaries. Please check the original sources for full details.

Deploying a Highly Available Web App on AWS Using Terraform

Victor Robin’s Day 4 Terraform challenge evolves a single-server setup into a multi-AZ clustered deployment. This architecture leverages an Application Load Balancer and Auto Scaling Groups to ensure continuous application uptime.

Why This Matters

While single-server deployments are cost-effective for development, they represent a critical single point of failure in production where an Availability Zone outage or server crash results in immediate downtime. Moving to a load-balanced, auto-scaling model transitions infrastructure from fragile manual setups to resilient, self-healing systems that handle traffic surges and hardware failures automatically.

Key Insights

  • Zero-trust security model: The instance security group explicitly rejects all internet traffic, accepting only connections from the ALB security group.
  • Dynamic Resource Management: Using Terraform variables and maps allows for configurable port management and ASG capacity settings (min 2, max 4).
  • Infrastructure Blueprints: Launch Templates act as versioned blueprints for EC2 instances, enabling consistent deployments across private subnets via Ubuntu AMIs.
  • Network Redundancy: Deploying across two Availability Zones ensures that the application remains reachable even if one physical AWS data center fails.

Working Examples

Configuration of dynamic variables for ports and scaling capacity.

variable "server_ports" {
  description = "A dictionary mapping application layers to their ports"
  type = map(object({
    port = number
    description = string
  }))
  default = {
    "http" = {
      port = 80
      description = "Standard web traffic"
    }
  }
}

variable "asg_capacity" {
  description = "Capacity settings for the Auto Scaling Group"
  type = object({
    min = number
    max = number
    desired = number
  })
  default = {
    min = 2
    max = 4
    desired = 2
  }
}

Auto Scaling Group definition targeting private subnets and the ALB target group.

resource "aws_autoscaling_group" "my_asg" {
  name = "my-app-asg"
  desired_capacity = var.asg_capacity.desired
  max_size = var.asg_capacity.max
  min_size = var.asg_capacity.min
  vpc_zone_identifier = [for subnet in aws_subnet.my_private_subnet : subnet.id]
  target_group_arns = [aws_lb_target_group.my_tg.arn]
  launch_template {
    id = aws_launch_template.my_app.id
    version = "$Latest"
  }
  tag {
    key = "Name"
    value = "my-asg-instance"
    propagate_at_launch = true
  }
}

Practical Applications

  • System: Web application hosting using Auto Scaling Groups to manage EC2 instances in private subnets. Pitfall: Hardcoding AMI IDs or ports, which prevents infrastructure reuse and complicates updates.
  • System: Secure traffic routing using an Application Load Balancer in public subnets. Pitfall: Misconfiguring IAM permissions for VPC resources, leading to immediate deployment failure during terraform apply.

References:

Continue reading

Next article

Google Colab MCP Server: Programmatic AI Agent Access to GPU Cloud Runtimes

Related Content