diff --git a/examples/complete/README.md b/examples/complete/README.md index 76f3e9e..1176670 100644 --- a/examples/complete/README.md +++ b/examples/complete/README.md @@ -44,6 +44,7 @@ Note that this example may create resources which cost money. Run `terraform des | [outbound\_resolver\_endpoints](#module\_outbound\_resolver\_endpoints) | ../../modules/resolver-endpoints | n/a | | [records](#module\_records) | ../../modules/records | n/a | | [records\_with\_full\_names](#module\_records\_with\_full\_names) | ../../modules/records | n/a | +| [records\_without\_zone\_lookup](#module\_records\_without\_zone\_lookup) | ../../modules/records | n/a | | [resolver\_rule\_associations](#module\_resolver\_rule\_associations) | ../../modules/resolver-rule-associations | n/a | | [s3\_bucket](#module\_s3\_bucket) | terraform-aws-modules/s3-bucket/aws | n/a | | [terragrunt](#module\_terragrunt) | ../../modules/records | n/a | diff --git a/examples/complete/main.tf b/examples/complete/main.tf index 5d7fe55..a040b5a 100644 --- a/examples/complete/main.tf +++ b/examples/complete/main.tf @@ -249,6 +249,17 @@ module "records" { depends_on = [module.zones] } +module "records_without_zone_lookup" { + source = "../../modules/records" + + # When skip_zone_lookup is set to true, zone_id and zone_name must be provided + skip_zone_lookup = true + zone_id = module.zones.route53_zone_zone_id["private-vpc.terraform-aws-modules-example2.com"] + zone_name = module.zones.route53_zone_name["private-vpc.terraform-aws-modules-example2.com"] + + # Note that private_zone is not needed here because we are setting skip_zone_lookup to true +} + module "terragrunt" { source = "../../modules/records" diff --git a/modules/records/README.md b/modules/records/README.md index 47d3183..abc5872 100644 --- a/modules/records/README.md +++ b/modules/records/README.md @@ -59,6 +59,7 @@ No modules. | [private\_zone](#input\_private\_zone) | Whether Route53 zone is private or public | `bool` | `false` | no | | [records](#input\_records) | List of objects of DNS records | `any` | `[]` | no | | [records\_jsonencoded](#input\_records\_jsonencoded) | List of map of DNS records (stored as jsonencoded string, for terragrunt) | `string` | `null` | no | +| [skip\_zone\_lookup](#input\_skip\_zone\_lookup) | Whether to skip zone lookup. If set to true, zone\_id and zone\_name must be provided | `bool` | `false` | no | | [zone\_id](#input\_zone\_id) | ID of DNS zone | `string` | `null` | no | | [zone\_name](#input\_zone\_name) | Name of DNS zone | `string` | `null` | no | diff --git a/modules/records/main.tf b/modules/records/main.tf index 0de5992..9dd630f 100644 --- a/modules/records/main.tf +++ b/modules/records/main.tf @@ -5,10 +5,16 @@ locals { # Convert `records` from list to map with unique keys recordsets = { for rs in local.records : try(rs.key, join(" ", compact(["${rs.name} ${rs.type}", try(rs.set_identifier, "")]))) => rs } + + do_lookup = !var.skip_zone_lookup && var.create && (var.zone_id != null || var.zone_name != null) + zone_id = local.do_lookup ? data.aws_route53_zone.this[0].zone_id : var.zone_id + zone_name = local.do_lookup ? data.aws_route53_zone.this[0].name : var.zone_name } data "aws_route53_zone" "this" { - count = var.create && (var.zone_id != null || var.zone_name != null) ? 1 : 0 + # Since terraform does not short circuit, we will use lazy evaluation to avoid: + # > The "count" value depends on resource attributes that cannot be determined until apply + count = var.skip_zone_lookup ? 0 : var.create && (var.zone_id != null || var.zone_name != null) ? 1 : 0 zone_id = var.zone_id name = var.zone_name @@ -16,11 +22,11 @@ data "aws_route53_zone" "this" { } resource "aws_route53_record" "this" { - for_each = { for k, v in local.recordsets : k => v if var.create && (var.zone_id != null || var.zone_name != null) } + for_each = { for k, v in local.recordsets : k => v if var.skip_zone_lookup ? true : var.create && (var.zone_id != null || var.zone_name != null) } - zone_id = data.aws_route53_zone.this[0].zone_id + zone_id = local.zone_id - name = each.value.name != "" ? (lookup(each.value, "full_name_override", false) ? each.value.name : "${each.value.name}.${data.aws_route53_zone.this[0].name}") : data.aws_route53_zone.this[0].name + name = each.value.name != "" ? (lookup(each.value, "full_name_override", false) ? each.value.name : "${each.value.name}.${local.zone_name}") : local.zone_name type = each.value.type ttl = lookup(each.value, "ttl", null) records = try(each.value.records, null) @@ -34,7 +40,7 @@ resource "aws_route53_record" "this" { content { name = each.value.alias.name - zone_id = try(each.value.alias.zone_id, data.aws_route53_zone.this[0].zone_id) + zone_id = try(each.value.alias.zone_id, local.zone_id) evaluate_target_health = lookup(each.value.alias, "evaluate_target_health", false) } } diff --git a/modules/records/variables.tf b/modules/records/variables.tf index d3581be..5535869 100644 --- a/modules/records/variables.tf +++ b/modules/records/variables.tf @@ -4,6 +4,12 @@ variable "create" { default = true } +variable "skip_zone_lookup" { + description = "Whether to skip zone lookup. If set to true, zone_id and zone_name must be provided" + type = bool + default = false +} + variable "zone_id" { description = "ID of DNS zone" type = string