|
15 | 15 | */ |
16 | 16 |
|
17 | 17 | locals { |
18 | | - account_billing = var.grant_billing_role && var.billing_account_id != "" |
19 | | - org_billing = var.grant_billing_role && var.billing_account_id == "" && var.org_id != "" |
20 | | - prefix = var.prefix != "" ? "${var.prefix}-" : "" |
21 | | - xpn = var.grant_xpn_roles && var.org_id != "" |
22 | | - emails = [for account in google_service_account.service_accounts : account.email] |
23 | | - iam_emails = [for email in local.emails : "serviceAccount:${email}"] |
| 18 | + account_billing = var.grant_billing_role && var.billing_account_id != "" |
| 19 | + org_billing = var.grant_billing_role && var.billing_account_id == "" && var.org_id != "" |
| 20 | + prefix = var.prefix != "" ? "${var.prefix}-" : "" |
| 21 | + xpn = var.grant_xpn_roles && var.org_id != "" |
| 22 | + service_accounts_list = [for name in var.names : google_service_account.service_accounts[name]] |
| 23 | + emails_list = [for account in local.service_accounts_list : account.email] |
| 24 | + iam_emails_list = [for email in local.emails_list : "serviceAccount:${email}"] |
| 25 | + names = toset(var.names) |
| 26 | + name_role_pairs = setproduct(local.names, toset(var.project_roles)) |
| 27 | + project_roles_map_data = zipmap( |
| 28 | + [for pair in local.name_role_pairs : "${pair[0]}-${pair[1]}"], |
| 29 | + [for pair in local.name_role_pairs : { |
| 30 | + name = pair[0] |
| 31 | + role = pair[1] |
| 32 | + }] |
| 33 | + ) |
24 | 34 | } |
25 | 35 |
|
26 | 36 | # create service accounts |
27 | 37 | resource "google_service_account" "service_accounts" { |
28 | | - count = length(var.names) |
29 | | - account_id = "${local.prefix}${lower(element(var.names, count.index))}" |
| 38 | + for_each = local.names |
| 39 | + account_id = "${local.prefix}${lower(each.value)}" |
30 | 40 | display_name = "Terraform-managed service account" |
31 | 41 | project = var.project_id |
32 | 42 | } |
33 | 43 |
|
34 | 44 | # common roles |
35 | 45 | resource "google_project_iam_member" "project-roles" { |
36 | | - count = length(var.project_roles) * length(var.names) |
| 46 | + for_each = local.project_roles_map_data |
37 | 47 |
|
38 | 48 | project = element( |
39 | 49 | split( |
40 | 50 | "=>", |
41 | | - element(var.project_roles, count.index % length(var.project_roles)), |
| 51 | + each.value.role |
42 | 52 | ), |
43 | 53 | 0, |
44 | 54 | ) |
45 | 55 |
|
46 | 56 | role = element( |
47 | 57 | split( |
48 | 58 | "=>", |
49 | | - element(var.project_roles, count.index % length(var.project_roles)), |
| 59 | + each.value.role |
50 | 60 | ), |
51 | 61 | 1, |
52 | 62 | ) |
53 | 63 |
|
54 | | - member = "serviceAccount:${element( |
55 | | - google_service_account.service_accounts.*.email, |
56 | | - floor(count.index / length(var.project_roles)), |
57 | | - )}" |
| 64 | + member = "serviceAccount:${google_service_account.service_accounts[each.value.name].email}" |
58 | 65 | } |
59 | 66 |
|
60 | 67 | # conditionally assign billing user role at the org level |
61 | 68 | resource "google_organization_iam_member" "billing_user" { |
62 | | - count = local.org_billing ? length(var.names) : 0 |
63 | | - org_id = var.org_id |
64 | | - role = "roles/billing.user" |
65 | | - member = "serviceAccount:${google_service_account.service_accounts[count.index].email}" |
| 69 | + for_each = local.org_billing ? local.names : toset([]) |
| 70 | + org_id = var.org_id |
| 71 | + role = "roles/billing.user" |
| 72 | + member = "serviceAccount:${google_service_account.service_accounts[each.value].email}" |
66 | 73 | } |
67 | 74 |
|
68 | 75 | # conditionally assign billing user role on a specific billing account |
69 | 76 | resource "google_billing_account_iam_member" "billing_user" { |
70 | | - count = local.account_billing ? length(var.names) : 0 |
| 77 | + for_each = local.account_billing ? local.names : toset([]) |
71 | 78 | billing_account_id = var.billing_account_id |
72 | 79 | role = "roles/billing.user" |
73 | | - member = "serviceAccount:${google_service_account.service_accounts[count.index].email}" |
| 80 | + member = "serviceAccount:${google_service_account.service_accounts[each.value].email}" |
74 | 81 | } |
75 | 82 |
|
76 | 83 | # conditionally assign roles for shared VPC |
77 | 84 | # ref: https://cloud.google.com/vpc/docs/shared-vpc |
78 | 85 |
|
79 | 86 | resource "google_organization_iam_member" "xpn_admin" { |
80 | | - count = local.xpn ? length(var.names) : 0 |
81 | | - org_id = var.org_id |
82 | | - role = "roles/compute.xpnAdmin" |
83 | | - member = "serviceAccount:${google_service_account.service_accounts[count.index].email}" |
| 87 | + for_each = local.xpn ? local.names : toset([]) |
| 88 | + org_id = var.org_id |
| 89 | + role = "roles/compute.xpnAdmin" |
| 90 | + member = "serviceAccount:${google_service_account.service_accounts[each.value].email}" |
84 | 91 | } |
85 | 92 |
|
86 | 93 | resource "google_organization_iam_member" "organization_viewer" { |
87 | | - count = local.xpn ? length(var.names) : 0 |
88 | | - org_id = var.org_id |
89 | | - role = "roles/resourcemanager.organizationViewer" |
90 | | - member = "serviceAccount:${google_service_account.service_accounts[count.index].email}" |
| 94 | + for_each = local.xpn ? local.names : toset([]) |
| 95 | + org_id = var.org_id |
| 96 | + role = "roles/resourcemanager.organizationViewer" |
| 97 | + member = "serviceAccount:${google_service_account.service_accounts[each.value].email}" |
91 | 98 | } |
92 | 99 |
|
93 | 100 | # keys |
94 | 101 | resource "google_service_account_key" "keys" { |
95 | | - count = var.generate_keys ? length(var.names) : 0 |
96 | | - service_account_id = google_service_account.service_accounts[count.index].email |
| 102 | + for_each = var.generate_keys ? local.names : toset([]) |
| 103 | + service_account_id = google_service_account.service_accounts[each.value].email |
97 | 104 | } |
98 | | - |
|
0 commit comments