Presentamos PostScale -- API de correo para envíos transaccionales, recepción y direcciones enmascaradas. PostScale

    Gestión de DNS con Terraform

    Aprende a gestionar tus zonas y registros DNS como Infraestructura como Código usando el Proveedor Terraform de DNScale.

    Gestionar DNS mediante código aporta los mismos beneficios que la infraestructura como código en cualquier otro lugar: control de versiones, revisión entre pares, despliegues automatizados y entornos reproducibles. El Proveedor Terraform de DNScale te permite gestionar zonas, registros y configuración DNSSEC usando HashiCorp Terraform.

    Requisitos previos

    Antes de comenzar, asegúrate de tener:

    1. Terraform instalado (versión 1.0 o posterior) - Descargar Terraform
    2. Una cuenta de DNScale con una clave API - Obtener tu clave API
    3. Familiaridad básica con conceptos de Terraform (proveedores, recursos, estado)

    Instalación del proveedor

    El proveedor de DNScale está publicado en el Terraform Registry. Agrégalo a tu configuración de Terraform:

    terraform {
      required_providers {
        dnscale = {
          source  = "dnscaleou/dnscale"
          version = "~> 1.0"
        }
      }
    }
     
    provider "dnscale" {
      api_key = var.dnscale_api_key
      # Opcional: api_url por defecto es https://api.dnscale.eu
    }

    Crea un archivo de variables para gestionar tu clave API de forma segura:

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

    Configura la clave API mediante variable de entorno:

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

    Creando tu primera zona

    Una zona DNS representa un dominio que deseas gestionar. Crea una con el recurso 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
    }

    Ejecuta terraform apply para crear la zona. La salida mostrará tus servidores de nombres asignados — actualízalos en tu registrador de dominio para activar el alojamiento DNS.

    Gestión de registros DNS

    Registros A

    Apunta tu dominio a una dirección IPv4:

    resource "dnscale_record" "www" {
      zone_id = dnscale_zone.example.id
      name    = "www"
      type    = "A"
      content = "192.0.2.1"
      ttl     = 3600
    }
     
    # Dominio apex (raíz)
    resource "dnscale_record" "apex" {
      zone_id = dnscale_zone.example.id
      name    = ""
      type    = "A"
      content = "192.0.2.1"
      ttl     = 3600
    }

    Registros AAAA

    Agregar soporte IPv6:

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

    Registros CNAME

    Crear alias para subdominios:

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

    Registros MX

    Configurar la entrega de correo:

    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
    }

    Registros TXT

    Agregar registros SPF, DKIM o de verificación:

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

    Habilitar DNSSEC

    Asegura tu zona con DNSSEC creando claves de 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
    }

    Después de aplicar, obtén el registro DS para configurar en tu registrador:

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

    Uso de Data Sources

    Consulta recursos existentes sin gestionarlos:

    Listar todas las zonas

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

    Listar registros en una zona

    data "dnscale_records" "all" {
      zone_id = dnscale_zone.example.id
    }
     
    # Filtrar para encontrar registros específicos
    output "a_records" {
      value = [for r in data.dnscale_records.all.records : r if r.type == "A"]
    }

    Verificar estado de DNSSEC

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

    Importar recursos existentes

    ¿Ya tienes zonas configuradas en DNScale? Importálas a Terraform:

    # Importar una zona
    terraform import dnscale_zone.existing <zone-id>
     
    # Importar un registro
    terraform import dnscale_record.existing <zone-id>/<record-id>
     
    # Importar una clave DNSSEC
    terraform import dnscale_dnssec_key.existing <zone-id>/<key-id>

    Encuentra los IDs en el panel de DNScale o a través de la API.

    Mejores prácticas

    Usa variables para reutilización

    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
    }

    Organiza con módulos

    Crea módulos reutilizables para patrones comunes:

    # 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 workspaces para entornos

    terraform workspace new staging
    terraform workspace new production
     
    # Cambiar entre entornos
    terraform workspace select staging
    terraform apply -var-file="staging.tfvars"

    Almacena el estado remotamente

    Para colaboración en equipo, usa estado remoto:

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

    Ejemplo completo

    Aquí tienes una configuración completa para un sitio web típico:

    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
    }
     
    # Crear zona
    resource "dnscale_zone" "main" {
      name   = "mywebsite.com"
      region = "eu"
    }
     
    # Registros del sitio 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
    }
     
    # Configuración de correo
    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
    }
     
    # Habilitar 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
    }
     
    # Salidas
    output "nameservers" {
      value = dnscale_zone.main.nameservers
    }
     
    output "ds_record" {
      value = dnscale_dnssec_key.ksk.ds
    }

    Próximos pasos

    Conclusión

    El Proveedor Terraform de DNScale lleva los principios de Infraestructura como Código a la gestión DNS. Versiona tus cambios DNS, automatiza despliegues entre entornos y mantén consistencia en toda tu infraestructura. Ya sea que gestiones un solo dominio o cientos, Terraform proporciona las herramientas para hacerlo de manera confiable y a escala.