Gestire il DNS con Terraform
Scopri come gestire le tue zone e i record DNS come Infrastructure as Code usando il provider Terraform di DNScale.
Gestire il DNS tramite codice porta gli stessi vantaggi che si ottengono dall'infrastructure as code ovunque: controllo di versione, peer review, deployment automatizzati e ambienti riproducibili. Il provider Terraform di DNScale ti permette di gestire zone, record e configurazione DNSSEC usando HashiCorp Terraform.
Prerequisiti
Prima di iniziare, assicurati di avere:
- Terraform installato (versione 1.0 o successiva) - Scarica Terraform
- Un account DNScale con una chiave API - Ottieni la tua chiave API
- Familiarità di base con i concetti di Terraform (provider, risorse, state)
Installazione del provider
Il provider DNScale è pubblicato sul Terraform Registry. Aggiungilo alla tua configurazione Terraform:
terraform {
required_providers {
dnscale = {
source = "dnscaleou/dnscale"
version = "~> 1.0"
}
}
}
provider "dnscale" {
api_key = var.dnscale_api_key
# Opzionale: api_url di default è https://api.dnscale.eu
}Crea un file di variabili per gestire la tua chiave API in modo sicuro:
# variables.tf
variable "dnscale_api_key" {
description = "DNScale API key"
type = string
sensitive = true
}Imposta la chiave API tramite variabile d'ambiente:
export TF_VAR_dnscale_api_key="your-api-key-here"
terraform initCreare la tua prima zona
Una zona DNS rappresenta un dominio che vuoi gestire. Creane una con la risorsa 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
}Esegui terraform apply per creare la zona. L'output mostrerà i nameserver assegnati — aggiornali presso il registrar del tuo dominio per attivare l'hosting DNS.
Gestione dei record DNS
Record A
Punta il tuo dominio a un indirizzo IPv4:
resource "dnscale_record" "www" {
zone_id = dnscale_zone.example.id
name = "www"
type = "A"
content = "192.0.2.1"
ttl = 3600
}
# Dominio apex (root)
resource "dnscale_record" "apex" {
zone_id = dnscale_zone.example.id
name = ""
type = "A"
content = "192.0.2.1"
ttl = 3600
}Record AAAA
Aggiungi il supporto IPv6:
resource "dnscale_record" "www_ipv6" {
zone_id = dnscale_zone.example.id
name = "www"
type = "AAAA"
content = "2001:db8::1"
ttl = 3600
}Record CNAME
Crea alias per i sottodomini:
resource "dnscale_record" "blog" {
zone_id = dnscale_zone.example.id
name = "blog"
type = "CNAME"
content = "example.github.io."
ttl = 3600
}Record MX
Configura la consegna delle email:
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
}Record TXT
Aggiungi record SPF, DKIM o di verifica:
# Record SPF
resource "dnscale_record" "spf" {
zone_id = dnscale_zone.example.id
name = ""
type = "TXT"
content = "v=spf1 include:_spf.google.com ~all"
ttl = 3600
}
# Verifica del dominio
resource "dnscale_record" "verification" {
zone_id = dnscale_zone.example.id
name = ""
type = "TXT"
content = "google-site-verification=abc123..."
ttl = 3600
}Abilitare DNSSEC
Proteggi la tua zona con DNSSEC creando le chiavi di firma:
# Key Signing Key (KSK)
resource "dnscale_dnssec_key" "ksk" {
zone_id = dnscale_zone.example.id
key_type = "ksk"
algorithm = 13
bits = 256
active = true
published = true
}
# Zone Signing Key (ZSK)
resource "dnscale_dnssec_key" "zsk" {
zone_id = dnscale_zone.example.id
key_type = "zsk"
algorithm = 13
bits = 256
active = true
published = true
}Dopo l'applicazione, recupera il record DS da configurare presso il tuo registrar:
output "ds_record" {
value = dnscale_dnssec_key.ksk.ds
}Usare le data source
Interroga risorse esistenti senza gestirle:
Elencare tutte le zone
data "dnscale_zones" "all" {}
output "all_zones" {
value = data.dnscale_zones.all.zones
}Elencare i record in una zona
data "dnscale_records" "all" {
zone_id = dnscale_zone.example.id
}
# Filtra per trovare record specifici
output "a_records" {
value = [for r in data.dnscale_records.all.records : r if r.type == "A"]
}Verificare lo stato DNSSEC
data "dnscale_dnssec_status" "check" {
zone_id = dnscale_zone.example.id
}
output "dnssec_enabled" {
value = data.dnscale_dnssec_status.check.enabled
}Importare risorse esistenti
Hai già zone configurate in DNScale? Importale in Terraform:
# Importa una zona
terraform import dnscale_zone.existing <zone-id>
# Importa un record
terraform import dnscale_record.existing <zone-id>/<record-id>
# Importa una chiave DNSSEC
terraform import dnscale_dnssec_key.existing <zone-id>/<key-id>Trova gli ID nella dashboard di DNScale o tramite l'API.
Best practice
Usa variabili per la riutilizzabilità
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
}Organizza con i moduli
Crea moduli riutilizzabili per pattern comuni:
# 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
}Usa i workspace per gli ambienti
terraform workspace new staging
terraform workspace new production
# Passa tra gli ambienti
terraform workspace select staging
terraform apply -var-file="staging.tfvars"Memorizza lo state in remoto
Per la collaborazione del team, usa lo state remoto:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "dns/terraform.tfstate"
region = "eu-west-1"
}
}Esempio completo
Ecco una configurazione completa per un tipico sito web:
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
}
# Crea zona
resource "dnscale_zone" "main" {
name = "mywebsite.com"
region = "eu"
}
# Record del sito 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
}
# Configurazione email
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
}
# Abilita 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
}
# Output
output "nameservers" {
value = dnscale_zone.main.nameservers
}
output "ds_record" {
value = dnscale_dnssec_key.ksk.ds
}Prossimi passi
- Consulta la documentazione del provider per il riferimento completo dell'API
- Scopri i Tipi di record DNS supportati da DNScale
- Comprendi le Zone DNS e come funzionano
- Esplora i Metodi di importazione zone per migrare il DNS esistente
Conclusione
Il provider Terraform di DNScale porta i principi dell'Infrastructure as Code alla gestione DNS. Metti sotto controllo di versione le modifiche DNS, automatizza i deployment tra ambienti e mantieni la coerenza nella tua infrastruttura. Che tu gestisca un singolo dominio o centinaia, Terraform fornisce gli strumenti per farlo in modo affidabile e scalabile.