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