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 :
- Terraform installe (version 1.0 ou ulterieure) - Telecharger Terraform
- Un compte DNScale avec une cle API - Obtenir votre cle API
- 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 initCreer 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
- Consultez la documentation du provider pour la reference API complete
- Decouvrez les types d'enregistrements DNS pris en charge par DNScale
- Comprenez les zones DNS et leur fonctionnement
- Explorez les methodes d'import de zones pour migrer un DNS existant
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.