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
| Concept | Purpose | Example |
|---|---|---|
| Hosted Zone | Container for DNS records of a domain | example.com hosted zone |
| Record Set | DNS record (A, CNAME, ALIAS, etc.) | www.example.com → ALB |
| ALIAS Record | AWS-specific record that points to AWS resources | Root domain → ALB |
| Health Check | Monitors endpoint availability | Check 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.
| Component | Cost |
|---|---|
| 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 |