@@ -143,6 +143,60 @@ locals {
143143 " service.beta.kubernetes.io/aws-load-balancer-ssl-ports" = " 443"
144144 } : {}
145145 )
146+
147+ # ACK ACM Certificate CRD resources — creates ACM certificates via ACK controller
148+ # and exports them to K8s TLS secrets for Gateway listener consumption.
149+ ack_acm_resources = local. use_ack_acm ? {
150+ for domain_key , domain in local . acm_cert_domains :
151+ " ack-acm-cert-${domain_key}" => {
152+ apiVersion = " acm.services.k8s.aws/v1alpha1"
153+ kind = " Certificate"
154+ metadata = {
155+ name = " ${ local . name } -acm-cert-${ domain_key } "
156+ namespace = var.environment.namespace
157+ }
158+ spec = {
159+ domainName = " *.${ domain . domain } "
160+ subjectAlternativeNames = [
161+ domain.domain,
162+ " *.${ domain . domain } "
163+ ]
164+ validationMethod = " DNS"
165+ options = {
166+ certificateTransparencyLoggingPreference = " ENABLED"
167+ }
168+ exportTo = {
169+ namespace = var.environment.namespace
170+ name = local.acm_cert_secret_names[domain_key]
171+ key = " tls.crt"
172+ }
173+ }
174+ }
175+ } : {}
176+
177+ # DNS-01 wildcard certificate resources for cert-manager
178+ dns01_certificate_resources = {
179+ for domain_key , domain in local . all_dns01_domains :
180+ " dns01-cert-${domain_key}" => {
181+ apiVersion = " cert-manager.io/v1"
182+ kind = " Certificate"
183+ metadata = {
184+ name = " ${ local . name } -dns01-cert-${ domain_key } "
185+ namespace = var.environment.namespace
186+ }
187+ spec = {
188+ secretName = local.dns01_cert_secret_names[domain_key]
189+ issuerRef = {
190+ name = local.dns01_cluster_issuer
191+ kind = " ClusterIssuer"
192+ }
193+ dnsNames = [
194+ domain.domain,
195+ " *.${ domain . domain } "
196+ ]
197+ }
198+ }
199+ }
146200}
147201
148202# Call the base utility module
@@ -168,44 +222,8 @@ module "nginx_gateway_fabric" {
168222 }]
169223 }
170224 }
171- }
172-
173- # ACK ACM Certificate CRD resources — creates ACM certificates via ACK controller
174- # and exports them to K8s TLS secrets for Gateway listener consumption.
175- # Only created when ACK controller is available and domains have ACM ARNs.
176- # When ACK is not available, ACM certs are attached directly to the NLB instead.
177- module "ack_acm_certificate" {
178- for_each = local. use_ack_acm ? local. acm_cert_domains : {}
179-
180- source = " github.com/Facets-cloud/facets-utility-modules//any-k8s-resource"
181- name = " ${ local . name } -acm-cert-${ each . key } "
182- namespace = var. environment . namespace
183- advanced_config = {}
184225
185- data = {
186- apiVersion = " acm.services.k8s.aws/v1alpha1"
187- kind = " Certificate"
188- metadata = {
189- name = " ${ local . name } -acm-cert-${ each . key } "
190- namespace = var.environment.namespace
191- }
192- spec = {
193- domainName = " *.${ each . value . domain } "
194- subjectAlternativeNames = [
195- each.value.domain,
196- " *.${ each . value . domain } "
197- ]
198- validationMethod = " DNS"
199- options = {
200- certificateTransparencyLoggingPreference = " ENABLED"
201- }
202- exportTo = {
203- namespace = var.environment.namespace
204- name = local.acm_cert_secret_names[each.key]
205- key = " tls.crt"
206- }
207- }
208- }
226+ additional_base_resources = merge (local. ack_acm_resources , local. dns01_certificate_resources )
209227}
210228
211229# Pre-create empty TLS secrets for ACK ACM certificate export
@@ -231,39 +249,6 @@ resource "kubernetes_secret_v1" "acm_cert" {
231249 }
232250}
233251
234- # --- DNS-01 wildcard certificate resources ---
235- # cert-manager Certificate CRDs for DNS-01 wildcard domains.
236- # Issues wildcard certs (*.domain + domain) via the dns01 ClusterIssuer (e.g. gts-production).
237- # Only created when use_dns01 is enabled, for domains without existing certificate_reference.
238- module "dns01_certificate" {
239- for_each = local. all_dns01_domains
240-
241- source = " github.com/Facets-cloud/facets-utility-modules//any-k8s-resource"
242- name = " ${ local . name } -dns01-cert-${ each . key } "
243- namespace = var. environment . namespace
244- advanced_config = {}
245-
246- data = {
247- apiVersion = " cert-manager.io/v1"
248- kind = " Certificate"
249- metadata = {
250- name = " ${ local . name } -dns01-cert-${ each . key } "
251- namespace = var.environment.namespace
252- }
253- spec = {
254- secretName = local.dns01_cert_secret_names[each.key]
255- issuerRef = {
256- name = local.dns01_cluster_issuer
257- kind = " ClusterIssuer"
258- }
259- dnsNames = [
260- each.value.domain,
261- " *.${ each . value . domain } "
262- ]
263- }
264- }
265- }
266-
267252# Bootstrap TLS secrets for DNS-01 domains — Gateway 443 listeners need a TLS secret
268253# to start. cert-manager will overwrite these once the DNS-01 challenge succeeds.
269254resource "tls_private_key" "dns01_bootstrap" {
0 commit comments