Skip to content

Commit a78a7bd

Browse files
authored
Merge pull request #13 from Pararius/enableIAM
2 parents 0a46643 + f568fcb commit a78a7bd

File tree

5 files changed

+55
-15
lines changed

5 files changed

+55
-15
lines changed

.github/workflows/ci.yaml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@ jobs:
88
check-formatting:
99
runs-on: ubuntu-latest
1010
steps:
11-
- uses: actions/checkout@v2
11+
- uses: hashicorp/setup-terraform@v3
12+
13+
- uses: actions/checkout@v5
1214

1315
- name: Check formatting
1416
run: terraform fmt -check
1517

1618
validate-module:
1719
runs-on: ubuntu-latest
1820
steps:
19-
- uses: actions/checkout@v2
21+
- uses: hashicorp/setup-terraform@v3
22+
23+
- uses: actions/checkout@v5
2024

2125
- name: Run terraform init
2226
run: terraform init

locals.tf

Lines changed: 9 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,17 +18,24 @@ 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
for database in local.databases : [
2327
for writer in var.legacy_writers : {
2428
role = writer
2529
database = database
30+
is_iam = false
31+
type = "BUILT_IN"
2632
}
2733
]
2834
]))
2935

36+
roles_iam = { for role, role_ in var.roles : role => role_ if contains(["CLOUD_IAM_USER", "CLOUD_IAM_GROUP", "CLOUD_IAM_SERVICE_ACCOUNT"], role_.type) }
37+
roles_built_in = { for role, role_ in var.roles : role => role_ if role_.type == "BUILT_IN" }
38+
3039
privileges_ro = [
3140
"SELECT",
3241
]

roles.tf

Lines changed: 20 additions & 13 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
@@ -18,7 +18,7 @@ resource "random_password" "role" {
1818
}
1919

2020
resource "postgresql_role" "role" {
21-
for_each = var.roles
21+
for_each = local.roles_built_in
2222

2323
name = each.key
2424
superuser = false
@@ -75,6 +75,15 @@ resource "postgresql_role" "role_ro" {
7575
statement_timeout = 0
7676
}
7777

78+
resource "postgresql_grant_role" "role_ro" {
79+
for_each = {
80+
for role in local.databases_readers : "${role.database}__${role.role}" => role if role.is_iam
81+
}
82+
83+
role = each.value.role
84+
grant_role = "${each.value.database}_role_ro"
85+
}
86+
7887
resource "postgresql_default_privileges" "role_ro_table" {
7988
for_each = {
8089
for database_writer in local.databases_writers : "${database_writer.database}.${database_writer.role}" => database_writer
@@ -158,6 +167,15 @@ resource "postgresql_role" "role_rw" {
158167
statement_timeout = 0
159168
}
160169

170+
resource "postgresql_grant_role" "role_rw" {
171+
for_each = {
172+
for role in local.databases_writers : "${role.database}__${role.role}" => role if role.is_iam
173+
}
174+
175+
role = each.value.role
176+
grant_role = "${each.value.database}_role_rw"
177+
}
178+
161179
resource "postgresql_default_privileges" "role_rw_table" {
162180
for_each = {
163181
for database_writer in local.databases_writers : "${database_writer.database}.${database_writer.role}" => database_writer
@@ -218,14 +236,3 @@ resource "postgresql_grant" "role_rw_schema" {
218236
privileges = ["CREATE", "USAGE"]
219237
with_grant_option = false
220238
}
221-
222-
223-
moved {
224-
from = postgresql_default_privileges.role_ro
225-
to = postgresql_default_privileges.role_ro_table
226-
}
227-
228-
moved {
229-
from = postgresql_default_privileges.role_rw
230-
to = postgresql_default_privileges.role_rw_table
231-
}

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: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,23 @@ variable "legacy_writers" {
33
default = []
44
}
55

6+
variable "instance_id" {
7+
type = string
8+
default = null
9+
}
10+
611
variable "roles" {
712
type = map(object({
813
connection_limit = optional(number)
914
databases_ro = list(string)
1015
databases_rw = list(string)
16+
type = optional(string, "BUILT_IN")
1117
}))
18+
19+
validation {
20+
condition = alltrue([
21+
for u in var.roles : contains(["BUILT_IN", "CLOUD_IAM_USER", "CLOUD_IAM_GROUP", "CLOUD_IAM_SERVICE_ACCOUNT"], u.type)
22+
])
23+
error_message = "Invalid user type. Only BUILT_IN, CLOUD_IAM_USER, CLOUD_IAM_GROUP, CLOUD_IAM_SERVICE_ACCOUNT are supported."
24+
}
1225
}

0 commit comments

Comments
 (0)