diff --git a/README.md b/README.md index 9521572..4552b2e 100644 --- a/README.md +++ b/README.md @@ -13,15 +13,19 @@ Change logs are auto-generated with commitizen. |------|---------| | [terraform](#requirement\_terraform) | >= 1.5 | | [aws](#requirement\_aws) | >= 5.14.0 | +| [kubernetes](#requirement\_kubernetes) | >= 2.23.0 | +| [time](#requirement\_time) | >= 0.9 | ## Providers | Name | Version | |------|---------| -| [aws](#provider\_aws) | 5.68.0 | -| [aws.route53\_main\_east](#provider\_aws.route53\_main\_east) | 5.68.0 | -| [aws.route53\_main\_west](#provider\_aws.route53\_main\_west) | 5.68.0 | -| [aws.self](#provider\_aws.self) | 5.68.0 | +| [aws](#provider\_aws) | 5.70.0 | +| [aws.route53\_main\_east](#provider\_aws.route53\_main\_east) | 5.70.0 | +| [aws.route53\_main\_west](#provider\_aws.route53\_main\_west) | 5.70.0 | +| [aws.self](#provider\_aws.self) | 5.70.0 | +| [kubernetes](#provider\_kubernetes) | 2.32.0 | +| [time](#provider\_time) | 0.12.1 | ## Modules @@ -31,21 +35,27 @@ No modules. | Name | Type | |------|------| +| [aws_route53_record.entry](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource | +| [aws_route53_record.entry_heritage](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource | | [aws_route53_vpc_association_authorization.self_zone_east](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_vpc_association_authorization) | resource | | [aws_route53_vpc_association_authorization.self_zone_west](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_vpc_association_authorization) | resource | | [aws_route53_zone.cluster_domain](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_zone) | resource | | [aws_route53_zone_association.self_zone_east](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_zone_association) | resource | | [aws_route53_zone_association.self_zone_west](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_zone_association) | resource | +| [time_static.timestamp](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 | +| [aws_lb.lb](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/lb) | data source | | [aws_vpc.dummy_vpc](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpc) | data source | | [aws_vpc.eks_vpc](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpc) | data source | +| [kubernetes_service.istio_ingressgateway](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/data-sources/service) | data source | ## Inputs | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| | [cluster\_name](#input\_cluster\_name) | EKS cluster name name component used through out the EKS cluster describing its purpose (ex: dice-dev) | `string` | n/a | yes | +| [istio\_namespace](#input\_istio\_namespace) | The namespace to install the istio components. Defaults to 'istio-system' | `string` | `"istio-system"` | no | | [os\_username](#input\_os\_username) | OS username from environment variable, ideally as $USER | `string` | `null` | no | | [region](#input\_region) | AWS config region | `string` | `""` | no | | [region\_map](#input\_region\_map) | AWS region map | `map(string)` |
{
"east": "us-gov-east-1",
"west": "us-gov-west-1"
}
| no | diff --git a/aws_data.tf b/aws_data.tf index 050df9e..7bfda66 100644 --- a/aws_data.tf +++ b/aws_data.tf @@ -21,3 +21,16 @@ data "aws_vpc" "dummy_vpc" { values = ["vpc0-dummy"] } } + +data "kubernetes_service" "istio_ingressgateway" { + depends_on = [aws_route53_zone.cluster_domain] + metadata { + name = "istio-ingressgateway" + namespace = var.istio_namespace + } +} + +data "aws_lb" "lb" { + depends_on = [aws_route53_zone.cluster_domain] + name = split("-", data.kubernetes_service.istio_ingressgateway.status[0].load_balancer[0].ingress[0].hostname)[0] +} diff --git a/main.tf b/main.tf index 247359c..fb4beda 100644 --- a/main.tf +++ b/main.tf @@ -7,13 +7,42 @@ #------------------------------------------------- locals { + defaults = { + enable_ptr = { + cname = false + a = false + aaaa = false + txt = false + host = true + ptr = true + } + heritage_label = "terraform" + heritage_prefix = { + cname = "_txt" + a = "" + aaaa = "" + txt = "_txt" + host = "" + ptr = "" + } + } + base_heritage_tags = [ + format("heritage=%v", local.defaults.heritage_label), + format("%v/account_id=%v", local.defaults.heritage_label, data.aws_caller_identity.current.account_id), + format("%v/region=%v", local.defaults.heritage_label, local.region), + format("%v/create_time=%d", local.defaults.heritage_label, time_static.timestamp.unix) + ] cluster_domain_description = format("%v EKS Cluster DNS Zone", var.cluster_name) cluster_domain_name = format("%v.%v", var.cluster_name, local.vpc_domain_name) - region = var.region + default_heritage_prefix = lookup(local.defaults.heritage_prefix, local.record_type, "") != "" ? format("%v.", local.defaults.heritage_prefix[local.record_type]) : "" is_shared_vpc = data.aws_vpc.eks_vpc.owner_id != data.aws_caller_identity.current.account_id + record_type = "cname" + region = var.region vpc_domain_name = var.vpc_domain_name } +resource "time_static" "timestamp" {} + #------------------------------------------------- # cluster_domain dns zone #------------------------------------------------- @@ -47,22 +76,21 @@ resource "aws_route53_zone" "cluster_domain" { # east region #--- resource "aws_route53_vpc_association_authorization" "self_zone_east" { - depends_on = [aws_route53_zone.cluster_domain] - count = local.region == "us-gov-east-1" && local.is_shared_vpc ? 1 : 0 + count = local.region == "us-gov-east-1" && local.is_shared_vpc ? 1 : 0 provider = aws.self - zone_id = aws_route53_zone.cluster_domain.zone_id - vpc_region = "us-gov-east-1" vpc_id = data.aws_vpc.eks_vpc.id + vpc_region = "us-gov-east-1" + zone_id = aws_route53_zone.cluster_domain.zone_id } resource "aws_route53_zone_association" "self_zone_east" { - provider = aws.route53_main_east - count = local.region == "us-gov-east-1" && local.is_shared_vpc ? 1 : 0 + count = local.region == "us-gov-east-1" && local.is_shared_vpc ? 1 : 0 - zone_id = aws_route53_zone.cluster_domain.zone_id + provider = aws.route53_main_east vpc_id = data.aws_vpc.eks_vpc.id vpc_region = "us-gov-east-1" + zone_id = aws_route53_zone.cluster_domain.zone_id depends_on = [aws_route53_vpc_association_authorization.self_zone_east] } @@ -71,22 +99,41 @@ resource "aws_route53_zone_association" "self_zone_east" { # west region #------------------------------------------------- resource "aws_route53_vpc_association_authorization" "self_zone_west" { - depends_on = [aws_route53_zone.cluster_domain] - count = local.region == "us-gov-west-1" && local.is_shared_vpc ? 1 : 0 + count = local.region == "us-gov-west-1" && local.is_shared_vpc ? 1 : 0 provider = aws.self - zone_id = aws_route53_zone.cluster_domain.zone_id - vpc_region = "us-gov-west-1" vpc_id = data.aws_vpc.eks_vpc.id + vpc_region = "us-gov-west-1" + zone_id = aws_route53_zone.cluster_domain.zone_id } resource "aws_route53_zone_association" "self_zone_west" { - provider = aws.route53_main_west - count = local.region == "us-gov-west-1" && local.is_shared_vpc ? 1 : 0 + count = local.region == "us-gov-west-1" && local.is_shared_vpc ? 1 : 0 - zone_id = aws_route53_zone.cluster_domain.zone_id + provider = aws.route53_main_west vpc_id = data.aws_vpc.eks_vpc.id vpc_region = "us-gov-west-1" + zone_id = aws_route53_zone.cluster_domain.zone_id depends_on = [aws_route53_vpc_association_authorization.self_zone_west] } + +################################################################### +# Cluster DNS CNAME MAPPED TO INGRESS NLB +################################################################### + +resource "aws_route53_record" "entry" { + name = "*.${local.cluster_domain_name}" + records = [data.aws_lb.lb.dns_name] + ttl = 900 + type = "CNAME" + zone_id = aws_route53_zone.cluster_domain.zone_id +} + +resource "aws_route53_record" "entry_heritage" { + name = format("%v%v", local.default_heritage_prefix, "*.${local.cluster_domain_name}") + records = [join(",", local.base_heritage_tags)] + ttl = 900 + type = "TXT" + zone_id = aws_route53_zone.cluster_domain.zone_id +} diff --git a/requirements.tf b/requirements.tf index 94a08f3..2ce3460 100644 --- a/requirements.tf +++ b/requirements.tf @@ -6,5 +6,13 @@ terraform { source = "hashicorp/aws" version = ">= 5.14.0" } + kubernetes = { + source = "hashicorp/kubernetes" + version = ">= 2.23.0" + } + time = { + source = "hashicorp/time" + version = ">= 0.9" + } } } diff --git a/variables.tf b/variables.tf index 2336ee9..3387100 100644 --- a/variables.tf +++ b/variables.tf @@ -47,6 +47,12 @@ variable "os_username" { # DNS variables ################################################################### +variable "istio_namespace" { + description = "The namespace to install the istio components. Defaults to 'istio-system'" + type = string + default = "istio-system" +} + variable "region_map" { description = "AWS region map" type = map(string)