DNS beheren met Terraform
Leer hoe je je DNS-zones en -records als Infrastructure as Code beheert met de DNScale Terraform Provider.
DNS beheren via code biedt dezelfde voordelen als infrastructure as code overal elders: versiebeheer, peer review, geautomatiseerde deployments en reproduceerbare omgevingen. De DNScale Terraform Provider laat je zones, records en DNSSEC-configuratie beheren met HashiCorp Terraform.
Vereisten
Voordat je begint, zorg dat je het volgende hebt:
- Terraform geinstalleerd (versie 1.0 of hoger) - Terraform downloaden
- Een DNScale-account met een API-sleutel - Haal je API-sleutel op
- Basiskennis van Terraform-concepten (providers, resources, state)
Provider-installatie
De DNScale-provider is gepubliceerd op het Terraform Registry. Voeg deze toe aan je Terraform-configuratie:
terraform {
required_providers {
dnscale = {
source = "dnscaleou/dnscale"
version = "~> 1.0"
}
}
}
provider "dnscale" {
api_key = var.dnscale_api_key
# Optioneel: api_url is standaard https://api.dnscale.eu
}Maak een variabelenbestand aan om je API-sleutel veilig te beheren:
# variables.tf
variable "dnscale_api_key" {
description = "DNScale API key"
type = string
sensitive = true
}Stel de API-sleutel in via een omgevingsvariabele:
export TF_VAR_dnscale_api_key="your-api-key-here"
terraform initJe eerste zone aanmaken
Een DNS-zone vertegenwoordigt een domein dat je wilt beheren. Maak er een aan met de dnscale_zone-resource:
resource "dnscale_zone" "example" {
name = "example.com"
region = "eu"
}
output "zone_id" {
value = dnscale_zone.example.id
}
output "nameservers" {
value = dnscale_zone.example.nameservers
}Voer terraform apply uit om de zone aan te maken. De output toont je toegewezen nameservers — werk deze bij je domeinregistrar bij om DNS-hosting te activeren.
DNS-records beheren
A-records
Wijs je domein naar een IPv4-adres:
resource "dnscale_record" "www" {
zone_id = dnscale_zone.example.id
name = "www"
type = "A"
content = "192.0.2.1"
ttl = 3600
}
# Apex-domein (root)
resource "dnscale_record" "apex" {
zone_id = dnscale_zone.example.id
name = ""
type = "A"
content = "192.0.2.1"
ttl = 3600
}AAAA-records
Voeg IPv6-ondersteuning toe:
resource "dnscale_record" "www_ipv6" {
zone_id = dnscale_zone.example.id
name = "www"
type = "AAAA"
content = "2001:db8::1"
ttl = 3600
}CNAME-records
Maak aliassen voor subdomeinen:
resource "dnscale_record" "blog" {
zone_id = dnscale_zone.example.id
name = "blog"
type = "CNAME"
content = "example.github.io."
ttl = 3600
}MX-records
Configureer e-mailbezorging:
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
}TXT-records
Voeg SPF-, DKIM- of verificatierecords toe:
# SPF-record
resource "dnscale_record" "spf" {
zone_id = dnscale_zone.example.id
name = ""
type = "TXT"
content = "v=spf1 include:_spf.google.com ~all"
ttl = 3600
}
# Domeinverificatie
resource "dnscale_record" "verification" {
zone_id = dnscale_zone.example.id
name = ""
type = "TXT"
content = "google-site-verification=abc123..."
ttl = 3600
}DNSSEC inschakelen
Beveilig je zone met DNSSEC door ondertekeningssleutels aan te maken:
# 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
}Haal na het toepassen het DS-record op om bij je registrar te configureren:
output "ds_record" {
value = dnscale_dnssec_key.ksk.ds
}Data sources gebruiken
Bevraag bestaande resources zonder ze te beheren:
Alle zones opvragen
data "dnscale_zones" "all" {}
output "all_zones" {
value = data.dnscale_zones.all.zones
}Records in een zone opvragen
data "dnscale_records" "all" {
zone_id = dnscale_zone.example.id
}
# Filteren om specifieke records te vinden
output "a_records" {
value = [for r in data.dnscale_records.all.records : r if r.type == "A"]
}DNSSEC-status controleren
data "dnscale_dnssec_status" "check" {
zone_id = dnscale_zone.example.id
}
output "dnssec_enabled" {
value = data.dnscale_dnssec_status.check.enabled
}Bestaande resources importeren
Heb je al zones geconfigureerd in DNScale? Importeer ze in Terraform:
# Een zone importeren
terraform import dnscale_zone.existing <zone-id>
# Een record importeren
terraform import dnscale_record.existing <zone-id>/<record-id>
# Een DNSSEC-sleutel importeren
terraform import dnscale_dnssec_key.existing <zone-id>/<key-id>Vind ID's in het DNScale-dashboard of via de API.
Best practices
Gebruik variabelen voor herbruikbaarheid
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
}Organiseer met modules
Maak herbruikbare modules voor veelvoorkomende patronen:
# 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
}Gebruik workspaces voor omgevingen
terraform workspace new staging
terraform workspace new production
# Wisselen tussen omgevingen
terraform workspace select staging
terraform apply -var-file="staging.tfvars"Sla state op afstand op
Voor teamsamenwerking, gebruik remote state:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "dns/terraform.tfstate"
region = "eu-west-1"
}
}Volledig voorbeeld
Hier is een complete configuratie voor een typische website:
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
}
# Zone aanmaken
resource "dnscale_zone" "main" {
name = "mywebsite.com"
region = "eu"
}
# Websiterecords
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
}
# E-mailconfiguratie
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
}
# DNSSEC inschakelen
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
}
# Outputs
output "nameservers" {
value = dnscale_zone.main.nameservers
}
output "ds_record" {
value = dnscale_dnssec_key.ksk.ds
}Volgende stappen
- Bekijk de Providerdocumentatie voor de volledige API-referentie
- Leer over DNS-recordtypen die door DNScale worden ondersteund
- Begrijp DNS-zones en hoe ze werken
- Ontdek Zone-importmethoden om bestaande DNS te migreren
Conclusie
De DNScale Terraform Provider brengt Infrastructure as Code-principes naar DNS-beheer. Beheer je DNS-wijzigingen met versiebeheer, automatiseer deployments over omgevingen en behoud consistentie in je infrastructuur. Of je nu één domein of honderden beheert, Terraform biedt de tools om het betrouwbaar en op schaal te doen.