11locals {
2- secret_name = " ${ var . instance_name } -materialize-backend"
3- mz_resource_id = data. kubernetes_resource . materialize_instance . object . status . resourceId
4- service_account_name = " default "
2+ secret_name = " ${ var . instance_name } -materialize-backend"
3+ mz_resource_id = data. kubernetes_resource . materialize_instance . object . status . resourceId
4+ create_superuser = contains ([ " Password " , " Sasl " ], var . authenticator_kind ) && var . superuser_credentials != null
55
6- # Hash of password - job only recreates when password changes
7- service_account_password_hash = contains ([ " Password " , " Sasl " ], var. authenticator_kind ) ? substr ( sha256 ( random_password. service_account_password [0 ]. result ), 0 , 8 ) : " "
6+ use_provided_password = trimspace ( try (var . superuser_credentials . password , " " )) != " "
7+ superuser_password = local . create_superuser ? (local . use_provided_password ? var. superuser_credentials . password : random_password. superuser_password [0 ]. result ) : " "
88}
99
10- resource "random_password" "service_account_password " {
11- count = contains ([ " Password " , " Sasl " ], var . authenticator_kind ) ? 1 : 0
10+ resource "random_password" "superuser_password " {
11+ count = local . create_superuser ? 1 : 0
1212 length = 16
1313 special = true
1414 override_special = " !#$%&*()-_=+[]{}<>:?"
1515}
1616
17- # Create a job to create the default service account with superuser privileges
18- # https://materialize.com/docs/security/self-managed/access-control/manage-roles/#create-individual-userservice-account-roles
19- resource "kubernetes_job" "create_service_account" {
20- count = contains ([ " Password " , " Sasl " ], var . authenticator_kind ) ? 1 : 0
17+ # Secret to store superuser credentials (avoids exposing password in pod spec)
18+ resource "kubernetes_secret" "superuser_credentials" {
19+ count = local . create_superuser ? 1 : 0
20+
2121 metadata {
22- # Hash in name ensures job only recreates when password changes
23- name = " ${ var . instance_name } -create-role-${ local . service_account_password_hash } "
22+ name = " ${ var . instance_name } -superuser-credentials"
2423 namespace = var. instance_namespace
2524 }
2625
26+ data = {
27+ username = var.superuser_credentials.username
28+ password = local.superuser_password
29+ }
30+
31+ }
32+
33+ # Create a job to create the user with superuser privileges
34+ # https://materialize.com/docs/security/self-managed/access-control/manage-roles/#create-individual-userservice-account-roles
35+ resource "kubernetes_job" "create_superuser" {
36+ count = local. create_superuser ? 1 : 0
37+ metadata {
38+ generate_name = " ${ var . instance_name } -create-superuser-"
39+ namespace = var. instance_namespace
40+ }
41+
2742 spec {
28- # No TTL - job stays so Terraform doesn't see drift and recreate on every apply
29- backoff_limit = 3
43+ ttl_seconds_after_finished = 600
44+ backoff_limit = 3
3045
3146 template {
3247 metadata {
@@ -40,18 +55,18 @@ resource "kubernetes_job" "create_service_account" {
4055
4156 container {
4257 name = " psql"
43- image = " postgres:16 -alpine"
58+ image = " postgres:18 -alpine"
4459
4560 command = [
4661 " sh" , " -c" ,
4762 <<- EOT
48- ROLE_EXISTS=$(PGPASSWORD=$MZ_PASSWORD psql -h $MZ_HOST -p 6875 -U mz_system -d materialize -tAc "SELECT 1 FROM mz_roles WHERE name = '${ local . service_account_name } ';")
63+ ROLE_EXISTS=$(PGPASSWORD=$MZ_PASSWORD psql -h $MZ_HOST -p 6875 -U mz_system -d materialize -tAc "SELECT 1 FROM mz_roles WHERE name = '$SUPERUSER_USERNAME ';")
4964 if [ -z "$ROLE_EXISTS" ]; then
5065 PGPASSWORD=$MZ_PASSWORD psql -h $MZ_HOST -p 6875 -U mz_system -d materialize \
51- -c "CREATE ROLE ${ local . service_account_name } WITH SUPERUSER LOGIN PASSWORD '${ random_password . service_account_password [ 0 ] . result } ';"
66+ -c "CREATE ROLE $SUPERUSER_USERNAME WITH SUPERUSER LOGIN PASSWORD '$SUPERUSER_PASSWORD ';"
5267 else
5368 PGPASSWORD=$MZ_PASSWORD psql -h $MZ_HOST -p 6875 -U mz_system -d materialize \
54- -c "ALTER ROLE ${ local . service_account_name } PASSWORD '${ random_password . service_account_password [ 0 ] . result } ';"
69+ -c "ALTER ROLE $SUPERUSER_USERNAME PASSWORD '$SUPERUSER_PASSWORD ';"
5570 fi
5671 EOT
5772 ]
@@ -70,6 +85,26 @@ resource "kubernetes_job" "create_service_account" {
7085 }
7186 }
7287 }
88+
89+ env {
90+ name = " SUPERUSER_USERNAME"
91+ value_from {
92+ secret_key_ref {
93+ name = kubernetes_secret. superuser_credentials [0 ]. metadata [0 ]. name
94+ key = " username"
95+ }
96+ }
97+ }
98+
99+ env {
100+ name = " SUPERUSER_PASSWORD"
101+ value_from {
102+ secret_key_ref {
103+ name = kubernetes_secret. superuser_credentials [0 ]. metadata [0 ]. name
104+ key = " password"
105+ }
106+ }
107+ }
73108 }
74109 }
75110 }
@@ -79,6 +114,7 @@ resource "kubernetes_job" "create_service_account" {
79114
80115 timeouts {
81116 create = " 5m"
117+ update = " 5m"
82118 }
83119
84120 depends_on = [
0 commit comments