Découvrez PostScale -- API e-mail pour l'envoi transactionnel, la réception et les adresses masquées. PostScale

    Gerer le DNS avec Terraform

    Apprenez a gerer vos zones et enregistrements DNS en tant qu'Infrastructure as Code avec le provider Terraform DNScale.

    Gerer le DNS par le code apporte les memes avantages que l'infrastructure as code partout ailleurs : controle de version, revue par les pairs, deploiements automatises et environnements reproductibles. Le provider Terraform DNScale vous permet de gerer les zones, les enregistrements et la configuration DNSSEC avec HashiCorp Terraform.

    Prerequis

    Avant de commencer, assurez-vous de disposer de :

    1. Terraform installe (version 1.0 ou ulterieure) - Telecharger Terraform
    2. Un compte DNScale avec une cle API - Obtenir votre cle API
    3. Une familiarite de base avec les concepts Terraform (providers, ressources, state)

    Installation du provider

    Le provider DNScale est publie sur le Terraform Registry. Ajoutez-le a votre configuration Terraform :

    terraform {
      required_providers {
        dnscale = {
          source  = "dnscaleou/dnscale"
          version = "~> 1.0"
        }
      }
    }
     
    provider "dnscale" {
      api_key = var.dnscale_api_key
      # Optionnel : api_url par defaut https://api.dnscale.eu
    }

    Creez un fichier de variables pour gerer votre cle API de maniere securisee :

    # variables.tf
    variable "dnscale_api_key" {
      description = "DNScale API key"
      type        = string
      sensitive   = true
    }

    Definissez la cle API via une variable d'environnement :

    export TF_VAR_dnscale_api_key="your-api-key-here"
    terraform init

    Creer votre premiere zone

    Une zone DNS represente un domaine que vous souhaitez gerer. Creez-en une avec la ressource dnscale_zone :

    resource "dnscale_zone" "example" {
      name   = "example.com"
      region = "eu"
    }
     
    output "zone_id" {
      value = dnscale_zone.example.id
    }
     
    output "nameservers" {
      value = dnscale_zone.example.nameservers
    }

    Executez terraform apply pour creer la zone. La sortie affichera vos serveurs de noms attribues — mettez-les a jour chez votre registraire de domaine pour activer l'hebergement DNS.

    Gerer les enregistrements DNS

    Enregistrements A

    Pointer votre domaine vers une adresse IPv4 :

    resource "dnscale_record" "www" {
      zone_id = dnscale_zone.example.id
      name    = "www"
      type    = "A"
      content = "192.0.2.1"
      ttl     = 3600
    }
     
    # Domaine apex (racine)
    resource "dnscale_record" "apex" {
      zone_id = dnscale_zone.example.id
      name    = ""
      type    = "A"
      content = "192.0.2.1"
      ttl     = 3600
    }

    Enregistrements AAAA

    Ajouter le support IPv6 :

    resource "dnscale_record" "www_ipv6" {
      zone_id = dnscale_zone.example.id
      name    = "www"
      type    = "AAAA"
      content = "2001:db8::1"
      ttl     = 3600
    }

    Enregistrements CNAME

    Creer des alias pour les sous-domaines :

    resource "dnscale_record" "blog" {
      zone_id = dnscale_zone.example.id
      name    = "blog"
      type    = "CNAME"
      content = "example.github.io."
      ttl     = 3600
    }

    Enregistrements MX

    Configurer la distribution du courrier :

    resource "dnscale_record" "mx_primary" {
      zone_id  = dnscale_zone.example.id
      name     = ""
      type     = "MX"
      content  = "mail.example.com."
      ttl      = 3600
      priority = 10
    }
     
    resource "dnscale_record" "mx_backup" {
      zone_id  = dnscale_zone.example.id
      name     = ""
      type     = "MX"
      content  = "mail2.example.com."
      ttl      = 3600
      priority = 20
    }

    Enregistrements TXT

    Ajouter des enregistrements SPF, DKIM ou de verification :

    # Enregistrement SPF
    resource "dnscale_record" "spf" {
      zone_id = dnscale_zone.example.id
      name    = ""
      type    = "TXT"
      content = "v=spf1 include:_spf.google.com ~all"
      ttl     = 3600
    }
     
    # Verification de domaine
    resource "dnscale_record" "verification" {
      zone_id = dnscale_zone.example.id
      name    = ""
      type    = "TXT"
      content = "google-site-verification=abc123..."
      ttl     = 3600
    }

    Activer DNSSEC

    Securisez votre zone avec DNSSEC en creant des cles de signature :

    # Cle de signature de cle (KSK)
    resource "dnscale_dnssec_key" "ksk" {
      zone_id   = dnscale_zone.example.id
      key_type  = "ksk"
      algorithm = 13
      bits      = 256
      active    = true
      published = true
    }
     
    # Cle de signature de zone (ZSK)
    resource "dnscale_dnssec_key" "zsk" {
      zone_id   = dnscale_zone.example.id
      key_type  = "zsk"
      algorithm = 13
      bits      = 256
      active    = true
      published = true
    }

    Apres l'application, recuperez l'enregistrement DS a configurer chez votre registraire :

    output "ds_record" {
      value = dnscale_dnssec_key.ksk.ds
    }

    Utiliser les sources de donnees

    Interroger les ressources existantes sans les gerer :

    Lister toutes les zones

    data "dnscale_zones" "all" {}
     
    output "all_zones" {
      value = data.dnscale_zones.all.zones
    }

    Lister les enregistrements d'une zone

    data "dnscale_records" "all" {
      zone_id = dnscale_zone.example.id
    }
     
    # Filtrer pour trouver des enregistrements specifiques
    output "a_records" {
      value = [for r in data.dnscale_records.all.records : r if r.type == "A"]
    }

    Verifier le statut DNSSEC

    data "dnscale_dnssec_status" "check" {
      zone_id = dnscale_zone.example.id
    }
     
    output "dnssec_enabled" {
      value = data.dnscale_dnssec_status.check.enabled
    }

    Importer des ressources existantes

    Vous avez deja des zones configurees dans DNScale ? Importez-les dans Terraform :

    # Importer une zone
    terraform import dnscale_zone.existing <zone-id>
     
    # Importer un enregistrement
    terraform import dnscale_record.existing <zone-id>/<record-id>
     
    # Importer une cle DNSSEC
    terraform import dnscale_dnssec_key.existing <zone-id>/<key-id>

    Trouvez les identifiants dans le tableau de bord DNScale ou via l'API.

    Bonnes pratiques

    Utilisez des variables pour la reutilisabilite

    variable "domain" {
      description = "Domain name to manage"
      type        = string
    }
     
    variable "web_servers" {
      description = "List of web server IPs"
      type        = list(string)
    }
     
    resource "dnscale_zone" "main" {
      name   = var.domain
      region = "eu"
    }
     
    resource "dnscale_record" "web" {
      count   = length(var.web_servers)
      zone_id = dnscale_zone.main.id
      name    = "www"
      type    = "A"
      content = var.web_servers[count.index]
      ttl     = 300
    }

    Organisez avec des modules

    Creez des modules reutilisables pour les modeles courants :

    # modules/website-dns/main.tf
    resource "dnscale_zone" "zone" {
      name   = var.domain
      region = var.region
    }
     
    resource "dnscale_record" "apex" {
      zone_id = dnscale_zone.zone.id
      name    = ""
      type    = "A"
      content = var.server_ip
      ttl     = var.ttl
    }
     
    resource "dnscale_record" "www" {
      zone_id = dnscale_zone.zone.id
      name    = "www"
      type    = "CNAME"
      content = "${var.domain}."
      ttl     = var.ttl
    }

    Utilisez les workspaces pour les environnements

    terraform workspace new staging
    terraform workspace new production
     
    # Basculer entre les environnements
    terraform workspace select staging
    terraform apply -var-file="staging.tfvars"

    Stockez le state a distance

    Pour la collaboration en equipe, utilisez un state distant :

    terraform {
      backend "s3" {
        bucket = "my-terraform-state"
        key    = "dns/terraform.tfstate"
        region = "eu-west-1"
      }
    }

    Exemple complet

    Voici une configuration complete pour un site web typique :

    terraform {
      required_providers {
        dnscale = {
          source  = "dnscaleou/dnscale"
          version = "~> 1.0"
        }
      }
    }
     
    provider "dnscale" {
      api_key = var.dnscale_api_key
    }
     
    variable "dnscale_api_key" {
      type      = string
      sensitive = true
    }
     
    # Creer la zone
    resource "dnscale_zone" "main" {
      name   = "mywebsite.com"
      region = "eu"
    }
     
    # Enregistrements du site web
    resource "dnscale_record" "apex" {
      zone_id = dnscale_zone.main.id
      name    = ""
      type    = "A"
      content = "203.0.113.50"
      ttl     = 3600
    }
     
    resource "dnscale_record" "www" {
      zone_id = dnscale_zone.main.id
      name    = "www"
      type    = "CNAME"
      content = "mywebsite.com."
      ttl     = 3600
    }
     
    # Configuration de la messagerie
    resource "dnscale_record" "mx" {
      zone_id  = dnscale_zone.main.id
      name     = ""
      type     = "MX"
      content  = "aspmx.l.google.com."
      ttl      = 3600
      priority = 1
    }
     
    resource "dnscale_record" "spf" {
      zone_id = dnscale_zone.main.id
      name    = ""
      type    = "TXT"
      content = "v=spf1 include:_spf.google.com ~all"
      ttl     = 3600
    }
     
    # Activer DNSSEC
    resource "dnscale_dnssec_key" "ksk" {
      zone_id   = dnscale_zone.main.id
      key_type  = "ksk"
      algorithm = 13
      bits      = 256
      active    = true
      published = true
    }
     
    resource "dnscale_dnssec_key" "zsk" {
      zone_id   = dnscale_zone.main.id
      key_type  = "zsk"
      algorithm = 13
      bits      = 256
      active    = true
      published = true
    }
     
    # Sorties
    output "nameservers" {
      value = dnscale_zone.main.nameservers
    }
     
    output "ds_record" {
      value = dnscale_dnssec_key.ksk.ds
    }

    Prochaines etapes

    Conclusion

    Le provider Terraform DNScale apporte les principes d'Infrastructure as Code a la gestion DNS. Versionnez vos changements DNS, automatisez les deploiements entre les environnements et maintenez la coherence a travers votre infrastructure. Que vous geriez un seul domaine ou des centaines, Terraform fournit les outils pour le faire de maniere fiable et a grande echelle.