Vi presentiamo PostScale -- API email per invii transazionali, ricezione e indirizzi mascherati. PostScale

    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:

    1. Terraform installato (versione 1.0 o successiva) - Scarica Terraform
    2. Un account DNScale con una chiave API - Ottieni la tua chiave API
    3. 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 init

    Creare 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

    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.