terraform-modules/dns/README.md

9.3 KiB

Terraform STACKIT DNS Zone and Record Set Module

This module allows you to declaratively manage DNS zones and their associated record sets in STACKIT.

It supports:

  • Creating one or more new DNS zones.
  • Using pre-existing DNS zones by providing a zone_id.
  • Creating one or more record sets within any managed zone.

Usage Example

Here is an example of how to use the module to create one or many new zones and use another pre-existing one.

terraform {
  required_providers {
    stackit = {
      source  = "stackitcloud/stackit"
      version = "~> 0.59.0"
    }
  }
  backend "s3" {
    endpoints = {
      s3 = "https://object.storage.eu01.onstackit.cloud"
    }
    bucket                      = "test-bucket"
    key                         = "state/test/dns"
    region                      = "eu01"
    skip_region_validation      = true
    skip_metadata_api_check     = true
    skip_credentials_validation = true
    skip_requesting_account_id  = true
    skip_s3_checksum            = true
    use_path_style              = true
  }
}

provider "stackit" {
  # Configure your provider credentials, i.e.:
  default_region           = local.region
  enable_beta_resources    = true
  service_account_key_path = "sa_key.json"
}

module "dns" {
  source     = "./path/to/your/module" # Or a Git URL git::https://commerce-platform.git.onstackit.cloud/commerce-platform-public//terraform-modules/dns
  project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

  zones = {
    # EXAMPLE 1: Create multiple zones with multiple A records
    "primary_domain" = {
      name     = "first domain"
      dns_name = "test-b.stackit.rocks"
      record_sets = {
        "qa-test" = {
          name    = "qa-test"
          type    = "A"
          ttl     = 3600
          records = ["192.0.1.1", "192.0.1.2"]
        }
        "beta-test" = {
          name    = "beta-test"
          type    = "A"
          ttl     = 3600
          records = ["192.0.2.10", "192.0.2.20", "192.0.2.30"]
        }
      }
    },
    "secondary_domain" = {
      name     = "second domain"
      dns_name = "test-a.stackit.rocks"
      record_sets = {
        "alpha-records" = {
          name    = "alpha-test"
          type    = "A"
          ttl     = 3600
          records = ["192.10.2.10", "192.10.2.20", "192.10.2.30"]
        }
      }
    },

    # EXAMPLE 2: Use a pre-existing zone and add a new TXT and A record to it
    "existing_domain" = {
      zone_id = "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz"
      record_sets = {
        "spf_txt" = {
          name    = "@"
          type    = "TXT"
          records = ["v=spf1 mx -all"]
          ttl     = 7200
          comment = "this is a test txt record"
        },
        "spf_cname" = {
          name    = "exampledomain"
          type    = "A"
          ttl     = 3600
          records = ["192.0.29.1"]
        }
      }
    },

    # EXAMPLE 3: Create a new zone with no initial records
    "empty_domain" = {
      name     = "My Empty Domain"
      dns_name = "empty-example.com"
    }
  }
}

Inputs

Variable Name Description Type Required
project_id STACKIT project ID to which the DNS resources are associated. string Yes
zones A map of DNS zones to be created or managed. Each zone contains a name, dns_name, and record_sets map. map Yes
record_sets A map of DNS record sets to create within this zone. Each record set contains a name, type, records, ttl, comment, and active attribute. map Optional

Values for zones

Key Description Type Required
zone_id The ID of an existing DNS zone to manage. If provided, the module will use the existing zone. If not provided, a new zone will be created. string Optional
name The descriptive name of the DNS zone. string Optional
dns_name The DNS name of the DNS zone. string Optional
contact_email The contact email for the DNS zone. string Optional
description A description of the DNS zone. string Optional
acl The Access Control List (ACL) for the DNS zone. string Optional
active Whether the DNS zone is active or not. bool Optional (currently non-functional)
default_ttl The default Time-to-Live (TTL) for records in the DNS zone. number Optional
expire_time The expiration time for the DNS zone. number Optional
is_reverse_zone Whether the DNS zone is a reverse zone or not. bool Optional
negative_cache The negative cache duration for the DNS zone. number Optional
primaries A list of primary name servers for the DNS zone. list(string) Optional
refresh_time The refresh time for the DNS zone. number Optional
retry_time The retry time for the DNS zone. number Optional
type The type of the DNS zone. Defaults to "primary" if not provided. string Optional

Values for record_sets

Key Description Type Required
name The name of the DNS record set. string Yes
type The type of the DNS record set. string Yes
records A list of DNS records for the record set. list(string) Yes
ttl The Time-to-Live (TTL) for the DNS records in the record set. number Optional
comment A comment for the DNS record set. string Optional
active Whether the DNS record set is active or not. bool Optional (currently non-functional)

Outputs

Name Description
zones A map of all managed DNS zone objects, including those created and those referenced by ID.
record_sets A map of all created DNS record set objects.

Notes

Setting a zone or record to inactive by using active = false is currently not possible due to a bug in the provider. It is active by default.