diff --git a/vpc-interface-endpoint/README.md b/vpc-interface-endpoint/README.md index 6eab3c7..1a1b59c 100644 --- a/vpc-interface-endpoint/README.md +++ b/vpc-interface-endpoint/README.md @@ -67,6 +67,7 @@ These are not included in the module because they don't exist until the resource | Name | Version | |------|---------| | [aws](#provider\_aws) | >= 3.66.0 | +| [null](#provider\_null) | >= 3.0 | | [time](#provider\_time) | n/a | ## Modules @@ -84,9 +85,11 @@ These are not included in the module because they don't exist until the resource | [aws_route53_record.vpce_kms_txt](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource | | [aws_route53_record.vpce_ptr](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource | | [aws_route53_record.vpce_ptr_info](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource | +| [aws_route53_record.vpce_wildcard](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource | | [aws_route53_zone.vpce](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_zone) | resource | | [aws_ssm_parameter.vpce](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssm_parameter) | resource | | [aws_vpc_endpoint.interface_endpoint](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_endpoint) | resource | +| [null_resource.vpce](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource | | [time_static.vpce](https://registry.terraform.io/providers/hashicorp/time/latest/docs/resources/static) | resource | | [aws_arn.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/arn) | data source | | [aws_caller_identity.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source | diff --git a/vpc-interface-endpoint/route53.tf b/vpc-interface-endpoint/route53.tf index 3c2fae5..9e28eb0 100644 --- a/vpc-interface-endpoint/route53.tf +++ b/vpc-interface-endpoint/route53.tf @@ -17,12 +17,16 @@ locals { # ent-gov-network-sa "057445207498", ] - r53_create = contains(local.permitted_accounts, local.account_id) && var.create_central_vpc_endpoint + r53_create = contains(local.permitted_accounts, local.account_id) && var.create_central_vpc_endpoint + endpoint_exists = fileexists(format("%v/setup/.vpce.%v", path.root, data.aws_vpc_endpoint_service.interface_endpoint.service)) + service_domain_parts = split(".", data.aws_vpc_endpoint_service.interface_endpoint.private_dns_name) + is_wildcard = local.service_domain_parts[0] == "*" + domain_name = local.is_wildcard ? join(".", slice(local.service_domain_parts, 1, length(local.service_domain_parts))) : data.aws_vpc_endpoint_service.interface_endpoint.private_dns_name } resource "aws_route53_zone" "vpce" { count = local.r53_create ? 1 : 0 - name = data.aws_vpc_endpoint_service.interface_endpoint.private_dns_name + name = local.domain_name comment = format("VPCE %v %v", data.aws_vpc_endpoint_service.interface_endpoint.service, local.region) force_destroy = false @@ -38,12 +42,28 @@ resource "aws_route53_zone" "vpce" { tags = merge( local.base_tags, var.tags, - { Name = data.aws_vpc_endpoint_service.interface_endpoint.private_dns_name }, + # { Name = data.aws_vpc_endpoint_service.interface_endpoint.private_dns_name }, + { Name = local.domain_name }, ) } +resource "null_resource" "vpce" { + triggers = { + vpce_id = aws_vpc_endpoint.interface_endpoint.id + vpce_interface_ids = join(",", aws_vpc_endpoint.interface_endpoint.network_interface_ids) + } + + provisioner "local-exec" { + command = "test -d ${path.root}/setup || mkdir ${path.root}/setup" + } + provisioner "local-exec" { + command = format("touch %v/setup/.vpce.%v", path.root, data.aws_vpc_endpoint_service.interface_endpoint.service) + } +} + data "aws_network_interface" "vpce" { - for_each = local.r53_create ? toset(aws_vpc_endpoint.interface_endpoint.network_interface_ids) : toset([]) + # for_each = local.r53_create ? toset(aws_vpc_endpoint.interface_endpoint.network_interface_ids) : toset([]) + for_each = local.r53_create && local.endpoint_exists ? toset(split(",", null_resource.vpce.triggers.vpce_interface_ids)) : toset([]) id = each.key } @@ -62,7 +82,7 @@ data "aws_network_interface" "vpce" { ## } resource "aws_route53_record" "vpce" { - count = local.r53_create ? 1 : 0 + count = local.r53_create && local.endpoint_exists ? 1 : 0 zone_id = try(aws_route53_zone.vpce[0].zone_id, null) name = try(aws_route53_zone.vpce[0].name, null) type = "A" @@ -70,6 +90,15 @@ resource "aws_route53_record" "vpce" { records = [for n in data.aws_network_interface.vpce : n.private_ip] } +resource "aws_route53_record" "vpce_wildcard" { + count = local.r53_create && local.endpoint_exists && local.is_wildcard ? 1 : 0 + zone_id = try(aws_route53_zone.vpce[0].zone_id, null) + name = data.aws_vpc_endpoint_service.interface_endpoint.private_dns_name + type = "A" + ttl = "60" + records = [for n in data.aws_network_interface.vpce : n.private_ip] +} + resource "aws_route53_record" "vpce_info_txt" { count = local.r53_create ? 1 : 0 zone_id = try(aws_route53_zone.vpce[0].zone_id, null) @@ -95,13 +124,13 @@ resource "aws_route53_record" "vpce_kms_txt" { } module "vpce_ips" { - count = local.r53_create ? 1 : 0 + count = local.r53_create && local.endpoint_exists ? 1 : 0 source = "git@github.e.it.census.gov:terraform-modules/dns-lookup.git?ref=tf-upgrade" hosts = [for n in data.aws_network_interface.vpce : n.private_ip] } locals { - ptr_zones = local.r53_create ? distinct([for k, v in module.vpce_ips[0].results_ipv4 : v.network_ptr_sorted]) : [] + ptr_zones = local.r53_create && local.endpoint_exists ? distinct([for k, v in module.vpce_ips[0].results_ipv4 : v.network_ptr_sorted]) : [] } data "aws_route53_zone" "vpce_ptr" { @@ -111,7 +140,7 @@ data "aws_route53_zone" "vpce_ptr" { } resource "aws_route53_record" "vpce_ptr" { - for_each = local.r53_create ? module.vpce_ips[0].results_ipv4 : {} + for_each = local.r53_create && local.endpoint_exists ? module.vpce_ips[0].results_ipv4 : {} zone_id = data.aws_route53_zone.vpce_ptr[each.value.network_ptr_sorted].zone_id name = each.value.ptr_sorted type = "PTR" @@ -119,7 +148,7 @@ resource "aws_route53_record" "vpce_ptr" { records = [aws_vpc_endpoint.interface_endpoint.dns_entry[0].dns_name] } resource "aws_route53_record" "vpce_ptr_info" { - for_each = local.r53_create ? module.vpce_ips[0].results_ipv4 : {} + for_each = local.r53_create && local.endpoint_exists ? module.vpce_ips[0].results_ipv4 : {} zone_id = data.aws_route53_zone.vpce_ptr[each.value.network_ptr_sorted].zone_id name = each.value.ptr_sorted type = "TXT" @@ -136,7 +165,7 @@ resource "aws_ssm_parameter" "vpce" { value = jsonencode({ name = data.aws_vpc_endpoint_service.interface_endpoint.service region = local.region - dns_name = data.aws_vpc_endpoint_service.interface_endpoint.private_dns_name + dns_name = local.domain_name id = aws_vpc_endpoint.interface_endpoint.id zone = try(aws_route53_zone.vpce[0].name, null) zone_id = try(aws_route53_zone.vpce[0].zone_id, null)