deployment/cloud_composer_template.tf (122 lines of code) (raw):

variable "project_config" { type = object({ project_name = string project_number = string project_region = string }) } variable "environment_config" { type = list( object({ environment_name = string service_account_id = string }) ) } locals { environment_config_dict = { for o in var.environment_config : o.environment_name => o } } resource "google_project_service" "composer_api" { provider = google-beta project = var.project_config.project_name service = "composer.googleapis.com" disable_on_destroy = false } resource "google_service_account" "custom_service_account" { provider = google-beta for_each = local.environment_config_dict account_id = each.value.service_account_id display_name = "ML Automation Solutions Service Account" } resource "google_project_iam_member" "composer_worker_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/composer.worker" } resource "google_project_iam_member" "tpu_admin_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/tpu.admin" } resource "google_project_iam_member" "service_account_user_role" { # need `iam.serviceAccounts.actAs` that SA admin does not have provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/iam.serviceAccountUser" } resource "google_project_iam_member" "service_account_admin_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/iam.serviceAccountAdmin" } resource "google_project_iam_member" "project_iam_admin_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/resourcemanager.projectIamAdmin" } resource "google_project_iam_member" "big_query_admin_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/bigquery.admin" } resource "google_project_iam_member" "storage_admin_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/storage.admin" } resource "google_project_iam_member" "vertex_ai_admin_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/aiplatform.admin" } resource "google_project_iam_member" "artifact_registry_admin_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/artifactregistry.admin" } resource "google_project_iam_member" "monitoring_viewer_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/monitoring.viewer" } resource "google_project_iam_member" "compute_instance_admin_role" { provider = google-beta for_each = local.environment_config_dict project = var.project_config.project_name member = format("serviceAccount:%s", google_service_account.custom_service_account[each.key].email) role = "roles/compute.instanceAdmin.v1" } resource "google_service_account_iam_member" "custom_service_account" { provider = google-beta for_each = local.environment_config_dict service_account_id = google_service_account.custom_service_account[each.key].name role = "roles/composer.ServiceAgentV2Ext" member = "serviceAccount:service-${var.project_config.project_number}@cloudcomposer-accounts.iam.gserviceaccount.com" } module "composer" { source = "./modules/composer_env" for_each = local.environment_config_dict environment_name = each.value.environment_name service_account = google_service_account.custom_service_account[each.key].email }