Cloudflare Terraform : comment je versionne mes zones DNS sans les casser à la main

Pipeline Cloudflare Terraform : versionnement Git → apply Terraform → zones DNS Cloudflare sécurisées

TERRAFORM · CLOUDFLARE · DNS

Si tu gères encore tes entrées DNS Cloudflare une par une dans l’interface web, tu sais à quel point une petite erreur peut vite casser un site, un mail ou une validation SSL. Sur mes infrastructures, je préfère versionner ces changements avec Terraform Cloudflare DNS pour garder un historique clair, relire les modifications avant application et reproduire la même logique d’un environnement à l’autre. Dans cet article, je m’appuie sur un dépôt que j’ai monté pour gérer des zones et des enregistrements de façon déclarative. L’objectif n’est pas de faire compliqué : c’est d’éviter les oublis, les copier-coller risqués et les modifications DNS impossibles à auditer quelques semaines plus tard. Si tu veux un cadre plus large autour de l’exploitation et de la fiabilité de tes serveurs, tu peux aussi regarder mon service de maintenance de serveurs Linux.

Schéma du Cloudflare Terraform provider : de Git au déploiement DNS sécurisé
Pipeline Cloudflare Terraform : versionnement Git → apply Terraform → zones DNS Cloudflare sécurisées

Utiliser Cloudflare Terraform permet de décrire tes enregistrements en code, de relire chaque changement avant application et de réduire les erreurs manuelles sur les zones critiques. La bonne approche repose sur 4 points : un repo Git privé pour héberger le code Terraform, une structure claire des zones, une revue du terraform plan avant chaque apply, et un token API Cloudflare jamais committé en clair (variables d’environnement ou secret vault).

Pourquoi versionner son DNS Cloudflare

Le DNS reste souvent un angle mort opérationnel. Beaucoup d’équipes ont industrialisé leurs serveurs, leurs conteneurs et leurs déploiements, mais continuent à modifier leurs enregistrements DNS directement dans l’interface Cloudflare. Le problème, c’est qu’un simple changement manuel mal relu peut casser un sous-domaine, empêcher la validation d’un certificat ou faire pointer un service vers la mauvaise cible.

Quand j’utilise Terraform Cloudflare DNS, je cherche surtout à obtenir trois bénéfices concrets : un historique Git de chaque modification DNS, une relecture du plan avant application et une structure réutilisable quand plusieurs zones ou plusieurs environnements entrent en jeu. Ce n’est pas du dogme infrastructure as code. C’est juste une manière plus fiable de traiter un composant critique.

Sur le terrain, ce gain est particulièrement visible dès que plusieurs personnes interviennent sur le DNS, ou quand un même domaine comporte des entrées applicatives, mail, validation TLS et sous-domaines de test. Sans garde-fous, les modifications finissent vite dispersées entre mémoire humaine, captures d’écran et tickets. Avec du code, tout devient plus lisible.

💡

Le vrai bénéfice

Stocker son Terraform Cloudflare dans un repo Git privé ne sert pas à faire joli. Ça sert à éviter les changements oraux, les oublis de TTL et les corrections en urgence quand quelqu’un a modifié une zone sans laisser de trace. Chaque commit devient un audit trail de ton DNS.

Ce que montre le dépôt utilisé comme preuve

Le dépôt source que j’utilise ici reste volontairement simple. J’y décris des zones DNS sous forme d’une map Terraform, puis je génère les enregistrements Cloudflare à partir d’une structure déclarative. L’intérêt, c’est de pouvoir ajouter, relire et appliquer plusieurs entrées sans recréer la logique à chaque fois.

La structure générale repose sur trois idées :

🧱

Modèle de données unique

Chaque zone contient une liste d’enregistrements avec type, nom, TTL, cible et proxy.

🔁

Boucle Terraform lisible

Les ressources sont générées automatiquement sans répéter le même bloc pour chaque enregistrement.

🛡️

Changements plus sûrs

Je peux relire un plan avant application et éviter les modifications DNS improvisées.

📚

Documentation implicite

Le dépôt devient la source de vérité sur les sous-domaines réellement gérés.

Dans ce dépôt, j’utilise notamment une variable dns_zones qui décrit chaque zone et ses enregistrements. Ensuite, un flatten permet de transformer cette structure en liste exploitable pour créer les ressources cloudflare_record du Cloudflare Terraform provider. Le résultat est compact, lisible et facile à faire évoluer quand de nouvelles entrées arrivent.

Si tu veux un accompagnement plus large sur la standardisation d’infrastructures, la gestion des changements ou la reprise d’une configuration devenue trop artisanale, mon offre d’infogérance serveur peut justement t’aider à remettre ce genre de sujet à plat.

Comment je structure le Cloudflare Terraform provider

Je préfère garder un modèle très explicite plutôt qu’un Terraform trop “magique”. Quand je reviens sur un dépôt plusieurs semaines plus tard, je veux comprendre en quelques minutes où sont les zones, quels enregistrements sont déclarés et ce qui va réellement être créé.

Voici un exemple simplifié inspiré du dépôt, avec les valeurs sensibles remplacées par des placeholders :

variable "dns_zones" {
  type = map(list(object({
    fieldtype = string
    subdomain = string
    ttl       = number
    target    = string
    proxied   = bool
  })))
}

locals {
  dns_records = flatten([
    for zone, records in var.dns_zones : [
      for idx, record in records : {
        zone_id = data.cloudflare_zone.zones[zone].id
        type    = record.fieldtype
        name    = record.subdomain
        ttl     = record.ttl
        content = record.target
        proxied = record.proxied
        index   = idx
      }
    ]
  ])
}

resource "cloudflare_record" "dns_records" {
  for_each = { for record in local.dns_records : "${record.zone_id}-${record.name}-${record.type}-${record.index}" => record }

  zone_id = each.value.zone_id
  name    = each.value.name
  type    = each.value.type
  ttl     = each.value.ttl
  content = each.value.content
  proxied = each.value.proxied
}

Ce que j’aime dans cette approche, c’est qu’elle garde un bon équilibre entre simplicité et réutilisabilité. Tu peux décrire plusieurs enregistrements A, CNAME ou TXT dans une même structure, tout en gardant un rendu final lisible au moment du plan.

Concrètement, ma séquence de travail ressemble souvent à ça :

terraform init
terraform fmt
terraform validate
terraform plan
terraform apply

Je ne saute jamais la phase plan. Sur du DNS, une mauvaise valeur peut avoir un impact immédiat. Le plan permet de relire les changements avant qu’ils ne deviennent effectifs, surtout quand une zone contient déjà des entrées critiques pour le web, le mail ou des validations externes.

Bonne pratique que j’applique

Je garde des variables propres, je relis systématiquement le plan et j’évite de mélanger des zones de production et des zones de test dans un même changement non relu.

Comment j’organise les enregistrements

Quand une zone grossit, je préfère une structure logique par domaine plutôt qu’un grand fichier désordonné. L’idée n’est pas de multiplier les fichiers pour le plaisir. L’idée est d’aider la relecture. Un changement doit être compréhensible sans devoir recoder mentalement tout le dépôt.

Par exemple, je garde généralement les points suivants :

- une convention de nommage claire pour les sous-domaines
- des TTL cohérents selon l’usage
- des valeurs proxied explicites
- un dépôt dédié ou au moins un dossier dédié au DNS
- une revue avant application sur les zones sensibles

Cette discipline paraît basique, mais elle évite beaucoup d’erreurs. Le DNS n’est pas spectaculaire tant qu’il fonctionne. Dès qu’il casse, en revanche, tout le monde s’en souvient très vite.

Les points de sécurité à garder en tête

Gérer du DNS avec Terraform impose aussi de traiter sérieusement les accès API. Celui qui peut modifier tes zones peut rediriger du trafic, casser des validations ou perturber plusieurs services d’un coup. Il faut donc considérer le provider Cloudflare comme un point sensible de ton infrastructure.

⚠️

Piège classique

Le piège le plus courant consiste à stocker un jeton API trop large dans un mauvais endroit, puis à l’oublier. Mieux vaut limiter les droits, centraliser les secrets et éviter toute valeur sensible dans le dépôt.

Mes garde-fous habituels sont simples :

- utiliser un jeton Cloudflare avec les droits minimum nécessaires
- ne jamais committer de secret dans les fichiers Terraform
- protéger les variables sensibles dans le CI/CD si Terraform est lancé en automatisé
- relire le plan avant application
- séparer les validations de test et les zones réellement critiques

Je fais aussi attention aux valeurs d’exemple. Même dans de la documentation interne ou dans un dépôt public, une adresse IP, une cible DNS ou un identifiant trop précis peuvent devenir des informations inutiles à exposer. Quand je montre des extraits, je préfère les anonymiser sans casser la compréhension.

🔴

Erreur à éviter absolument

Évite de considérer le DNS comme un simple détail d’exploitation. Une mauvaise entrée A, CNAME ou TXT peut casser des services métier, la délivrabilité mail ou un certificat. Ce n’est pas un terrain pour les modifications rapides non relues.

Si tu as besoin d’un avis sur la manière de reprendre un DNS devenu brouillon, ou de sécuriser les changements avant une migration, le plus simple reste souvent de me contacter via cette page de contact.

Cas d’usage où cette approche fait gagner du temps

Je recommande particulièrement cette approche dans quatre situations :

🌐

Plusieurs sous-domaines

Quand un domaine porte à la fois site, API, staging, mail et validations externes.

👥

Équipe technique à plusieurs mains

Quand plusieurs personnes doivent comprendre qui a changé quoi et pourquoi.

🚀

Migrations ou refontes

Quand il faut préparer plusieurs changements DNS sans oublier une entrée critique.

📋

Audit et reprise

Quand le DNS a été modifié au fil du temps sans vraie source de vérité exploitable.

À l’inverse, si tu as un seul domaine vitrine avec très peu de changements, un dépôt Terraform dédié n’est pas forcément prioritaire. L’idée n’est pas de complexifier. L’idée est de fiabiliser quand le contexte le justifie réellement.

Erreurs fréquentes

🌀 Mélanger production et tests dans le même changement

Si tu modifies en même temps des entrées de test et des entrées critiques, la relecture devient floue et le risque grimpe inutilement.

⏱ Oublier la stratégie TTL

Un TTL mal choisi peut ralentir une bascule ou maintenir trop longtemps un mauvais enregistrement dans les caches.

🔐 Utiliser un accès API trop large

Plus les droits sont larges, plus l’impact d’une fuite ou d’une mauvaise manipulation devient important.

🧾 Laisser le dépôt devenir illisible

Si personne ne comprend la structure, tu perds l’un des principaux bénéfices de l’approche déclarative.

Checklist de mise en place

✅ Ma checklist pour un DNS versionné proprement

Définir une structure claire pour dns_zones
Relire systématiquement le résultat de terraform plan
Limiter les droits du jeton Cloudflare au strict nécessaire
Ne jamais exposer de valeur sensible dans les fichiers versionnés
Documenter les conventions de nommage des sous-domaines
Prévoir une validation avant application sur les zones critiques

FAQ

Terraform Cloudflare DNS est-il utile pour une petite infrastructure ?
Oui, à partir du moment où le DNS change régulièrement ou porte plusieurs services. Si tu n’as qu’un domaine très simple, l’intérêt est moindre. Mais dès que le DNS devient un composant critique, le versionner apporte vite de la sérénité.
Peut-on gérer plusieurs zones Cloudflare dans le même projet Terraform ?
Oui, c’est même l’un des intérêts de cette approche. Il faut simplement garder une organisation lisible, éviter les changements confus et bien relire le plan avant application.
Faut-il tout automatiser jusqu’au terraform apply ?
Pas forcément. Sur des zones sensibles, je préfère souvent garder une validation humaine entre le plan et l’application. L’automatisation complète n’est pas une fin en soi si elle augmente le risque.
Quels types d’enregistrements peut-on gérer ainsi ?
Les cas classiques comme A, CNAME et TXT se prêtent très bien à cette approche. L’important n’est pas seulement le type d’enregistrement, mais la qualité de la structure et de la revue avant modification.
Quel est le principal risque si le projet Terraform est mal structuré ?
Le risque principal est de perdre en lisibilité et de recréer des erreurs humaines dans le code. Un projet incompréhensible ne protège pas grand-chose, même s’il utilise Terraform.

Conclusion

Versionner son DNS avec Terraform n’a rien d’un luxe réservé aux grosses équipes. C’est souvent une mesure pragmatique pour mieux relire les changements, garder un historique propre et réduire les manipulations Cloudflare faites dans l’urgence. Sur les environnements où plusieurs services dépendent du DNS, le gain de fiabilité est réel.

Si tu veux reprendre une zone Cloudflare mal documentée, industrialiser proprement tes changements DNS ou sécuriser la gestion de plusieurs domaines, je peux t’aider à remettre tout ça au carré sans transformer le sujet en usine à gaz.

Tu veux fiabiliser la gestion DNS de ton infrastructure ?

Je peux t’aider à versionner les changements, sécuriser les accès Cloudflare et rendre tes zones plus simples à maintenir au quotidien.

Contacte-moi →

Quitter la version mobile