API Backend Services

Architecture

Deploy production-ready API backends on AWS ECS:

  • Application Load Balancer: Distribute traffic across healthy containers
  • Health Checks: Automatically replace unhealthy instances
  • Auto-Scaling: Scale based on request count or CPU utilization
  • HTTPS Termination: Handle TLS at the load balancer

When to Use

API backend services on ECS are ideal when:

  • You need a reliable, scalable API layer for web or mobile applications
  • Your API is containerized and requires consistent deployment
  • You want automatic scaling based on traffic patterns
  • High availability and fault tolerance are required
  • You need fine-grained control over networking and security

Considerations

Performance Optimization

  • Configure appropriate health check intervals (10-30 seconds)
  • Use connection draining for graceful shutdowns
  • Set appropriate deregistration delays (30-60 seconds)
  • Consider sticky sessions for stateful APIs

Security Best Practices

  • Deploy containers in private subnets
  • Use security groups to restrict traffic
  • Enable access logging on the ALB
  • Use AWS WAF for additional protection

Example Configuration

# REST API backend
module "rest_api" {
  source  = "registry.patterneddesigns.ca/patterneddesigns/ecs-service/aws"
  version = "2.0.0"

  service_name        = "rest-api"
  cluster_arn         = aws_ecs_cluster.main.arn
  task_definition_arn = aws_ecs_task_definition.api.arn
  desired_count       = 3

  load_balancer = {
    target_group_arn = aws_lb_target_group.api.arn
    container_name   = "api"
    container_port   = 8080
  }

  network_configuration = {
    subnets          = var.private_subnet_ids
    security_groups  = [aws_security_group.api.id]
    assign_public_ip = false
  }

  autoscaling = {
    min_capacity               = 3
    max_capacity               = 20
    target_requests_per_target = 500
  }

  health_check_grace_period_seconds = 60
}

# GraphQL API with custom scaling
module "graphql_api" {
  source  = "registry.patterneddesigns.ca/patterneddesigns/ecs-service/aws"
  version = "2.0.0"

  service_name        = "graphql-api"
  cluster_arn         = aws_ecs_cluster.main.arn
  task_definition_arn = aws_ecs_task_definition.graphql.arn
  desired_count       = 2

  load_balancer = {
    target_group_arn = aws_lb_target_group.graphql.arn
    container_name   = "graphql"
    container_port   = 4000
  }

  network_configuration = {
    subnets          = var.private_subnet_ids
    security_groups  = [aws_security_group.graphql.id]
    assign_public_ip = false
  }

  autoscaling = {
    min_capacity       = 2
    max_capacity       = 15
    target_cpu_percent = 60
  }
}