AWS · ROUTE 53 · DNS HYBRIDE · TERRAFORM
Quand une entreprise migre une partie de son infrastructure vers AWS tout en conservant des serveurs on-premise, la question du DNS hybride avec Route 53 se pose rapidement. Comment faire pour que vos serveurs cloud resolvent les noms internes, et inversement ? Je vous montre ici la methode que j’utilise en production, avec Terraform et Route 53 Resolver.
📋 Au programme
- Le probleme concret du DNS hybride cloud/on-prem
- Architecture Route 53 Resolver : comment ca marche
- Prerequis et preparation
- Configuration Terraform complete
- Configurer le DNS on-premise (BIND / Active Directory)
- Tests et validation de la resolution hybride
- Erreurs courantes et depannage
- Checklist mise en production
- FAQ

La resolution DNS hybride entre AWS et un reseau on-premise est un sujet que je rencontre regulierement chez mes clients. La plupart du temps, le besoin est simple : les applications dans le VPC doivent resoudre les noms internes de l’entreprise (ad.monentreprise.local, erp.interne.fr), et les serveurs on-premise doivent acceder aux services AWS via des noms DNS prives. AWS Route 53 Resolver est la reponse native a ce besoin. Voici comment je le mets en place.
En bref
Route 53 Resolver permet de creer des endpoints entrants et sortants dans votre VPC pour router les requetes DNS entre AWS et votre datacenter on-premise, via un tunnel VPN ou une connexion Direct Connect. Tout se configure en Terraform en moins de 100 lignes.
Le probleme concret du DNS hybride cloud/on-prem
Quand vous connectez un VPC AWS a votre reseau d’entreprise via VPN site-to-site ou Direct Connect, le reseau IP fonctionne. Vos serveurs se pingent. Mais les noms DNS, eux, ne se resolvent pas entre les deux mondes.
Pourquoi ? Parce que le resolveur DNS du VPC (le .2 resolver, soit 10.0.0.2 pour un VPC en 10.0.0.0/16) ne connait que les zones Route 53 privees. Il ne sait rien de votre Active Directory, de votre BIND interne ou de vos zones .local.
Inversement, votre DNS on-premise ne sait pas resoudre mon-service.vpc.internal cote AWS.
Resultat : vos applications tombent en timeout sur des lookups DNS, et vos equipes perdent du temps a mettre des IP en dur dans les fichiers /etc/hosts. Ce n’est pas viable en production. Si vous gerez une infrastructure hybride et que ce type de problematique vous bloque, un audit de votre architecture reseau permet souvent de clarifier la cible.
Architecture Route 53 Resolver : comment ca marche
Route 53 Resolver fonctionne avec deux types d’endpoints :
⬇️
Inbound Endpoint
Recoit les requetes DNS venant de votre reseau on-premise. Vos serveurs DNS internes forwardent les zones AWS vers ces IP.
⬆️
Outbound Endpoint
Envoie les requetes DNS du VPC vers vos serveurs DNS on-premise. Les regles de forwarding definissent quelles zones sont concernees.
📋
Forwarding Rules
Regles associees a l’outbound endpoint. Elles indiquent que les requetes pour monentreprise.local doivent aller vers vos DNS internes.
🔗
VPN / Direct Connect
Le lien reseau entre les deux mondes. Les endpoints Resolver utilisent des ENI dans vos subnets prives, accessibles via ce lien.
Le flux est le suivant :
- Une instance EC2 dans le VPC fait un lookup sur
erp.monentreprise.local - Le resolver VPC consulte les forwarding rules
- La requete est envoyee via l’outbound endpoint vers le DNS on-premise
- La reponse revient par le meme chemin
Dans l’autre sens, le DNS on-premise forward les zones AWS (ex: vpc.internal) vers l’inbound endpoint.
Prerequis et preparation
✅ Prerequis
Un VPC AWS avec au moins 2 subnets prives (AZ differentes)
VPN site-to-site ou Direct Connect fonctionnel
DNS on-premise fonctionnel (BIND, Active Directory, ou autre)
Terraform >= 1.5 et AWS Provider >= 5.0
Security groups autorisant le port 53 (TCP+UDP) entre les deux reseaux
Configuration Terraform complete
Voici la configuration Terraform que j’utilise pour deployer les endpoints Route 53 Resolver et les regles de forwarding.
Security group pour les endpoints Resolver
resource "aws_security_group" "resolver" {
name_prefix = "dns-resolver-"
vpc_id = var.vpc_id
description = "Allow DNS traffic for Route 53 Resolver endpoints"
ingress {
from_port = 53
to_port = 53
protocol = "tcp"
cidr_blocks = [var.onprem_cidr]
description = "DNS TCP from on-premise"
}
ingress {
from_port = 53
to_port = 53
protocol = "udp"
cidr_blocks = [var.onprem_cidr]
description = "DNS UDP from on-premise"
}
egress {
from_port = 53
to_port = 53
protocol = "tcp"
cidr_blocks = [var.onprem_cidr]
description = "DNS TCP to on-premise"
}
egress {
from_port = 53
to_port = 53
protocol = "udp"
cidr_blocks = [var.onprem_cidr]
description = "DNS UDP to on-premise"
}
tags = {
Name = "${var.project_name}-dns-resolver"
}
}
Inbound Endpoint (on-premise vers AWS)
resource "aws_route53_resolver_endpoint" "inbound" {
name = "${var.project_name}-inbound"
direction = "INBOUND"
security_group_ids = [aws_security_group.resolver.id]
ip_address {
subnet_id = var.private_subnet_ids[0]
}
ip_address {
subnet_id = var.private_subnet_ids[1]
}
tags = {
Name = "${var.project_name}-resolver-inbound"
}
}
Deux AZ minimum
AWS impose au moins deux blocs ip_address dans des AZ differentes. C’est une bonne pratique de resilience : si une AZ tombe, le DNS continue de fonctionner.
Outbound Endpoint (AWS vers on-premise)
resource "aws_route53_resolver_endpoint" "outbound" {
name = "${var.project_name}-outbound"
direction = "OUTBOUND"
security_group_ids = [aws_security_group.resolver.id]
ip_address {
subnet_id = var.private_subnet_ids[0]
}
ip_address {
subnet_id = var.private_subnet_ids[1]
}
tags = {
Name = "${var.project_name}-resolver-outbound"
}
}
Forwarding Rule vers le DNS on-premise
resource "aws_route53_resolver_rule" "forward_onprem" {
domain_name = var.onprem_domain
name = "${var.project_name}-forward-onprem"
rule_type = "FORWARD"
resolver_endpoint_id = aws_route53_resolver_endpoint.outbound.id
target_ip {
ip = var.onprem_dns_servers[0]
port = 53
}
target_ip {
ip = var.onprem_dns_servers[1]
port = 53
}
tags = {
Name = "${var.project_name}-forward-to-onprem"
}
}
resource "aws_route53_resolver_rule_association" "forward_onprem" {
resolver_rule_id = aws_route53_resolver_rule.forward_onprem.id
vpc_id = var.vpc_id
}
Variables
variable "vpc_id" {
description = "ID du VPC"
type = string
}
variable "private_subnet_ids" {
description = "IDs des subnets prives (min 2, AZ differentes)"
type = list(string)
}
variable "onprem_cidr" {
description = "CIDR du reseau on-premise"
type = string
}
variable "onprem_domain" {
description = "Domaine DNS on-premise (ex: monentreprise.local)"
type = string
}
variable "onprem_dns_servers" {
description = "IPs des serveurs DNS on-premise"
type = list(string)
}
variable "project_name" {
description = "Prefixe pour le nommage des ressources"
type = string
default = "hybrid-dns"
}
Outputs utiles
output "inbound_endpoint_ips" {
description = "IPs de l'inbound endpoint (a configurer dans le DNS on-premise)"
value = aws_route53_resolver_endpoint.inbound.ip_address[*].ip
}
output "outbound_endpoint_id" {
description = "ID de l'outbound endpoint"
value = aws_route53_resolver_endpoint.outbound.id
}
Exemple de tfvars
vpc_id = "vpc-0abc123def456789"
private_subnet_ids = ["subnet-aaa111", "subnet-bbb222"]
onprem_cidr = "192.168.0.0/16"
onprem_domain = "monentreprise.local"
onprem_dns_servers = ["192.168.1.10", "192.168.1.11"]
project_name = "prod-hybrid"
Apres terraform apply, notez les IPs de l’inbound endpoint dans l’output. Vous en aurez besoin pour configurer le forwarding cote on-premise.
Configurer le DNS on-premise (BIND / Active Directory)
Avec BIND
Ajoutez une zone de forwarding dans named.conf.local pour router les requetes des zones AWS vers l’inbound endpoint :
zone "vpc.internal" {
type forward;
forward only;
forwarders {
10.0.1.45; # IP inbound endpoint AZ-a
10.0.2.67; # IP inbound endpoint AZ-b
};
};
zone "eu-west-3.compute.internal" {
type forward;
forward only;
forwarders {
10.0.1.45;
10.0.2.67;
};
};
Puis rechargez BIND :
sudo systemctl reload named
Avec Active Directory DNS
Dans la console DNS Manager de Windows Server :
- Clic droit sur « Conditional Forwarders » puis « New Conditional Forwarder »
- Domaine DNS :
vpc.internal - Ajouter les IPs de l’inbound endpoint Route 53
- Cocher « Store this conditional forwarder in Active Directory » si vous avez plusieurs DC
- Repeter pour chaque zone AWS a resoudre
Attention aux zones .local avec Active Directory
Si votre domaine AD utilise .local, assurez-vous que le forwarding conditionnel est bien configure sur tous les DC. Un DC qui ne forward pas vers Route 53 entrainera des echecs de resolution intermittents, difficiles a diagnostiquer.
Tests et validation de la resolution hybride
Depuis une instance EC2 (resolution vers on-premise)
# Test de resolution d'un nom on-premise depuis le VPC
dig erp.monentreprise.local
# Verifier que la reponse vient bien du resolver VPC
dig erp.monentreprise.local +trace
# Test avec nslookup
nslookup ad.monentreprise.local
Depuis un serveur on-premise (resolution vers AWS)
# Test de resolution d'un nom AWS prive depuis on-premise
dig mon-service.vpc.internal @192.168.1.10
# Verifier la latence
dig mon-service.vpc.internal +stats | grep "Query time"
Validation reussie
Si dig retourne une reponse avec status NOERROR et l’IP attendue dans les deux sens, votre DNS hybride est fonctionnel. La latence typique via VPN est de 5 a 30 ms selon la distance geographique.
Erreurs courantes et depannage
⏱ SERVFAIL sur les requetes forwardees
Cause probable : le security group de l’endpoint ne laisse pas passer le port 53 en UDP et TCP, ou le firewall on-premise bloque le retour. Verifiez les deux sens avec tcpdump -i any port 53 sur un serveur intermediaire.
⏱ Resolution intermittente (fonctionne une fois sur deux)
Souvent lie a un seul DNS on-premise configure au lieu de deux, ou un des serveurs DNS cible est injoignable. Route 53 Resolver fait du round-robin entre les targets : si l’un est down, 50% des requetes echouent.
⏱ « Could not create Resolver endpoint » dans Terraform
Verifiez que vos subnets ont assez d’IPs libres (chaque endpoint consomme une ENI par AZ). Si le subnet est presque plein, Terraform echouera sans message clair. Comptez au moins 4 IPs libres par subnet.
⏱ Le forwarding marche dans un sens mais pas l’autre
Asymetrie classique. Verifiez que vous avez bien cree les deux endpoints (inbound ET outbound) et que le DNS on-premise a bien les conditional forwarders configures. Un oubli frequent : creer l’outbound mais oublier de configurer BIND cote datacenter.
Checklist mise en production
✅ Avant de passer en production
Security groups : port 53 TCP+UDP ouvert dans les deux sens
Endpoints deployes dans 2 AZ differentes
Forwarding rules associees au VPC
DNS on-premise : conditional forwarders configures vers l’inbound endpoint
Test
dig reussi dans les deux sens
Au moins 2 serveurs DNS cible on-premise pour la HA
Monitoring : CloudWatch Query Log active sur les endpoints
Documentation a jour : IPs des endpoints, zones forwardees, schemas reseau
Si vous cherchez un accompagnement pour l’infogerance de votre infrastructure hybride, je peux vous aider a mettre en place cette architecture et la maintenir dans la duree.
Combien coute Route 53 Resolver ?
Le pricing de Route 53 Resolver est base sur deux elements :
- Endpoints : environ 0.125 USD/heure par ENI (soit ~90 USD/mois pour un endpoint a 2 ENI)
- Requetes DNS : pas de cout additionnel par requete pour les resolver endpoints
Pour une configuration standard (1 inbound + 1 outbound, 2 ENI chacun), comptez environ 180 USD/mois. C’est un cout fixe, previsible, et independant du volume de requetes. Comparez avec le temps ingenieur perdu a maintenir des fichiers /etc/hosts en dur sur 50 serveurs.
Aller plus loin : multi-VPC et RAM
Si vous avez plusieurs VPC (environnements dev/staging/prod), vous n’avez pas besoin de deployer des endpoints dans chaque VPC. Utilisez AWS Resource Access Manager (RAM) pour partager les forwarding rules :
resource "aws_ram_resource_share" "dns_rules" {
name = "shared-dns-rules"
allow_external_principals = false
}
resource "aws_ram_resource_association" "forward_rule" {
resource_arn = aws_route53_resolver_rule.forward_onprem.arn
resource_share_arn = aws_ram_resource_share.dns_rules.arn
}
resource "aws_ram_principal_association" "other_account" {
principal = var.target_account_id
resource_share_arn = aws_ram_resource_share.dns_rules.arn
}
Les autres VPC/comptes peuvent ensuite associer la regle partagee a leur propre VPC.
FAQ
Besoin d’aide pour mettre en place votre DNS hybride AWS ?
Je configure et maintiens des architectures hybrides cloud/on-premise pour des entreprises qui migrent vers AWS sans tout casser.