1515 */
1616
1717locals {
18- services = var. enable_apis ? toset (concat (var. activate_apis , [for i in var . activate_api_identities : i . api ])) : toset ([])
18+ activate_compute_identity = 0 != length ([for i in var . activate_api_identities : i if i . api == " compute.googleapis.com" ])
19+ services = var. enable_apis ? toset (concat (var. activate_apis , [for i in var . activate_api_identities : i . api ])) : toset ([])
1920 service_identities = flatten ([
2021 for i in var . activate_api_identities : [
2122 for r in i . roles :
@@ -35,24 +36,50 @@ resource "google_project_service" "project_services" {
3536 disable_dependent_services = var. disable_dependent_services
3637}
3738
39+ # First handle all service identities EXCEPT compute.googleapis.com.
3840resource "google_project_service_identity" "project_service_identities" {
3941 for_each = {
4042 for i in var . activate_api_identities :
4143 i.api = > i
44+ if i . api != " compute.googleapis.com"
4245 }
4346
4447 provider = google- beta
4548 project = var. project_id
4649 service = each. value . api
4750}
4851
52+ # Process the compute.googleapis.com identity separately, if present in the inputs.
53+ data "google_compute_default_service_account" "default" {
54+ count = local. activate_compute_identity ? 1 : 0
55+ project = var. project_id
56+ }
57+
58+ locals {
59+ add_service_roles = merge (
60+ {
61+ for si in local . service_identities :
62+ " ${si.api} ${si.role}" => {
63+ email = google_project_service_identity.project_service_identities[si.api].email
64+ role = si.role
65+ }
66+ if si . api != " compute.googleapis.com"
67+ },
68+ {
69+ for si in local . service_identities :
70+ " ${si.api} ${si.role}" => {
71+ email = data.google_compute_default_service_account.default[0 ].email
72+ role = si.role
73+ }
74+ if si . api == " compute.googleapis.com"
75+ }
76+ )
77+ }
78+
4979resource "google_project_iam_member" "project_service_identity_roles" {
50- for_each = {
51- for si in local . service_identities :
52- " ${si.api} ${si.role}" => si
53- }
80+ for_each = local. add_service_roles
5481
5582 project = var. project_id
5683 role = each. value . role
57- member = " serviceAccount:${ google_project_service_identity . project_service_identities [ each . value . api ] . email } "
84+ member = " serviceAccount:${ each . value . email } "
5885}
0 commit comments