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:
- Terraform instalado (versión 1.0 o posterior) - Descargar Terraform
- Una cuenta de DNScale con una clave API - Obtener tu clave API
- 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 initCreando 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
- Consulta la documentación del proveedor para la referencia completa de la API
- Aprende sobre los Tipos de registros DNS soportados por DNScale
- Comprende las Zonas DNS y cómo funcionan
- Explora los Métodos de importación de zonas para migrar DNS existente
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.