Skip to content

Commit eccbb9e

Browse files
authored
feat: add possibility to use ACM certificates (#7)
* feat: add possibility to use ACM certificates
1 parent 15f8f71 commit eccbb9e

File tree

6 files changed

+93
-36
lines changed

6 files changed

+93
-36
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
# v0.13.0
4+
5+
- Add possibility to use existing ACM certificates instead of Lets Encrypt
6+
37
# v0.12.0
48

59
- Upgrade EKS node groups to Amazon Linux 2023 (AL2023). \

README.md

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ You can find examples of code that uses this Terraform module in the [examples](
233233

234234
| Name | Description | Type | Default | Required |
235235
|------|-------------|------|---------|:--------:|
236+
| <a name="input_acm_certificate_arn"></a> [acm\_certificate\_arn](#input\_acm\_certificate\_arn) | If set, use AWS NLB TLS termination with this ACM cert ARN | `string` | `null` | no |
236237
| <a name="input_allowed_inbound_cidr_blocks"></a> [allowed\_inbound\_cidr\_blocks](#input\_allowed\_inbound\_cidr\_blocks) | The CIDR blocks from which inbound connections will be accepted. Use 0.0.0.0/0 for allowing all inbound traffic | `map(string)` | n/a | yes |
237238
| <a name="input_create_security_group_rules"></a> [create\_security\_group\_rules](#input\_create\_security\_group\_rules) | If True, add to the specified security group the rules required for allowing connectivity between the provisioned services among all the specified subnets. | `bool` | `false` | no |
238239
| <a name="input_eks_cloudwatch_observability_enabled"></a> [eks\_cloudwatch\_observability\_enabled](#input\_eks\_cloudwatch\_observability\_enabled) | If true, install the CloudWatch Observability add-on.<br/> The add-on installs the CloudWatch agent to send infrastructure metrics from the cluster, <br/> installs Fluent Bit to send container logs, and also enables CloudWatch Application Signals <br/> to send application performance telemetry. | `bool` | `false` | no |
@@ -276,37 +277,37 @@ You can find examples of code that uses this Terraform module in the [examples](
276277
## Resources
277278

278279

279-
- resource.aws_iam_role.ebs_csi (/terraform-docs/main.tf#552)
280-
- resource.aws_iam_role_policy_attachment.ai_models__eks_access (/terraform-docs/main.tf#575)
281-
- resource.aws_iam_role_policy_attachment.backups__eks_access (/terraform-docs/main.tf#583)
282-
- resource.aws_iam_role_policy_attachment.ebs_csi_attach (/terraform-docs/main.tf#565)
283-
- resource.aws_s3_bucket.ai_models (/terraform-docs/main.tf#571)
284-
- resource.aws_s3_bucket.backups (/terraform-docs/main.tf#579)
285-
- resource.aws_secretsmanager_secret.admin_user_password (/terraform-docs/main.tf#402)
286-
- resource.aws_secretsmanager_secret.auth_jwt_key (/terraform-docs/main.tf#385)
287-
- resource.aws_secretsmanager_secret.google_sso_credentials (/terraform-docs/main.tf#529)
288-
- resource.aws_secretsmanager_secret.nebuly_credentials (/terraform-docs/main.tf#493)
289-
- resource.aws_secretsmanager_secret.okta_sso_credentials (/terraform-docs/main.tf#509)
290-
- resource.aws_secretsmanager_secret.openai_api_key (/terraform-docs/main.tf#482)
291-
- resource.aws_secretsmanager_secret.rds_analytics_credentials (/terraform-docs/main.tf#139)
292-
- resource.aws_secretsmanager_secret.rds_auth_credentials (/terraform-docs/main.tf#228)
293-
- resource.aws_secretsmanager_secret_version.admin_user_password (/terraform-docs/main.tf#410)
294-
- resource.aws_secretsmanager_secret_version.auth_jwt_key (/terraform-docs/main.tf#393)
295-
- resource.aws_secretsmanager_secret_version.google_sso_credentials (/terraform-docs/main.tf#538)
296-
- resource.aws_secretsmanager_secret_version.nebuly_credentials (/terraform-docs/main.tf#500)
297-
- resource.aws_secretsmanager_secret_version.okta_sso_credentials (/terraform-docs/main.tf#518)
298-
- resource.aws_secretsmanager_secret_version.openai_api_key (/terraform-docs/main.tf#489)
299-
- resource.aws_secretsmanager_secret_version.rds_analytics_password (/terraform-docs/main.tf#146)
300-
- resource.aws_secretsmanager_secret_version.rds_auth_password (/terraform-docs/main.tf#235)
301-
- resource.aws_security_group.eks_load_balancer (/terraform-docs/main.tf#418)
302-
- resource.aws_security_group_rule.allow_all_inbound_within_vpc (/terraform-docs/main.tf#456)
303-
- resource.aws_security_group_rule.allow_all_outbound_within_vpc (/terraform-docs/main.tf#467)
304-
- resource.aws_vpc_security_group_ingress_rule.eks_load_balancer_allow_http (/terraform-docs/main.tf#445)
305-
- resource.aws_vpc_security_group_ingress_rule.eks_load_balancer_allow_https (/terraform-docs/main.tf#436)
306-
- resource.random_password.admin_user_password (/terraform-docs/main.tf#398)
307-
- resource.random_password.rds_analytics (/terraform-docs/main.tf#134)
308-
- resource.random_password.rds_auth (/terraform-docs/main.tf#223)
280+
- resource.aws_iam_role.ebs_csi (/terraform-docs/main.tf#554)
281+
- resource.aws_iam_role_policy_attachment.ai_models__eks_access (/terraform-docs/main.tf#577)
282+
- resource.aws_iam_role_policy_attachment.backups__eks_access (/terraform-docs/main.tf#585)
283+
- resource.aws_iam_role_policy_attachment.ebs_csi_attach (/terraform-docs/main.tf#567)
284+
- resource.aws_s3_bucket.ai_models (/terraform-docs/main.tf#573)
285+
- resource.aws_s3_bucket.backups (/terraform-docs/main.tf#581)
286+
- resource.aws_secretsmanager_secret.admin_user_password (/terraform-docs/main.tf#404)
287+
- resource.aws_secretsmanager_secret.auth_jwt_key (/terraform-docs/main.tf#387)
288+
- resource.aws_secretsmanager_secret.google_sso_credentials (/terraform-docs/main.tf#531)
289+
- resource.aws_secretsmanager_secret.nebuly_credentials (/terraform-docs/main.tf#495)
290+
- resource.aws_secretsmanager_secret.okta_sso_credentials (/terraform-docs/main.tf#511)
291+
- resource.aws_secretsmanager_secret.openai_api_key (/terraform-docs/main.tf#484)
292+
- resource.aws_secretsmanager_secret.rds_analytics_credentials (/terraform-docs/main.tf#141)
293+
- resource.aws_secretsmanager_secret.rds_auth_credentials (/terraform-docs/main.tf#230)
294+
- resource.aws_secretsmanager_secret_version.admin_user_password (/terraform-docs/main.tf#412)
295+
- resource.aws_secretsmanager_secret_version.auth_jwt_key (/terraform-docs/main.tf#395)
296+
- resource.aws_secretsmanager_secret_version.google_sso_credentials (/terraform-docs/main.tf#540)
297+
- resource.aws_secretsmanager_secret_version.nebuly_credentials (/terraform-docs/main.tf#502)
298+
- resource.aws_secretsmanager_secret_version.okta_sso_credentials (/terraform-docs/main.tf#520)
299+
- resource.aws_secretsmanager_secret_version.openai_api_key (/terraform-docs/main.tf#491)
300+
- resource.aws_secretsmanager_secret_version.rds_analytics_password (/terraform-docs/main.tf#148)
301+
- resource.aws_secretsmanager_secret_version.rds_auth_password (/terraform-docs/main.tf#237)
302+
- resource.aws_security_group.eks_load_balancer (/terraform-docs/main.tf#420)
303+
- resource.aws_security_group_rule.allow_all_inbound_within_vpc (/terraform-docs/main.tf#458)
304+
- resource.aws_security_group_rule.allow_all_outbound_within_vpc (/terraform-docs/main.tf#469)
305+
- resource.aws_vpc_security_group_ingress_rule.eks_load_balancer_allow_http (/terraform-docs/main.tf#447)
306+
- resource.aws_vpc_security_group_ingress_rule.eks_load_balancer_allow_https (/terraform-docs/main.tf#438)
307+
- resource.random_password.admin_user_password (/terraform-docs/main.tf#400)
308+
- resource.random_password.rds_analytics (/terraform-docs/main.tf#136)
309+
- resource.random_password.rds_auth (/terraform-docs/main.tf#225)
309310
- resource.random_string.secrets_suffix (/terraform-docs/main.tf#26)
310-
- resource.tls_private_key.auth_jwt (/terraform-docs/main.tf#381)
311+
- resource.tls_private_key.auth_jwt (/terraform-docs/main.tf#383)
311312
- data source.aws_partition.current (/terraform-docs/main.tf#19)
312313
- data source.aws_subnet.subnets (/terraform-docs/main.tf#20)

main.tf

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ locals {
5959

6060
rds_instance_name_analytics = "${var.resource_prefix}platformanalytics"
6161
rds_instance_name_auth = "${var.resource_prefix}platformauth"
62+
63+
acm_certificate_arn = var.acm_certificate_arn == null ? "" : trimspace(var.acm_certificate_arn)
6264
}
6365

6466

@@ -586,7 +588,6 @@ resource "aws_iam_role_policy_attachment" "backups__eks_access" {
586588
}
587589

588590

589-
590591
# ------ Post provisioning ------ #
591592
locals {
592593
secret_provider_class_name = "nebuly-platform"
@@ -609,9 +610,10 @@ locals {
609610
bootstrap_helm_values = templatefile(
610611
"${path.module}/templates/helm-values-bootstrap.tpl.yaml",
611612
{
612-
eks_region = var.region
613-
eks_cluster_name = local.eks_cluster_name
614-
eks_iam_role_arn = module.eks_iam_role.iam_role_arn
613+
eks_region = var.region
614+
eks_cluster_name = local.eks_cluster_name
615+
eks_iam_role_arn = module.eks_iam_role.iam_role_arn
616+
acm_certificate_arn = local.acm_certificate_arn
615617
}
616618
)
617619
helm_values = templatefile(
@@ -655,6 +657,8 @@ locals {
655657
auth_postgres_server_url = module.rds_postgres_auth.db_instance_address
656658
auth_postgres_db_name = "auth"
657659
eks_iam_role_arn = module.eks_iam_role.iam_role_arn
660+
661+
acm_certificate_arn = local.acm_certificate_arn
658662
},
659663
)
660664
secret_provider_class = templatefile(

templates/helm-values-bootstrap.tpl.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,16 @@ cluster-autoscaler:
88
name: cluster-autoscaler
99
annotations:
1010
eks.amazonaws.com/role-arn: ${eks_iam_role_arn}
11+
%{ if length(trimspace(acm_certificate_arn)) > 0 }
12+
ingress-nginx:
13+
controller:
14+
service:
15+
annotations:
16+
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
17+
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
18+
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "${acm_certificate_arn}"
19+
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
20+
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
21+
targetPorts:
22+
https: http
23+
%{ endif }

templates/helm-values.tpl.yaml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,41 @@ serviceAccount:
1010
annotations:
1111
eks.amazonaws.com/role-arn: ${eks_iam_role_arn}
1212

13+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
1314
# Cert-manager issuer.
1415
# Remove this section if you're not using cert-manager for SSL certificates.
1516
clusterIssuer:
1617
enabled: true
1718
name: letsencrypt
1819
email: support@nebuly.ai
20+
%{ endif }
1921

2022
backend:
2123
image:
2224
repository: "ghcr.io/nebuly-ai/nebuly-backend"
2325
ingress:
2426
annotations:
2527
nginx.ingress.kubernetes.io/rewrite-target: "/$2"
28+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
2629
# ------------
2730
# Cert-manager issuer.
2831
# Remove this section if you're not using cert-manager for SSL certificates.
2932
cert-manager.io/cluster-issuer: letsencrypt
3033
# ------------
34+
%{ endif }
3135
enabled: true
3236
className: "nginx"
3337
hosts:
3438
- host: ${platform_domain}
3539
paths:
3640
- path: /backend(/|$)(.*)
3741
pathType: ImplementationSpecific
42+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
3843
tls:
3944
- secretName: nebuly-tls
4045
hosts:
4146
- ${platform_domain}
47+
%{ endif }
4248

4349
volumeMounts:
4450
- name: secrets-store
@@ -61,22 +67,26 @@ eventIngestion:
6167
ingress:
6268
annotations:
6369
nginx.ingress.kubernetes.io/rewrite-target: "/$2"
70+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
6471
# ------------
6572
# Cert-manager issuer.
6673
# Remove this section if you're not using cert-manager for SSL certificates.
6774
cert-manager.io/cluster-issuer: letsencrypt
6875
# ------------
76+
%{ endif }
6977
enabled: true
7078
className: "nginx"
7179
hosts:
7280
- host: ${platform_domain}
7381
paths:
7482
- path: /event-ingestion(/|$)(.*)
7583
pathType: ImplementationSpecific
84+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
7685
tls:
7786
- secretName: nebuly-tls
7887
hosts:
7988
- ${platform_domain}
89+
%{ endif }
8090

8191
aiModels:
8292
registry: aws_s3
@@ -209,8 +219,8 @@ auth:
209219
microsoft:
210220
enabled: false
211221

212-
# Optional Okta SSO
213222
%{ if okta_sso_enabled }
223+
# Optional Okta SSO
214224
okta:
215225
enabled: ${okta_sso_enabled}
216226
issuer: ${okta_sso_issuer}
@@ -248,22 +258,26 @@ auth:
248258
annotations:
249259
nginx.ingress.kubernetes.io/rewrite-target: "/auth/$2"
250260
nginx.ingress.kubernetes.io/use-regex: "true"
261+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
251262
# ------------
252263
# Cert-manager issuer.
253264
# Remove this section if you're not using cert-manager for SSL certificates.
254265
cert-manager.io/cluster-issuer: letsencrypt
255266
# ------------
267+
%{ endif }
256268
enabled: true
257269
className: "nginx"
258270
hosts:
259271
- host: ${platform_domain}
260272
paths:
261273
- path: "/backend/auth(/|$)(.*)"
262274
pathType: ImplementationSpecific
275+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
263276
tls:
264277
- secretName: nebuly-tls
265278
hosts:
266279
- ${platform_domain}
280+
%{ endif }
267281

268282
frontend:
269283
image:
@@ -275,21 +289,25 @@ frontend:
275289
ingress:
276290
enabled: true
277291
annotations:
292+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
278293
# ------------
279294
# Cert-manager issuer.
280295
# Remove this section if you're not using cert-manager for SSL certificates.
281296
cert-manager.io/cluster-issuer: letsencrypt
282297
# ------------
298+
%{ endif }
283299
className: "nginx"
284300
hosts:
285301
- host: ${platform_domain}
286302
paths:
287303
- path: /
288304
pathType: Prefix
305+
%{ if length(trimspace(acm_certificate_arn)) == 0 }
289306
tls:
290307
- secretName: nebuly-tls
291308
hosts:
292309
- ${platform_domain}
310+
%{ endif }
293311

294312
openAi:
295313
enabled: true

variables.tf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,3 +414,20 @@ variable "eks_enable_prefix_delegation" {
414414
type = bool
415415
default = false
416416
}
417+
418+
### Certificates ###
419+
variable "acm_certificate_arn" {
420+
type = string
421+
default = null
422+
description = "If set, use AWS NLB TLS termination with this ACM cert ARN"
423+
424+
validation {
425+
condition = (
426+
var.acm_certificate_arn == null
427+
|| length(trimspace(var.acm_certificate_arn)) == 0
428+
|| can(regex("^arn:aws:acm:[a-z0-9-]+:\\d{12}:certificate\\/[0-9a-f-]+$", trimspace(var.acm_certificate_arn)))
429+
)
430+
error_message = "acm_certificate_arn must be a valid ACM certificate ARN, e.g. arn:aws:acm:eu-west-1:123456789012:certificate/<uuid>."
431+
}
432+
}
433+

0 commit comments

Comments
 (0)