Skip to content

Commit 327127c

Browse files
committed
Add support for IAM types
1 parent 9b4d79d commit 327127c

4 files changed

Lines changed: 32 additions & 6 deletions

File tree

_locals.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ locals {
88
for database in role_.databases_ro : {
99
role = role
1010
database = database
11+
is_iam = contains(["CLOUD_IAM_USER", "CLOUD_IAM_GROUP", "CLOUD_IAM_SERVICE_ACCOUNT"], role_.type)
12+
type = role_.type
1113
}
1214
]
1315
])
@@ -16,10 +18,15 @@ locals {
1618
for database in role_.databases_rw : {
1719
role = role
1820
database = database
21+
is_iam = contains(["CLOUD_IAM_USER", "CLOUD_IAM_GROUP", "CLOUD_IAM_SERVICE_ACCOUNT"], role_.type)
22+
type = role_.type
1923
}
2024
]
2125
])
2226

27+
roles_iam = { for role, role_ in var.roles : role => role_ if contains(["CLOUD_IAM_USER", "CLOUD_IAM_GROUP", "CLOUD_IAM_SERVICE_ACCOUNT"], role_.type) }
28+
roles_built_in = { for role, role_ in var.roles : role => role_ if role_.type == "BUILT_IN" }
29+
2330
privileges_ro = [
2431
"SELECT",
2532
]

roles.tf

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
resource "random_password" "role" {
2-
for_each = var.roles
2+
for_each = local.roles_built_in
33

44
length = 48
55
min_lower = 0
@@ -19,7 +19,7 @@ resource "random_password" "role" {
1919

2020
resource "mysql_user" "users" {
2121
for_each = {
22-
for username, user in var.roles : username => user if !user.is_iam_user
22+
for username, user in local.roles_built_in : username => user
2323
}
2424

2525
user = each.key
@@ -32,8 +32,8 @@ resource "mysql_grant" "users_ro" {
3232
for databases_readers in local.databases_readers : "${databases_readers.database}.${databases_readers.role}" => databases_readers
3333
}
3434

35-
user = each.value.role
36-
host = "%"
35+
user = each.value.is_iam ? split("@", each.value.role)[0] : each.value.role
36+
host = each.value.type == "CLOUD_IAM_GROUP" ? split("@", each.value.role)[1] : "%"
3737
database = each.value.database
3838
privileges = local.privileges_ro
3939
table = "*"
@@ -44,8 +44,8 @@ resource "mysql_grant" "users_rw" {
4444
for database_writer in local.databases_writers : "${database_writer.database}.${database_writer.role}" => database_writer
4545
}
4646

47-
user = each.value.role
48-
host = "%"
47+
user = each.value.is_iam ? split("@", each.value.role)[0] : each.value.role
48+
host = each.value.type == "CLOUD_IAM_GROUP" ? split("@", each.value.role)[1] : "%"
4949
database = each.value.database
5050
privileges = local.privileges_rw
5151
table = "*"

users-iam.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
resource "google_sql_user" "iam" {
2+
for_each = local.roles_iam
3+
4+
instance = var.instance_id
5+
name = each.key
6+
type = each.value.type
7+
}

variables.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
1+
variable "instance_id" {
2+
type = string
3+
default = null
4+
}
5+
16
variable "roles" {
27
type = map(object({
38
connection_limit = optional(number)
49
databases_ro = list(string)
510
databases_rw = list(string)
611
is_iam_user = bool
12+
type = optional(string, "BUILT_IN")
713
}))
14+
validation {
15+
condition = alltrue([
16+
for u in var.roles : contains(["BUILT_IN", "CLOUD_IAM_USER", "CLOUD_IAM_GROUP", "CLOUD_IAM_SERVICE_ACCOUNT"], u.type)
17+
])
18+
error_message = "Invalid user type. Only BUILT_IN, CLOUD_IAM_USER, CLOUD_IAM_GROUP, CLOUD_IAM_SERVICE_ACCOUNT are supported."
19+
}
820
}

0 commit comments

Comments
 (0)