Maak kennis met PostScale -- e-mail-API voor transactionele, inkomende en gemaskeerde adressen. PostScale

    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:

    1. Terraform geinstalleerd (versie 1.0 of hoger) - Terraform downloaden
    2. Een DNScale-account met een API-sleutel - Haal je API-sleutel op
    3. 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 init

    Je 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

    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.