Amazon Route 53 is AWS's highly available DNS web service — it translates domain names into IP addresses, routes traffic using policies like weighted and latency-based routing, and monitors endpoint health to fail over automatically. It's named "53" after the standard DNS port (UDP/TCP 53), and it does far more than plain authoritative DNS.

Key Takeaways

  • Route 53 supports standard DNS records (A, AAAA, CNAME, MX, TXT) plus AWS-specific Alias records that point to AWS resources for free.
  • Routing policies — simple, weighted, latency-based, failover, geolocation, geoproximity, multivalue — control which record is returned, not just that one is.
  • Health checks monitor endpoints and automatically pull unhealthy targets out of rotation.
  • Route 53 is also a domain registrar, separate from its DNS hosting function — you can use one without the other.
  • Alias records to AWS resources (CloudFront, S3, ALB) don't incur the standard per-query charge the way CNAME-equivalent lookups to external records might.

Core Record Types in Route 53

# List all records in a hosted zone
aws route53 list-resource-record-sets \
  --hosted-zone-id Z1D633PJN98FT9 \
  --query "ResourceRecordSets[].{Name:Name,Type:Type}"
RecordPurpose
A / AAAAMaps a domain to an IPv4/IPv6 address
CNAMEMaps a domain to another domain name
AliasAWS-specific pointer to CloudFront, ALB, S3, API Gateway, etc. — no extra charge
MXMail server routing
TXTVerification, SPF/DKIM records
NSDelegates a subdomain to another nameserver

Creating an Alias Record for CloudFront or ALB

Alias records are the Route 53-specific feature most teams underuse. Unlike a CNAME, an Alias record can be set at the zone apex (example.com, not just www.example.com) and resolves at the DNS layer with no extra lookup cost.

{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "example.com",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "d111111abcdef8.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
# Apply the alias record change above
aws route53 change-resource-record-sets \
  --hosted-zone-id Z1D633PJN98FT9 \
  --change-batch file://alias-change.json

Routing Policies Explained

<svg viewBox="0 0 760 340" xmlns="http://www.w3.org/2000/svg" style="width:100%;max-width:760px;font-family:sans-serif;color:currentColor">
  <style>
    .box { fill: none; stroke: currentColor; stroke-width: 1.5; }
    .lbl { fill: currentColor; font-size: 12px; }
    .accent { fill: currentColor; opacity: 0.12; }
    .arrow { stroke: currentColor; stroke-width: 1.3; marker-end: url(#a2); }
  </style>
  <defs>
    <marker id="a2" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
      <path d="M0,0 L8,3 L0,6 Z" fill="currentColor"/>
    </marker>
  </defs>
  <rect x="20" y="140" width="140" height="50" class="box accent"/>
  <text x="35" y="170" class="lbl">DNS Query</text>

  <rect x="260" y="20" width="160" height="40" class="box"/>
  <text x="275" y="45" class="lbl">Weighted (70/30 split)</text>
  <rect x="260" y="80" width="160" height="40" class="box"/>
  <text x="275" y="105" class="lbl">Latency-based</text>
  <rect x="260" y="140" width="160" height="40" class="box accent"/>
  <text x="275" y="165" class="lbl">Failover (primary/standby)</text>
  <rect x="260" y="200" width="160" height="40" class="box"/>
  <text x="275" y="225" class="lbl">Geolocation</text>
  <rect x="260" y="260" width="160" height="40" class="box"/>
  <text x="275" y="285" class="lbl">Multivalue + health check</text>

  <rect x="560" y="140" width="170" height="50" class="box accent"/>
  <text x="575" y="170" class="lbl">Healthy endpoint IP</text>

  <line x1="160" y1="165" x2="260" y2="40" class="arrow"/>
  <line x1="160" y1="165" x2="260" y2="100" class="arrow"/>
  <line x1="160" y1="165" x2="260" y2="160" class="arrow"/>
  <line x1="160" y1="165" x2="260" y2="220" class="arrow"/>
  <line x1="160" y1="165" x2="260" y2="280" class="arrow"/>
  <line x1="420" y1="165" x2="560" y2="165" class="arrow"/>
</svg>
  • Simple — one record, no logic. Default for single-endpoint setups.
  • Weighted — distribute traffic by percentage; great for canary deploys.
  • Latency-based — route to the AWS region with lowest latency for the user.
  • Failover — primary/secondary with automatic health-check-driven switchover.
  • Geolocation — route based on the user's geographic location.
  • Multivalue answer — return multiple healthy IPs, each health-checked, for lightweight load distribution without a load balancer.

Setting Up a Health Check and Failover

# Create a health check against an HTTPS endpoint
aws route53 create-health-check \
  --caller-reference "primary-web-$(date +%s)" \
  --health-check-config \
  Type=HTTPS,ResourcePath=/health,FullyQualifiedDomainName=primary.example.com,Port=443,RequestInterval=30,FailureThreshold=3
# Terraform: failover routing with health check
resource "aws_route53_health_check" "primary" {
  fqdn              = "primary.example.com"
  port              = 443
  type              = "HTTPS"
  resource_path     = "/health"
  failure_threshold = 3
  request_interval  = 30
}

resource "aws_route53_record" "primary" {
  zone_id = var.zone_id
  name    = "app.example.com"
  type    = "A"
  set_identifier  = "primary"
  failover_routing_policy { type = "PRIMARY" }
  health_check_id = aws_route53_health_check.primary.id
  alias {
    name                   = aws_lb.primary.dns_name
    zone_id                = aws_lb.primary.zone_id
    evaluate_target_health = true
  }
}

Common DNS Pitfalls on Route 53

  1. Low TTLs left in production — fine for migrations, costly for query volume afterward; raise TTL once things stabilize.
  2. Forgetting NS record propagation delay — when delegating a subdomain, nameserver changes can take time to propagate globally; don't assume instant cutover.
  3. CNAME at the zone apex — not allowed by DNS spec; use an Alias record instead for apex domains pointing to AWS resources.
  4. No health check on failover records — without EvaluateTargetHealth or an explicit health check, failover routing never actually fails over.

FAQ

What is Amazon Route 53 used for? Route 53 is AWS's DNS web service — it resolves domain names to IP addresses, supports domain registration, and offers traffic-routing policies (weighted, latency, failover, geolocation) plus health checks for automatic failover.

Why is it called "Route 53"? 53 refers to the standard DNS port (UDP/TCP 53) that DNS servers use to answer queries — a naming nod from the Route 53 team.

Is an Alias record the same as a CNAME? No. A CNAME can't be used at a domain's zone apex and always incurs a DNS lookup. An Alias record is Route 53-specific, works at the apex, resolves directly to the AWS resource's IP, and has no additional query charge for AWS resource targets.

Does Route 53 only work with domains registered through AWS? No — you can use Route 53 purely as a DNS hosting service for domains registered with any registrar by updating the domain's nameservers to point to your Route 53 hosted zone.

Need Help Architecting Your DNS and Failover Strategy?

Route 53 routing policies and health checks are powerful but easy to misconfigure in ways that silently defeat failover. F9 Infotech's AWS infrastructure team can design and implement a resilient Route 53 DNS architecture tailored to your availability requirements. Talk to our cloud architecture team about your DNS and failover setup.