Table of Contents
Route 53 Resolver Overview
AWS Route 53 Resolver provides DNS resolution services for your VPCs, allowing you to resolve DNS queries between your VPC and on-premises networks, or between VPCs in different AWS accounts.
Diagram Explanation: Route 53 Resolver Flow
This diagram shows how DNS queries flow through Route 53 Resolver:
- Client: Any resource making DNS queries (EC2, Lambda, etc.)
- VPC: The Virtual Private Cloud where resources reside
- Route 53 Resolver: Central DNS resolution service
- Query Types: Different paths based on the DNS query destination
- Outbound Resolver: Forwards queries to on-premises DNS servers
- Inbound Resolver: Receives queries from external networks
Architecture Diagrams
Hybrid DNS Architecture
Diagram Explanation: Hybrid DNS Architecture
This architecture demonstrates how Route 53 Resolver integrates with on-premises DNS infrastructure:
- Outbound Endpoint: Forwards AWS VPC DNS queries to on-premises DNS servers
- Inbound Endpoint: Receives DNS queries from on-premises networks
- Private Hosted Zone: Manages internal AWS DNS records
- Encrypted Tunnel: Secure communication via VPN or Direct Connect
Multi-VPC DNS Resolution
Diagram Explanation: Multi-VPC DNS Resolution
This diagram shows DNS resolution across multiple AWS accounts and VPCs:
- Cross-Account Resolution: VPC-B queries resolve resources in VPC-A
- Resolver Rules: Define which domains are forwarded to specific endpoints
- Resource Sharing: AWS RAM enables sharing resolver rules across accounts
- Central DNS: Shared services account provides centralized DNS management
Core Components
Diagram Explanation: Route 53 Resolver Components
This diagram breaks down the key components of Route 53 Resolver:
- Resolver Endpoints: Network interfaces that handle DNS traffic
- Resolver Rules: Define how DNS queries are processed and forwarded
- Query Logging: Captures DNS query information for monitoring and troubleshooting
- ENI (Elastic Network Interface): Physical network interfaces in your subnets
- Target IP Addresses: Destination DNS servers for forwarded queries
Setup Workflow
Diagram Explanation: Setup Workflow
This flowchart shows the step-by-step process for setting up Route 53 Resolver:
- VPC & Subnets: Foundational network infrastructure
- Security Groups: Control traffic to/from resolver endpoints
- Resolver Endpoints: Create inbound and/or outbound endpoints as needed
- Resolver Rules: Define DNS forwarding logic
- Association: Link rules to VPCs
- Query Logging: Enable monitoring and troubleshooting
- Testing: Verify DNS resolution works as expected
AWS CLI Commands
Step 1: Create Security Group for Resolver Endpoints
aws ec2 create-security-group \
--group-name route53-resolver-sg \
--description "Security group for Route 53 Resolver endpoints" \
--vpc-id vpc-0123456789abcdef0
{ "GroupId": "sg-0a1b2c3d4e5f6g7h8" }
aws ec2 authorize-security-group-ingress \
--group-id sg-0a1b2c3d4e5f6g7h8 \
--protocol tcp \
--port 53 \
--source-group sg-0a1b2c3d4e5f6g7h8
aws ec2 authorize-security-group-ingress \
--group-id sg-0a1b2c3d4e5f6g7h8 \
--protocol udp \
--port 53 \
--source-group sg-0a1b2c3d4e5f6g7h8
--group-name
: Descriptive name for the security group--description
: Human-readable description--vpc-id
: VPC where the security group will be created--protocol
: TCP and UDP for DNS traffic--port 53
: Standard DNS port--source-group
: Allow traffic from the same security group
Step 2: Create Outbound Resolver Endpoint
aws route53resolver create-resolver-endpoint \
--name "outbound-resolver-endpoint" \
--direction OUTBOUND \
--security-group-ids sg-0a1b2c3d4e5f6g7h8 \
--ip-addresses SubnetId=subnet-0123456789abcdef0,Ip=10.0.1.100 \
SubnetId=subnet-0987654321fedcba0,Ip=10.0.2.100 \
--tags Key=Name,Value=OutboundResolver Key=Environment,Value=Production
{ "ResolverEndpoint": { "Id": "rslvr-out-0123456789abcdef0", "CreatorRequestId": "2023070212345678", "Arn": "arn:aws:route53resolver:us-east-1:123456789012:resolver-endpoint/rslvr-out-0123456789abcdef0", "Name": "outbound-resolver-endpoint", "SecurityGroupIds": ["sg-0a1b2c3d4e5f6g7h8"], "Direction": "OUTBOUND", "IpAddressCount": 2, "HostVPCId": "vpc-0123456789abcdef0", "Status": "CREATING", "StatusMessage": "Creating Resolver Endpoint", "CreationTime": "2025-07-02T10:30:00.000000+00:00", "ModificationTime": "2025-07-02T10:30:00.000000+00:00" } }
--name
: Friendly name for the resolver endpoint--direction OUTBOUND
: Specifies this endpoint forwards queries out of VPC--security-group-ids
: Security groups controlling access--ip-addresses
: Subnet and IP assignments (minimum 2 for HA)SubnetId
: Must be in different AZs for high availabilityIp
: Optional static IP assignment within subnet CIDR
Note: Outbound endpoints are used to forward DNS queries from your VPC to external DNS servers (like on-premises). You need at least 2 IP addresses in different Availability Zones.
Step 3: Create Inbound Resolver Endpoint
aws route53resolver create-resolver-endpoint \
--name "inbound-resolver-endpoint" \
--direction INBOUND \
--security-group-ids sg-0a1b2c3d4e5f6g7h8 \
--ip-addresses SubnetId=subnet-0123456789abcdef0,Ip=10.0.1.200 \
SubnetId=subnet-0987654321fedcba0,Ip=10.0.2.200 \
--tags Key=Name,Value=InboundResolver Key=Environment,Value=Production
{ "ResolverEndpoint": { "Id": "rslvr-in-0123456789abcdef0", "CreatorRequestId": "2023070212345679", "Arn": "arn:aws:route53resolver:us-east-1:123456789012:resolver-endpoint/rslvr-in-0123456789abcdef0", "Name": "inbound-resolver-endpoint", "SecurityGroupIds": ["sg-0a1b2c3d4e5f6g7h8"], "Direction": "INBOUND", "IpAddressCount": 2, "HostVPCId": "vpc-0123456789abcdef0", "Status": "CREATING", "StatusMessage": "Creating Resolver Endpoint", "CreationTime": "2025-07-02T10:35:00.000000+00:00", "ModificationTime": "2025-07-02T10:35:00.000000+00:00" } }
--direction INBOUND
: Specifies this endpoint receives queries from external networks- Same IP address structure as outbound, but serves opposite purpose
- External networks (on-premises) will point to these IP addresses for DNS resolution
Note: Inbound endpoints receive DNS queries from external networks (like on-premises) and resolve them using VPC DNS or Route 53 private hosted zones.
Step 4: Create Resolver Rule
aws route53resolver create-resolver-rule \
--name "forward-to-onpremises" \
--rule-type FORWARD \
--domain-name "corp.internal" \
--resolver-endpoint-id rslvr-out-0123456789abcdef0 \
--target-ips Ip=192.168.1.10,Port=53 Ip=192.168.1.11,Port=53 \
--tags Key=Name,Value=OnPremisesForwardRule Key=Environment,Value=Production
{ "ResolverRule": { "Id": "rslvr-rr-0123456789abcdef0", "CreatorRequestId": "2023070212345680", "Arn": "arn:aws:route53resolver:us-east-1:123456789012:resolver-rule/rslvr-rr-0123456789abcdef0", "DomainName": "corp.internal", "Status": "COMPLETE", "StatusMessage": "Rule created successfully", "RuleType": "FORWARD", "Name": "forward-to-onpremises", "TargetIps": [ { "Ip": "192.168.1.10", "Port": 53 }, { "Ip": "192.168.1.11", "Port": 53 } ], "ResolverEndpointId": "rslvr-out-0123456789abcdef0", "OwnerId": "123456789012", "ShareStatus": "NOT_SHARED", "CreationTime": "2025-07-02T10:40:00.000000+00:00", "ModificationTime": "2025-07-02T10:40:00.000000+00:00" } }
--name
: Descriptive name for the rule--rule-type FORWARD
: Forward queries to specified target IPs--domain-name
: Domain pattern to match (supports wildcards like *.corp.internal)--resolver-endpoint-id
: Must reference an OUTBOUND endpoint--target-ips
: DNS servers to forward queries to (on-premises DNS)Port=53
: Standard DNS port (can be customized if needed)
Rule Types Available:
FORWARD
: Forward queries to target IPsSYSTEM
: Use AWS default DNS resolutionRECURSIVE
: Use Route 53 Resolver recursive resolution
Step 5: Associate Resolver Rule with VPC
aws route53resolver associate-resolver-rule \
--resolver-rule-id rslvr-rr-0123456789abcdef0 \
--vpc-id vpc-0123456789abcdef0 \
--name "production-vpc-association"
{ "ResolverRuleAssociation": { "Id": "rslvr-rrassoc-0123456789abcdef0", "ResolverRuleId": "rslvr-rr-0123456789abcdef0", "Name": "production-vpc-association", "VPCId": "vpc-0123456789abcdef0", "Status": "CREATING", "StatusMessage": "Creating Resolver Rule Association" } }
--resolver-rule-id
: The rule to associate--vpc-id
: VPC where the rule should apply--name
: Optional name for the association
Important: A resolver rule must be associated with a VPC to take effect. Rules can be associated with multiple VPCs, and a VPC can have multiple rule associations.
Step 6: Enable Query Logging
aws route53resolver create-resolver-query-log-config \
--name "production-dns-query-logs" \
--destination-arn "arn:aws:logs:us-east-1:123456789012:log-group:route53-resolver-queries" \
--tags Key=Name,Value=DNSQueryLogs Key=Environment,Value=Production
{ "ResolverQueryLogConfig": { "Id": "rqlc-0123456789abcdef0", "Name": "production-dns-query-logs", "Arn": "arn:aws:route53resolver:us-east-1:123456789012:resolver-query-log-config/rqlc-0123456789abcdef0", "Status": "CREATING", "DestinationArn": "arn:aws:logs:us-east-1:123456789012:log-group:route53-resolver-queries", "CreatorRequestId": "2023070212345681", "CreationTime": "2025-07-02T10:45:00.000000+00:00", "AssociationCount": 0 } }
aws route53resolver associate-resolver-query-log-config \
--resolver-query-log-config-id rqlc-0123456789abcdef0 \
--resource-id vpc-0123456789abcdef0
{ "ResolverQueryLogConfigAssociation": { "Id": "rqlca-0123456789abcdef0", "ResolverQueryLogConfigId": "rqlc-0123456789abcdef0", "ResourceId": "vpc-0123456789abcdef0", "Status": "CREATING", "CreationTime": "2025-07-02T10:50:00.000000+00:00" } }
--name
: Name for the query log configuration--destination-arn
: CloudWatch Logs group or S3 bucket ARN--resource-id
: VPC to associate with query logging
Supported Destinations:
- CloudWatch Logs:
arn:aws:logs:region:account:log-group:name
- S3 Bucket:
arn:aws:s3:::bucket-name
- Kinesis Data Firehose:
arn:aws:firehose:region:account:deliverystream/name
Step 7: Verify Configuration
aws route53resolver list-resolver-endpoints
{ "ResolverEndpoints": [ { "Id": "rslvr-out-0123456789abcdef0", "Name": "outbound-resolver-endpoint", "Direction": "OUTBOUND", "Status": "OPERATIONAL", "IpAddressCount": 2, "HostVPCId": "vpc-0123456789abcdef0" }, { "Id": "rslvr-in-0123456789abcdef0", "Name": "inbound-resolver-endpoint", "Direction": "INBOUND", "Status": "OPERATIONAL", "IpAddressCount": 2, "HostVPCId": "vpc-0123456789abcdef0" } ] }
aws route53resolver list-resolver-rules
{ "ResolverRules": [ { "Id": "rslvr-rr-0123456789abcdef0", "Name": "forward-to-onpremises", "DomainName": "corp.internal", "Status": "COMPLETE", "RuleType": "FORWARD", "ResolverEndpointId": "rslvr-out-0123456789abcdef0", "TargetIps": [ { "Ip": "192.168.1.10", "Port": 53 }, { "Ip": "192.168.1.11", "Port": 53 } ] } ] }
Configuration Examples
Complex Resolver Rule Configuration
# Create a wildcard forwarding rule for all subdomains
aws route53resolver create-resolver-rule \
--name "wildcard-corp-forward" \
--rule-type FORWARD \
--domain-name "*.corp.internal" \
--resolver-endpoint-id rslvr-out-0123456789abcdef0 \
--target-ips Ip=192.168.1.10,Port=53 \
Ip=192.168.1.11,Port=53 \
Ip=192.168.2.10,Port=53
*.corp.internal
: Matches all subdomains under corp.internal- Multiple target IPs provide redundancy and load distribution
- Can specify different ports if on-premises DNS runs on non-standard ports
This configuration forwards all queries for any subdomain of corp.internal to the specified on-premises DNS servers. For example: app1.corp.internal, db.corp.internal, etc.
System Rule for Recursive Resolution
# Create a system rule to use AWS recursive resolution
aws route53resolver create-resolver-rule \
--name "aws-recursive-resolution" \
--rule-type SYSTEM \
--domain-name "amazonaws.com" \
--tags Key=Name,Value=AWSSystemRule
SYSTEM
rule type uses AWS default DNS resolution- No resolver endpoint or target IPs needed
- Useful for ensuring AWS service domains resolve properly
- Higher priority than FORWARD rules
System rules ensure that specific domains use AWS's built-in DNS resolution instead of being forwarded to on-premises DNS servers.
Cross-Account Rule Sharing
# Share resolver rule with other AWS accounts using AWS RAM
aws ram create-resource-share \
--name "dns-resolver-rules-share" \
--resource-arns "arn:aws:route53resolver:us-east-1:123456789012:resolver-rule/rslvr-rr-0123456789abcdef0" \
--principals "123456789013,123456789014" \
--tags Key=Name,Value=DNSRuleShare
--resource-arns
: ARN of the resolver rule to share--principals
: AWS account IDs to share with- Shared rules can be associated with VPCs in target accounts
- Enables centralized DNS rule management
Resource sharing allows you to create resolver rules in one account and use them across multiple accounts, enabling centralized DNS policy management.
CloudWatch Log Group Configuration
# Create CloudWatch log group for DNS query logs
aws logs create-log-group \
--log-group-name "route53-resolver-queries" \
--retention-in-days 30 \
--tags "Environment=Production,Service=Route53Resolver"
# Set log group policy to allow Route 53 Resolver to write logs
aws logs put-resource-policy \
--policy-name "Route53ResolverLogPolicy" \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "route53resolver.amazonaws.com"
},
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:us-east-1:123456789012:log-group:route53-resolver-queries:*"
}
]
}'
--retention-in-days
: How long to keep log dataput-resource-policy
: Grants Route 53 Resolver permission to write logs- Policy allows CreateLogStream and PutLogEvents actions
- Service principal: route53resolver.amazonaws.com
This configuration sets up CloudWatch Logs to receive DNS query logs from Route 53 Resolver, with appropriate retention and permissions.
Troubleshooting
Diagram Explanation: Troubleshooting Flowchart
This troubleshooting flowchart helps diagnose common Route 53 Resolver issues:
- Endpoint Status: First check if resolver endpoints are operational
- Rule Configuration: Verify resolver rules are correctly configured
- VPC Association: Ensure rules are associated with the correct VPCs
- Network Connectivity: Verify target DNS servers are reachable
- Query Analysis: Use logs to understand DNS query patterns
Common Troubleshooting Commands
# Check resolver endpoint details and IP addresses
aws route53resolver get-resolver-endpoint \
--resolver-endpoint-id rslvr-out-0123456789abcdef0
# List all resolver rule associations for a VPC
aws route53resolver list-resolver-rule-associations \
--filters Name=VPCId,Values=vpc-0123456789abcdef0
# Check query log configuration status
aws route53resolver get-resolver-query-log-config \
--resolver-query-log-config-id rqlc-0123456789abcdef0
# Test DNS resolution from EC2 instance
dig @10.0.1.100 app1.corp.internal
nslookup app1.corp.internal 10.0.1.100
get-resolver-endpoint
: Shows detailed endpoint configuration and statuslist-resolver-rule-associations
: Verifies rule-to-VPC associationsdig/nslookup
: Test DNS resolution from instances- CloudWatch Logs: Analyze query patterns and failures
Always verify security groups allow DNS traffic (TCP/UDP 53) and that target DNS servers are accessible from the resolver endpoint subnets.