DNS multi-fournisseurs avec Terraform et DNSControl
Deployez des zones DNS a travers DNScale et Hetzner DNS pour la redondance en utilisant Terraform ou DNSControl.
Faire transiter votre DNS par un seul fournisseur signifie un point de defaillance unique. Si ce fournisseur tombe en panne — qu'il s'agisse d'une panne, d'une attaque DDoS ou d'une mauvaise configuration — vos domaines deviennent inaccessibles. Le DNS multi-fournisseurs elimine ce risque en servant la meme zone depuis deux fournisseurs independants simultanement.
Ce guide explique comment configurer DNScale et Hetzner DNS en tant que fournisseurs doubles en utilisant Terraform ou DNSControl. Les deux outils vous permettent de definir les enregistrements une seule fois et de les envoyer aux deux fournisseurs, gardant tout synchronise sans duplication manuelle.
Pourquoi le DNS multi-fournisseurs
Le DNS est la base de chaque service Internet que vous exploitez. Une panne de fournisseur ne signifie pas seulement que votre site web est inaccessible — cela signifie que les e-mails cessent de circuler, les API deviennent inaccessibles et les services qui dependent d'enregistrements SRV ou TXT cessent de fonctionner.
Le DNS multi-fournisseurs fonctionne en deleguant votre domaine aux serveurs de noms des deux fournisseurs. Les resolveurs du monde entier interrogeront l'ensemble de serveurs de noms qui repond, donc si un fournisseur est en panne, l'autre continue de servir les reponses.
Quand le multi-fournisseurs a-t-il du sens ?
- Domaines de production ou les temps d'arret ont un cout reel
- Environnements de conformite qui exigent de la redondance
- Services mondiaux ou la couverture des fournisseurs varie selon la region
Quand est-ce excessif ? Pour les domaines de developpement, l'outillage interne ou les domaines ou quelques minutes d'indisponibilite sont acceptables, un seul fournisseur avec une bonne disponibilite est generalement suffisant.
Comment ca fonctionne
Le concept est simple :
- Definissez vos enregistrements une fois dans Terraform ou DNSControl
- Envoyez des enregistrements identiques a DNScale et Hetzner DNS
- Configurez les enregistrements NS chez votre registraire pointant vers les serveurs de noms des deux fournisseurs
- Les resolveurs interrogent l'un ou l'autre — celui qui repond en premier gagne
┌──────────────┐
│ Registraire│
│ │
│ NS records: │
│ ns1.dnscale │
│ ns2.dnscale │
│ hydrogen.ns │ ← Hetzner
│ oxygen.ns │ ← Hetzner
└──────┬───────┘
│
▼
┌──────────────┐ ┌──────────────┐
│ DNScale │ │ Hetzner DNS │
│ │ │ │
│ example.com │ │ example.com │
│ A, MX, TXT │ │ A, MX, TXT │
│ (identiques) │ │ (identiques) │
└──────────────┘ └──────────────┘
▲ ▲
│ ┌──────────┐ │
└────│ Resolveur│────┘
└──────────┘
Interroge l'un ou l'autreLes deux fournisseurs detiennent les memes enregistrements. Votre outil IaC est la source unique de verite, et les deux fournisseurs ne sont que des miroirs de cette verite.
Prerequis
Vous aurez besoin de :
- Un compte DNScale avec une cle API — Obtenir votre cle API
- Un compte Hetzner DNS avec un jeton API — Console Hetzner DNS
- Terraform (v1.0+) ou DNSControl (v4.0+) installe
- Un domaine que vous controlez avec acces pour configurer les enregistrements NS chez le registraire
Terraform : Configuration multi-fournisseurs
Terraform rend le DNS multi-fournisseurs propre avec son support natif de plusieurs providers et les boucles for_each. Vous definissez vos enregistrements une fois dans un bloc locals et les creez chez les deux fournisseurs.
Configuration des providers
# providers.tf
terraform {
required_providers {
dnscale = {
source = "dnscaleou/dnscale"
version = "~> 1.0"
}
hetznerdns = {
source = "timohirt/hetznerdns"
version = "~> 2.2"
}
}
}
provider "dnscale" {
api_key = var.dnscale_api_key
}
provider "hetznerdns" {
apitoken = var.hetzner_dns_token
}# variables.tf
variable "dnscale_api_key" {
description = "DNScale API key"
type = string
sensitive = true
}
variable "hetzner_dns_token" {
description = "Hetzner DNS API token"
type = string
sensitive = true
}
variable "domain" {
description = "Domain to manage"
type = string
default = "example.com"
}Definir les enregistrements une fois
La cle du DNS multi-fournisseurs avec Terraform est de definir vos enregistrements en un seul endroit. Utilisez locals pour creer un jeu d'enregistrements partage :
# records.tf
locals {
dns_records = {
# Enregistrements A
"root-a" = {
name = "@"
type = "A"
value = "203.0.113.10"
ttl = 3600
}
"www-a" = {
name = "www"
type = "CNAME"
value = "example.com."
ttl = 3600
}
# Messagerie
"mx-primary" = {
name = "@"
type = "MX"
value = "mail.example.com."
ttl = 3600
priority = 10
}
"mail-a" = {
name = "mail"
type = "A"
value = "203.0.113.20"
ttl = 3600
}
# SPF
"spf" = {
name = "@"
type = "TXT"
value = "v=spf1 mx -all"
ttl = 3600
}
# IPv6
"root-aaaa" = {
name = "@"
type = "AAAA"
value = "2001:db8::1"
ttl = 3600
}
}
}Creer chez les deux fournisseurs
# dnscale.tf
resource "dnscale_zone" "primary" {
name = var.domain
}
resource "dnscale_record" "all" {
for_each = local.dns_records
zone_id = dnscale_zone.primary.id
name = each.value.name
type = each.value.type
content = each.value.value
ttl = each.value.ttl
priority = lookup(each.value, "priority", null)
}# hetzner.tf
resource "hetznerdns_zone" "secondary" {
name = var.domain
ttl = 3600
}
resource "hetznerdns_record" "all" {
for_each = local.dns_records
zone_id = hetznerdns_zone.secondary.id
name = each.value.name
type = each.value.type
value = each.value.value
ttl = each.value.ttl
}Pour les enregistrements MX sur Hetzner DNS, la priorite est generalement incluse dans le champ
value(ex."10 mail.example.com."). Vous devrez peut-etre ajuster le format selon la version du provider. Consultez la documentation du provider Terraform Hetzner DNS pour les details.
Appliquer
export TF_VAR_dnscale_api_key="your-dnscale-key"
export TF_VAR_hetzner_dns_token="your-hetzner-token"
terraform init
terraform plan # Examiner les changements pour les deux fournisseurs
terraform apply # Envoyer aux deux simultanementTerraform cree les ressources chez les deux fournisseurs en parallele, donc un seul apply met tout a jour. Pour une exploration plus approfondie du provider DNScale specifiquement, consultez le guide du provider Terraform.
DNSControl : Configuration multi-fournisseurs
DNSControl dispose d'un support natif multi-fournisseurs integre. Vous pouvez attacher plusieurs providers DNS a un seul domaine, et DNSControl envoie des enregistrements identiques a tous en une seule commande.
Identifiants
// creds.json
{
"dnscale": {
"TYPE": "DNSCALE",
"api_key": "your-dnscale-key"
},
"hetzner": {
"TYPE": "HETZNER",
"api_token": "your-hetzner-token"
}
}Gardez creds.json hors du controle de version :
echo "creds.json" >> .gitignoreConfiguration
La fonction DnsProvider() de DNSControl accepte plusieurs providers pour un seul domaine. Les enregistrements sont automatiquement envoyes a tous les providers attaches :
// dnsconfig.js
var REG_NONE = NewRegistrar("none");
var DSP_DNSCALE = NewDnsProvider("dnscale");
var DSP_HETZNER = NewDnsProvider("hetzner");
D("example.com", REG_NONE,
DnsProvider(DSP_DNSCALE),
DnsProvider(DSP_HETZNER),
// Enregistrements A
A("@", "203.0.113.10", TTL(3600)),
A("mail", "203.0.113.20", TTL(3600)),
// IPv6
AAAA("@", "2001:db8::1", TTL(3600)),
// CNAME
CNAME("www", "example.com.", TTL(3600)),
// Messagerie
MX("@", 10, "mail.example.com.", TTL(3600)),
// SPF
TXT("@", "v=spf1 mx -all", TTL(3600)),
END);C'est tout. Les deux fournisseurs sont listes sur le meme domaine, et DNSControl gere le reste.
Previsualiser et appliquer
# Voir ce qui changerait chez les deux fournisseurs
dnscontrol preview
# Appliquer les changements aux deux fournisseurs
dnscontrol pushLa sortie de preview affiche les changements par fournisseur, vous permettant de verifier que DNScale et Hetzner recevront les bons enregistrements avant d'appliquer.
Pour plus de details sur DNSControl avec DNScale, consultez le guide DNSControl.
Maintenir les enregistrements synchronises
Le plus grand risque avec le DNS multi-fournisseurs est la derive — les enregistrements qui se desynchronisent entre les fournisseurs. Votre outil IaC resout cela en etant la source unique de verite.
L'IaC comme source de verite
Ne modifiez jamais les enregistrements directement dans les tableaux de bord DNScale ou Hetzner. Tous les changements passent par votre configuration Terraform ou DNSControl. Cela garantit que les deux fournisseurs ont toujours des enregistrements identiques.
Pipeline CI/CD
Automatisez les deploiements pour que les enregistrements soient envoyes aux deux fournisseurs a chaque fusion dans main :
# .github/workflows/dns.yml
name: DNS Deploy
on:
push:
branches: [main]
paths: ["dns/**"]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
- name: Apply DNS changes
working-directory: dns/
env:
TF_VAR_dnscale_api_key: ${{ secrets.DNSCALE_API_KEY }}
TF_VAR_hetzner_dns_token: ${{ secrets.HETZNER_DNS_TOKEN }}
run: |
terraform init
terraform apply -auto-approveDetection de derive
Lancez des verifications periodiques pour detecter tout changement manuel ou incoherence d'API :
# Terraform : detecter la derive
terraform plan -detailed-exitcode
# Code de sortie 2 signifie derive detectee
# DNSControl : preview montrera les differences
dnscontrol previewPlanifiez cela en CI (par exemple un cron quotidien) et alertez en cas de differences inattendues.
Delegation NS chez votre registraire
Apres avoir deploye les enregistrements chez les deux fournisseurs, mettez a jour les enregistrements NS chez votre registraire de domaine pour inclure les serveurs de noms de DNScale et Hetzner.
Un jeu NS typique ressemble a :
ns1.dnscale.eu
ns2.dnscale.eu
hydrogen.ns.hetzner.com
oxygen.ns.hetzner.com
helium.ns.hetzner.deLes noms exacts des serveurs de noms DNScale dependent de votre compte. Verifiez les details de votre zone dans le tableau de bord DNScale pour les serveurs de noms attribues.
Configurez tous ces serveurs comme enregistrements NS chez votre registraire. La plupart des registraires vous permettent d'ajouter autant de serveurs de noms que necessaire.
Verifier la delegation
Apres avoir mis a jour les enregistrements NS (prevoyez jusqu'a 48 heures pour la propagation), verifiez avec :
dig NS example.com +shortVous devriez voir les serveurs de noms des deux fournisseurs dans la reponse. Vous pouvez egalement verifier que chaque fournisseur repond correctement :
# Interroger DNScale directement
dig @ns1.dnscale.eu example.com A +short
# Interroger Hetzner directement
dig @hydrogen.ns.hetzner.com example.com A +shortLes deux devraient renvoyer la meme adresse IP.
Limitations et considerations
DNSSEC
Le DNSSEC multi-fournisseurs est complexe. Chaque fournisseur signe la zone avec ses propres cles, donc vous avez besoin soit :
- Que les deux fournisseurs supportent le DNSSEC multi-signataire (RFC 8901) — pas encore largement supporte
- Qu'un fournisseur soit le signataire et transfère les zones signees a l'autre
- D'ignorer DNSSEC sur les zones multi-fournisseurs jusqu'a ce que le support multi-signataire s'ameliore
Pour la plupart des configurations, ignorer DNSSEC sur les zones multi-fournisseurs est le choix pragmatique. Si DNSSEC est une exigence stricte, envisagez d'utiliser un seul fournisseur avec de fortes garanties de disponibilite. Consultez le guide DNSSEC pour la configuration DNSSEC mono-fournisseur.
Alignement des TTL
Gardez des TTL identiques chez les deux fournisseurs. Des TTL differents signifient que les resolveurs mettent en cache les enregistrements pendant des durees differentes selon le fournisseur interroge, entrainant un comportement incoherent.
Delais de propagation
Lorsque vous appliquez des changements, les deux fournisseurs les traitent independamment. Il y a une breve fenetre (generalement quelques secondes, parfois quelques minutes) ou un fournisseur a les nouveaux enregistrements et l'autre sert encore les anciens. Pour la plupart des cas d'utilisation c'est acceptable — evitez simplement de faire des changements qui casseraient s'ils etaient partiellement appliques.
Types d'enregistrements specifiques aux fournisseurs
Restez sur les types d'enregistrements standard que les deux fournisseurs supportent : A, AAAA, CNAME, MX, TXT, SRV, CAA, NS. Les extensions specifiques aux fournisseurs ou les types d'enregistrements proprietaires ne seront pas portables.
Prochaines etapes
- Gerer le DNS avec Terraform — exploration approfondie du provider Terraform DNScale
- Gerer le DNS avec DNSControl — configuration complete de DNSControl
- Configuration DNSSEC — configurer DNSSEC pour les zones mono-fournisseur
- Equilibrage global de la resolution DNS — distribution geographique du trafic a travers les noeuds DNS