Amazon Route 53

DNS and domain management for custom domains

💵 Cost: Route 53 costs $0.50/month per hosted zone + $0.40 per million queries. Domain registration costs vary ($12-50+/year depending on TLD). See aws.amazon.com/route53/pricing. Last verified: January 2026.

What is Route 53?

Amazon Route 53 is a scalable DNS (Domain Name System) web service. It translates human-readable domain names (like example.com) into IP addresses that computers use to connect to each other.

Why Use Route 53?

  • Register domains directly in AWS
  • Point custom domains to your ALB, CloudFront, or S3
  • Health checks and failover routing
  • Integrates with ACM for free SSL certificates

Route 53 Concepts

ConceptPurposeExample
Hosted ZoneContainer for DNS records of a domainexample.com hosted zone
Record SetDNS record (A, CNAME, ALIAS, etc.)www.example.com → ALB
ALIAS RecordAWS-specific record that points to AWS resourcesRoot domain → ALB
Health CheckMonitors endpoint availabilityCheck if ALB is responding

Step 1: Create a Hosted Zone

Terminal
$aws route53 create-hosted-zone --name example.com --caller-reference $(date +%s)
{
  "HostedZone": {
    "Id": "/hostedzone/Z1234567890ABC",
    "Name": "example.com.",
    "CallerReference": "1704067200"
  },
  "DelegationSet": {
    "NameServers": [
      "ns-123.awsdns-45.com",
      "ns-456.awsdns-78.net",
      "ns-789.awsdns-01.org",
      "ns-012.awsdns-34.co.uk"
    ]
  }
}

Update Name Servers

If your domain is registered elsewhere (GoDaddy, Namecheap, etc.), update the name servers at your registrar to point to AWS name servers. This can take up to 48 hours to propagate.

Step 2: Request SSL Certificate (ACM)

Terminal
$aws acm request-certificate --domain-name example.com --subject-alternative-names *.example.com --validation-method DNS
{
  "CertificateArn": "arn:aws:acm:ap-southeast-1:123456789:certificate/abc123-..."
}

Step 3: Validate Certificate via DNS

ACM will provide a CNAME record to add to Route 53 for domain validation. You can do this automatically:

Terminal
$aws acm describe-certificate --certificate-arn arn:aws:acm:... | \ jq '.Certificate.DomainValidationOptions[0].ResourceRecord'
{
  "Name": "_abc123.example.com.",
  "Type": "CNAME",
  "Value": "_xyz789.acm-validations.aws."
}

Step 4: Create ALIAS Record to ALB

JSON
{
  "Comment": "Point domain to ALB",
  "Changes": [{
    "Action": "UPSERT",
    "ResourceRecordSet": {
      "Name": "example.com",
      "Type": "A",
      "AliasTarget": {
        "HostedZoneId": "Z1234567890ABC",
        "DNSName": "my-alb-123456.ap-southeast-1.elb.amazonaws.com",
        "EvaluateTargetHealth": true
      }
    }
  }]
}
Terminal
$aws route53 change-resource-record-sets --hosted-zone-id Z1234567890ABC --change-batch file://record.json
{
  "ChangeInfo": {
    "Id": "/change/C1234567890ABC",
    "Status": "PENDING"
  }
}
HCL
# Create hosted zone (if not using existing domain)
resource "aws_route53_zone" "main" {
  name = "example.com"
}

# Request SSL certificate
resource "aws_acm_certificate" "main" {
  domain_name       = "example.com"
  subject_alternative_names = ["*.example.com"]
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}

# DNS validation records
resource "aws_route53_record" "cert_validation" {
  for_each = {
    for dvo in aws_acm_certificate.main.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      type   = dvo.resource_record_type
      record = dvo.resource_record_value
    }
  }

  zone_id = aws_route53_zone.main.zone_id
  name    = each.value.name
  type    = each.value.type
  records = [each.value.record]
  ttl     = 60
}

# Wait for certificate validation
resource "aws_acm_certificate_validation" "main" {
  certificate_arn = aws_acm_certificate.main.arn
  validation_record_fqdns = [
    for record in aws_route53_record.cert_validation : record.fqdn
  ]
}

# ALIAS record pointing to ALB
resource "aws_route53_record" "app" {
  zone_id = aws_route53_zone.main.zone_id
  name    = "example.com"
  type    = "A"

  alias {
    name                   = aws_lb.main.dns_name
    zone_id                = aws_lb.main.zone_id
    evaluate_target_health = true
  }
}

# WWW subdomain
resource "aws_route53_record" "www" {
  zone_id = aws_route53_zone.main.zone_id
  name    = "www.example.com"
  type    = "A"

  alias {
    name                   = aws_lb.main.dns_name
    zone_id                = aws_lb.main.zone_id
    evaluate_target_health = true
  }
}

Route 53 Pricing

Region-Specific Pricing

Route 53 is a global service with consistent pricing. Always verify at aws.amazon.com/route53/pricing. Last verified: January 2026.
ComponentCost
Hosted Zone$0.50/month
Standard Queries$0.40 per million
Latency-Based Queries$0.60 per million
Geo DNS Queries$0.70 per million
Health Checks (basic)$0.50/month each
Health Checks (HTTPS)$0.75/month each

AWS Deployment Guide — Built with Next.js