1-bootstrap/iam.tf (103 lines of code) (raw):
/**
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
locals {
expanded_environment_with_service_accounts = flatten(
[for key, email in local.cb_service_accounts_emails :
[for fields in values(var.envs) :
{
multitenant_pipeline = key
email = email
network_project_id = fields.network_project_id
billing_account = fields.billing_account
folder_id = fields.folder_id
org_id = fields.org_id
}
]
]
)
}
# IAM Bindings for Google Service Accounts
# These resources assign specific roles to Cloud Build service accounts.
resource "google_service_account_iam_member" "account_access" {
for_each = module.tf_cloudbuild_workspace
service_account_id = each.value.cloudbuild_sa
role = "roles/iam.serviceAccountUser"
member = "serviceAccount:${reverse(split("/", each.value.cloudbuild_sa))[0]}"
}
resource "google_service_account_iam_member" "token_creator" {
for_each = module.tf_cloudbuild_workspace
service_account_id = each.value.cloudbuild_sa
role = "roles/iam.serviceAccountTokenCreator"
member = "serviceAccount:${reverse(split("/", each.value.cloudbuild_sa))[0]}"
}
# Viewer Role for Bootstrap Project
# This resource grants view access to service accounts in the bootstrap project.
resource "google_project_iam_member" "bootstrap_project_viewer" {
for_each = local.cb_service_accounts_emails
role = "roles/viewer"
member = "serviceAccount:${each.value}"
project = var.project_id
}
# Billing Account IAM Bindings
# This resource assigns the 'billing.user' role to service accounts for billing purposes.
resource "google_billing_account_iam_member" "billing_user" {
for_each = tomap({ for i, obj in local.expanded_environment_with_service_accounts : i => obj })
role = "roles/billing.user"
member = "serviceAccount:${each.value.email}"
billing_account_id = each.value.billing_account
}
# Folder-Level IAM Bindings
# These resources assign roles to service accounts at the folder level.
resource "google_folder_iam_member" "project_creator" {
for_each = tomap({ for i, obj in local.expanded_environment_with_service_accounts : i => obj })
role = "roles/resourcemanager.projectCreator"
member = "serviceAccount:${each.value.email}"
folder = each.value.folder_id
}
resource "google_folder_iam_member" "xpn_admin" {
for_each = tomap({ for i, obj in local.expanded_environment_with_service_accounts : i => obj })
role = "roles/compute.xpnAdmin"
member = "serviceAccount:${each.value.email}"
folder = each.value.folder_id
}
resource "google_folder_iam_member" "owner" {
for_each = tomap({ for i, obj in local.expanded_environment_with_service_accounts : i => obj })
role = "roles/owner"
member = "serviceAccount:${each.value.email}"
folder = each.value.folder_id
}
resource "google_folder_iam_member" "app_factory_foldereditor" {
for_each = tomap({ for i, obj in local.expanded_environment_with_service_accounts : i => obj if obj.multitenant_pipeline == "applicationfactory" })
role = "roles/resourcemanager.folderEditor"
member = "serviceAccount:${each.value.email}"
folder = var.common_folder_id
}
resource "google_folder_iam_member" "app_factory_folder_creator" {
for_each = tomap({ for i, obj in local.expanded_environment_with_service_accounts : i => obj if obj.multitenant_pipeline == "applicationfactory" })
role = "roles/resourcemanager.folderCreator"
member = "serviceAccount:${each.value.email}"
folder = var.common_folder_id
}
resource "google_folder_iam_member" "app_factory_project_creator" {
for_each = tomap({ for i, obj in local.expanded_environment_with_service_accounts : i => obj if obj.multitenant_pipeline == "applicationfactory" })
role = "roles/resourcemanager.projectCreator"
member = "serviceAccount:${each.value.email}"
folder = var.common_folder_id
}
resource "google_folder_iam_member" "app_factory_folder_viewer" {
for_each = tomap({ for i, obj in local.expanded_environment_with_service_accounts : i => obj if obj.multitenant_pipeline == "applicationfactory" })
role = "roles/resourcemanager.folderViewer"
member = "serviceAccount:${each.value.email}"
folder = var.common_folder_id
}
resource "google_project_iam_member" "cloud_build_worker_pool_user" {
for_each = local.cb_service_accounts_emails
role = "roles/cloudbuild.workerPoolUser"
member = "serviceAccount:${each.value}"
project = local.worker_pool_project
}