diff --git a/fast/stages/01-resman/billing.tf b/fast/stages/01-resman/billing.tf index 3e2020e7..f69b9ad9 100644 --- a/fast/stages/01-resman/billing.tf +++ b/fast/stages/01-resman/billing.tf @@ -41,7 +41,8 @@ module "billing-organization-ext" { count = local.billing_org_ext ? 1 : 0 organization_id = "organizations/${var.billing_account.organization_id}" iam_additive = { - "roles/billing.user" = local.billing_ext_users + "roles/billing.user" = local.billing_ext_users + "roles/billing.costsManager" = local.billing_ext_users } } @@ -55,3 +56,12 @@ resource "google_billing_account_iam_member" "billing_ext_admin" { role = "roles/billing.user" member = each.key } + +resource "google_billing_account_iam_member" "billing_ext_costsmanager" { + for_each = toset( + local.billing_ext ? local.billing_ext_users : [] + ) + billing_account_id = var.billing_account.id + role = "roles/billing.costsManager" + member = each.key +} diff --git a/fast/stages/01-resman/cicd-project-factory.tf b/fast/stages/01-resman/cicd-project-factory.tf index 62f36f9d..2c9f0972 100644 --- a/fast/stages/01-resman/cicd-project-factory.tf +++ b/fast/stages/01-resman/cicd-project-factory.tf @@ -122,10 +122,12 @@ module "branch-pf-dev-sa-cicd" { each.value.branch == null ? format( local.identity_providers[each.value.identity_provider].principalset_tpl, + var.automation.federated_identity_pool, each.value.name ) : format( local.identity_providers[each.value.identity_provider].principal_tpl, + var.automation.federated_identity_pool, each.value.name, each.value.branch ) diff --git a/fast/stages/02-networking-nva/landing.tf b/fast/stages/02-networking-nva/landing.tf index 0af94b11..be5f5197 100644 --- a/fast/stages/02-networking-nva/landing.tf +++ b/fast/stages/02-networking-nva/landing.tf @@ -38,10 +38,12 @@ module "landing-project" { service_projects = [] } iam = { - "roles/dns.admin" = [local.service_accounts.project-factory-prod] - (local.custom_roles.service_project_network_admin) = [ - local.service_accounts.project-factory-prod - ] + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) + (local.custom_roles.service_project_network_admin) = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) } } diff --git a/fast/stages/02-networking-nva/main.tf b/fast/stages/02-networking-nva/main.tf index 8f9e94ca..c680f444 100644 --- a/fast/stages/02-networking-nva/main.tf +++ b/fast/stages/02-networking-nva/main.tf @@ -25,7 +25,8 @@ locals { })] } service_accounts = { - for k, v in coalesce(var.service_accounts, {}) : k => "serviceAccount:${v}" + for k, v in coalesce(var.service_accounts, {}) : + k => "serviceAccount:${v}" if v != null } stage3_sas_delegated_grants = [ "roles/composer.sharedVpcAgent", diff --git a/fast/stages/02-networking-nva/spoke-dev.tf b/fast/stages/02-networking-nva/spoke-dev.tf index d6da279d..002bf01d 100644 --- a/fast/stages/02-networking-nva/spoke-dev.tf +++ b/fast/stages/02-networking-nva/spoke-dev.tf @@ -40,7 +40,9 @@ module "dev-spoke-project" { } metric_scopes = [module.landing-project.project_id] iam = { - "roles/dns.admin" = compact([local.service_accounts.project-factory-dev]) + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-dev, null) + ]) } } @@ -124,8 +126,8 @@ resource "google_project_iam_binding" "dev_spoke_project_iam_delegated" { project = module.dev-spoke-project.project_id role = "roles/resourcemanager.projectIamAdmin" members = compact([ - local.service_accounts.data-platform-dev, - local.service_accounts.project-factory-dev, + try(local.service_accounts.data-platform-dev, null), + try(local.service_accounts.project-factory-dev, null), ]) condition { title = "dev_stage3_sa_delegated_grants" diff --git a/fast/stages/02-networking-nva/spoke-prod.tf b/fast/stages/02-networking-nva/spoke-prod.tf index 6f0e4edb..3769474d 100644 --- a/fast/stages/02-networking-nva/spoke-prod.tf +++ b/fast/stages/02-networking-nva/spoke-prod.tf @@ -40,7 +40,9 @@ module "prod-spoke-project" { } metric_scopes = [module.landing-project.project_id] iam = { - "roles/dns.admin" = compact([local.service_accounts.project-factory-prod]) + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) } } @@ -124,8 +126,8 @@ resource "google_project_iam_binding" "prod_spoke_project_iam_delegated" { project = module.prod-spoke-project.project_id role = "roles/resourcemanager.projectIamAdmin" members = compact([ - local.service_accounts.data-platform-prod, - local.service_accounts.project-factory-prod, + try(local.service_accounts.data-platform-prod, null), + try(local.service_accounts.project-factory-prod, null), ]) condition { title = "prod_stage3_sa_delegated_grants" diff --git a/fast/stages/02-networking-peering/landing.tf b/fast/stages/02-networking-peering/landing.tf index fae95957..45189ae9 100644 --- a/fast/stages/02-networking-peering/landing.tf +++ b/fast/stages/02-networking-peering/landing.tf @@ -38,10 +38,12 @@ module "landing-project" { service_projects = [] } iam = { - "roles/dns.admin" = [local.service_accounts.project-factory-prod] - (local.custom_roles.service_project_network_admin) = [ - local.service_accounts.project-factory-prod - ] + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) + (local.custom_roles.service_project_network_admin) = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) } } diff --git a/fast/stages/02-networking-peering/main.tf b/fast/stages/02-networking-peering/main.tf index 5df6d604..9e013fd1 100644 --- a/fast/stages/02-networking-peering/main.tf +++ b/fast/stages/02-networking-peering/main.tf @@ -36,7 +36,8 @@ locals { "roles/vpcaccess.user", ] service_accounts = { - for k, v in coalesce(var.service_accounts, {}) : k => "serviceAccount:${v}" + for k, v in coalesce(var.service_accounts, {}) : + k => "serviceAccount:${v}" if v != null } } diff --git a/fast/stages/02-networking-peering/spoke-dev.tf b/fast/stages/02-networking-peering/spoke-dev.tf index 69c5b8eb..a65c71ce 100644 --- a/fast/stages/02-networking-peering/spoke-dev.tf +++ b/fast/stages/02-networking-peering/spoke-dev.tf @@ -41,7 +41,9 @@ module "dev-spoke-project" { } metric_scopes = [module.landing-project.project_id] iam = { - "roles/dns.admin" = compact([local.service_accounts.project-factory-dev]) + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-dev, null) + ]) } } @@ -101,8 +103,8 @@ resource "google_project_iam_binding" "dev_spoke_project_iam_delegated" { project = module.dev-spoke-project.project_id role = "roles/resourcemanager.projectIamAdmin" members = compact([ - local.service_accounts.data-platform-dev, - local.service_accounts.project-factory-dev, + try(local.service_accounts.data-platform-dev, null), + try(local.service_accounts.project-factory-dev, null), ]) condition { title = "dev_stage3_sa_delegated_grants" diff --git a/fast/stages/02-networking-peering/spoke-prod.tf b/fast/stages/02-networking-peering/spoke-prod.tf index c8ded75b..6856df96 100644 --- a/fast/stages/02-networking-peering/spoke-prod.tf +++ b/fast/stages/02-networking-peering/spoke-prod.tf @@ -41,7 +41,9 @@ module "prod-spoke-project" { } metric_scopes = [module.landing-project.project_id] iam = { - "roles/dns.admin" = compact([local.service_accounts.project-factory-prod]) + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) } } @@ -101,8 +103,8 @@ resource "google_project_iam_binding" "prod_spoke_project_iam_delegated" { project = module.prod-spoke-project.project_id role = "roles/resourcemanager.projectIamAdmin" members = compact([ - local.service_accounts.data-platform-prod, - local.service_accounts.project-factory-prod, + try(local.service_accounts.data-platform-prod, null), + try(local.service_accounts.project-factory-prod, null), ]) condition { title = "prod_stage3_sa_delegated_grants" diff --git a/fast/stages/02-networking-vpn/landing.tf b/fast/stages/02-networking-vpn/landing.tf index fae95957..45189ae9 100644 --- a/fast/stages/02-networking-vpn/landing.tf +++ b/fast/stages/02-networking-vpn/landing.tf @@ -38,10 +38,12 @@ module "landing-project" { service_projects = [] } iam = { - "roles/dns.admin" = [local.service_accounts.project-factory-prod] - (local.custom_roles.service_project_network_admin) = [ - local.service_accounts.project-factory-prod - ] + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) + (local.custom_roles.service_project_network_admin) = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) } } diff --git a/fast/stages/02-networking-vpn/main.tf b/fast/stages/02-networking-vpn/main.tf index 5df6d604..9e013fd1 100644 --- a/fast/stages/02-networking-vpn/main.tf +++ b/fast/stages/02-networking-vpn/main.tf @@ -36,7 +36,8 @@ locals { "roles/vpcaccess.user", ] service_accounts = { - for k, v in coalesce(var.service_accounts, {}) : k => "serviceAccount:${v}" + for k, v in coalesce(var.service_accounts, {}) : + k => "serviceAccount:${v}" if v != null } } diff --git a/fast/stages/02-networking-vpn/spoke-dev.tf b/fast/stages/02-networking-vpn/spoke-dev.tf index 69c5b8eb..a65c71ce 100644 --- a/fast/stages/02-networking-vpn/spoke-dev.tf +++ b/fast/stages/02-networking-vpn/spoke-dev.tf @@ -41,7 +41,9 @@ module "dev-spoke-project" { } metric_scopes = [module.landing-project.project_id] iam = { - "roles/dns.admin" = compact([local.service_accounts.project-factory-dev]) + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-dev, null) + ]) } } @@ -101,8 +103,8 @@ resource "google_project_iam_binding" "dev_spoke_project_iam_delegated" { project = module.dev-spoke-project.project_id role = "roles/resourcemanager.projectIamAdmin" members = compact([ - local.service_accounts.data-platform-dev, - local.service_accounts.project-factory-dev, + try(local.service_accounts.data-platform-dev, null), + try(local.service_accounts.project-factory-dev, null), ]) condition { title = "dev_stage3_sa_delegated_grants" diff --git a/fast/stages/02-networking-vpn/spoke-prod.tf b/fast/stages/02-networking-vpn/spoke-prod.tf index c8ded75b..6856df96 100644 --- a/fast/stages/02-networking-vpn/spoke-prod.tf +++ b/fast/stages/02-networking-vpn/spoke-prod.tf @@ -41,7 +41,9 @@ module "prod-spoke-project" { } metric_scopes = [module.landing-project.project_id] iam = { - "roles/dns.admin" = compact([local.service_accounts.project-factory-prod]) + "roles/dns.admin" = compact([ + try(local.service_accounts.project-factory-prod, null) + ]) } } @@ -101,8 +103,8 @@ resource "google_project_iam_binding" "prod_spoke_project_iam_delegated" { project = module.prod-spoke-project.project_id role = "roles/resourcemanager.projectIamAdmin" members = compact([ - local.service_accounts.data-platform-prod, - local.service_accounts.project-factory-prod, + try(local.service_accounts.data-platform-prod, null), + try(local.service_accounts.project-factory-prod, null), ]) condition { title = "prod_stage3_sa_delegated_grants"