# main.tf # -------------------------------------------------------------------------------------------------- # LOCAL VARIABLES # -------------------------------------------------------------------------------------------------- locals { # Create a map of zones to be created (where zone_id is not specified) zones_to_create = { for k, v in var.zones : k => v if try(v.zone_id, null) == null } # Create a map of zones to be referenced via data source (where zone_id is specified) zones_to_read = { for k, v in var.zones : k => v if try(v.zone_id, null) != null } # Merge the created resources and data sources into a single, unified map. # This allows record sets to reference a zone regardless of whether it was created or read. all_zones = merge( { for k, zone in stackit_dns_zone.this : k => zone }, { for k, zone in data.stackit_dns_zone.this : k => zone } ) # Flatten the nested record_sets structure into a single list, making it easy to iterate with for_each. # Each item in the list retains a reference to its parent zone key. flat_record_sets = flatten([ for zone_key, zone_config in var.zones : [ for record_key, record_config in try(zone_config.record_sets, {}) : { zone_key = zone_key record_key = record_key name = record_config.name type = record_config.type records = record_config.records ttl = try(record_config.ttl, null) comment = try(record_config.comment, null) active = try(record_config.active, null) } ] ]) } # -------------------------------------------------------------------------------------------------- # DNS ZONE RESOURCES (CREATE OR READ) # -------------------------------------------------------------------------------------------------- # Create new DNS zones for configurations that do not have a zone_id resource "stackit_dns_zone" "this" { for_each = local.zones_to_create project_id = var.project_id name = each.value.name dns_name = each.value.dns_name contact_email = try(each.value.contact_email, null) description = try(each.value.description, null) acl = try(each.value.acl, null) active = try(each.value.active, null) default_ttl = try(each.value.default_ttl, null) expire_time = try(each.value.expire_time, null) is_reverse_zone = try(each.value.is_reverse_zone, null) negative_cache = try(each.value.negative_cache, null) primaries = try(each.value.primaries, null) refresh_time = try(each.value.refresh_time, null) retry_time = try(each.value.retry_time, null) type = try(each.value.type, "primary") } # Read existing DNS zones for configurations that provide a zone_id data "stackit_dns_zone" "this" { for_each = local.zones_to_read project_id = var.project_id zone_id = each.value.zone_id } # -------------------------------------------------------------------------------------------------- # DNS RECORD SET RESOURCES # -------------------------------------------------------------------------------------------------- resource "stackit_dns_record_set" "this" { # The key is a unique combination of the zone and record keys for a stable address. for_each = { for record in local.flat_record_sets : "${record.zone_key}.${record.record_key}" => record } project_id = var.project_id # Look up the correct zone_id from the unified 'all_zones' map zone_id = local.all_zones[each.value.zone_key].zone_id name = each.value.name type = each.value.type records = each.value.records ttl = each.value.ttl comment = each.value.comment active = each.value.active }