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
}
}