Skip to main content

GCP Organization Structure

This page documents the complete GCP organization hierarchy created and managed by Badal Foundations, including all folders, projects, IAM groups, service accounts, and naming conventions.

PropertyValue
Foundations Organizationfoundation.badal.io (758951886862)
Legacy Organizationbadal.io (42165644541)
Billing Account01DEF7-F9833E-AD765A
Default Regionsnorthamerica-northeast1 (primary), us-west1 (secondary)
Total Projects~219 (excluding system projects)
Two GCP Organizations

Badal operates two GCP organizations. foundation.badal.io is the Foundations platform described in this documentation. badal.io is the legacy organization containing older projects, client-specific workloads (e.g., Scotiabank GDAP), sandbox environments, and infrastructure pipelines predating Foundations. New workloads should be deployed into foundation.badal.io via the Foundations platform.

Full Organization Hierarchy

foundation.badal.io (758951886862)

├── fldr-bootstrap/
│ ├── prj-b-seed
│ │ └── State bucket (bkt-prj-b-seed-tfstate-6a60), SAs, KMS
│ └── prj-b-cicd-wif-gh
│ └── GitHub Actions WIF provider

├── fldr-common/
│ ├── prj-c-logging
│ ├── prj-c-billing-logs
│ ├── prj-c-kms
│ ├── prj-c-secrets
│ ├── prj-c-artifact-registry
│ ├── prj-c-scc
│ │
│ ├── platform-0r4dp/ (Platform BU common folder)
│ │ └── wif-host-0r4dp
│ ├── devex-9c9dl/ (DevEx BU common folder)
│ │ └── wif-host-9c9dl
│ └── data-80r13/ (Data BU common folder)
│ └── wif-host-80r13

├── fldr-network/
│ ├── prj-c-dns-hub
│ ├── prj-c-interconnect
│ ├── prj-d-shared-base (development)
│ ├── prj-d-shared-restricted (development)
│ ├── prj-n-shared-base (non-production)
│ ├── prj-n-shared-restricted (non-production)
│ ├── prj-p-shared-base (production)
│ └── prj-p-shared-restricted (production)

├── fldr-pci-dss/
│ └── (Excluded from most org policies)

├── fldr-sandbox/
│ ├── common/
│ ├── non-production/
│ └── production/

├── fldr-development/
│ ├── fldr-development/monitoring, secrets, KMS projects
│ ├── platform-0r4dp/
│ │ └── Tenant projects (e.g., gke-argocd-d-{suffix})
│ ├── data-80r13/
│ │ └── Tenant projects (e.g., governance-d-f6y39, template-d-b8cbu)
│ └── {bu-name}-{suffix}/
│ └── {tenant}-d-{suffix} (tenant projects)

├── fldr-non-production/
│ ├── fldr-non-production/monitoring, secrets, KMS projects
│ ├── platform-0r4dp/
│ │ └── Tenant projects
│ ├── devex-9c9dl/
│ │ └── Tenant projects (e.g., backstage-np-mly9n)
│ ├── data-80r13/
│ │ └── Tenant projects
│ └── {bu-name}-{suffix}/
│ └── {tenant}-np-{suffix} (tenant projects)

└── fldr-production/
├── fldr-production/monitoring, secrets, KMS projects
├── platform-0r4dp/
│ └── Tenant projects
├── devex-9c9dl/
│ └── Tenant projects
├── data-80r13/
│ └── Tenant projects
└── {bu-name}-{suffix}/
└── {tenant}-p-{suffix} (tenant projects)

Top-Level Folders

FolderCreated ByPurpose
fldr-bootstrapStage 0 (Bootstrap)Seed project, CI/CD project, Terraform state, service accounts
fldr-commonStage 1 (Organization)Shared infrastructure projects and BU common folders
fldr-networkStage 1 (Organization)DNS hub, interconnect, per-env shared VPC host projects
fldr-pci-dssStage 1 (Organization)PCI-DSS workloads, excluded from restrictive org policies
fldr-sandboxStage 4 (Projects)Sandbox business unit for experimentation
fldr-developmentStage 2 (Environments)Development environment workloads
fldr-non-productionStage 2 (Environments)Non-production (staging) environment workloads
fldr-productionStage 2 (Environments)Production environment workloads

Per-Environment Folder Structure

Each environment folder (fldr-development, fldr-non-production, fldr-production) contains:

  1. Shared infrastructure projects created by Stage 2 (Environments):

    • Monitoring project
    • Secrets project
    • KMS project
  2. Business unit folders ({bu-name}-{suffix}) created by the BU module, containing:

    • Tenant projects ({tenant}-{env_code}-{suffix}) created by the tenant module

The same BU folder name appears in each environment folder. For example, data-80r13 exists under fldr-development, fldr-non-production, and fldr-production.

Business Unit Folder Pattern

Each business unit creates folders in two locations:

LocationFolder NameContents
fldr-common/{bu}-{suffix}/Common folderWIF host project (wif-host-{suffix})
fldr-{env}/{bu}-{suffix}/Per-env folderTenant GCP projects

Tenant Project Naming

Tenant projects follow the pattern: {tenant}-{env_code}-{suffix}

ComponentDescriptionExample
{tenant}Tenant namebackstage, governance, template
{env_code}First letter(s) of environmentd, np, p
{suffix}Random 5-char alphanumericmly9n, f6y39, b8cbu

Examples:

TenantEnvironmentProject ID
backstagenon-productionbackstage-np-mly9n
backstageproductionbackstage-p-mly9n
governancedevelopmentgovernance-d-f6y39
templatedevelopmenttemplate-d-b8cbu
templatenon-productiontemplate-np-b8cbu
templateproductiontemplate-p-b8cbu

Shared Infrastructure Projects

Project IDFolderPurpose
prj-b-seedfldr-bootstrapTerraform state bucket, KMS keys, service accounts
prj-b-cicd-wif-ghfldr-bootstrapGitHub Actions OIDC / Workload Identity Federation
prj-c-loggingfldr-commonCentralized org-level audit and access logs
prj-c-billing-logsfldr-commonBilling export and billing-specific logs
prj-c-kmsfldr-commonOrganization-wide KMS key rings and crypto keys
prj-c-secretsfldr-commonCentralized Secret Manager for shared secrets
prj-c-artifact-registryfldr-commonOrganization-wide Artifact Registry
prj-c-sccfldr-commonSecurity Command Center configuration
prj-c-dns-hubfldr-networkDNS hub VPC (172.16.0.0/25), Cloud DNS zones
prj-c-interconnectfldr-networkDedicated/Partner Interconnect attachments
prj-d-shared-basefldr-networkDevelopment base Shared VPC host project
prj-d-shared-restrictedfldr-networkDevelopment restricted Shared VPC host project
prj-n-shared-basefldr-networkNon-production base Shared VPC host project
prj-n-shared-restrictedfldr-networkNon-production restricted Shared VPC host project
prj-p-shared-basefldr-networkProduction base Shared VPC host project
prj-p-shared-restrictedfldr-networkProduction restricted Shared VPC host project

IAM Groups

The Foundations bootstrap creates Google Groups for role-based access control:

GroupPurposeTypical Roles
grp-gcp-org-adminsOrganization administratorsroles/resourcemanager.organizationAdmin
grp-gcp-billing-adminsBilling account managementroles/billing.admin
grp-gcp-security-adminsSecurity and complianceroles/iam.securityAdmin, roles/securitycenter.admin
grp-gcp-network-adminsNetwork infrastructureroles/compute.networkAdmin, roles/dns.admin
grp-gcp-platform-adminsPlatform operationsroles/resourcemanager.folderAdmin

Groups are managed via Google Workspace or Cloud Identity and are referenced by org policies and IAM bindings throughout the hierarchy.

Service Accounts

The bootstrap layer creates 5 granular Terraform service accounts, each scoped to a specific pipeline stage:

Service AccountPipeline StageKey Permissions
sa-terraform-bootstrap0-bootstraproles/resourcemanager.organizationAdmin, roles/billing.admin
sa-terraform-org1-orgroles/resourcemanager.folderCreator, roles/orgpolicy.policyAdmin, roles/logging.admin
sa-terraform-env2-environmentsroles/resourcemanager.folderCreator, roles/resourcemanager.projectCreator
sa-terraform-net3-networksroles/compute.networkAdmin, roles/dns.admin, roles/servicenetworking.networksAdmin
sa-terraform-proj4-projectsroles/resourcemanager.projectCreator, roles/billing.user

All service accounts authenticate via Workload Identity Federation (GitHub OIDC), eliminating the need for long-lived service account keys (enforced by org policy iam.disableServiceAccountKeyCreation).

Naming Conventions

Folder Prefixes

PrefixMeaningExample
fldr-Foundation-level folderfldr-bootstrap, fldr-common
{bu}-{suffix}Business unit folderdata-80r13, platform-0r4dp

Project Prefixes

PrefixMeaningExample
prj-b-Bootstrap projectprj-b-seed, prj-b-cicd-wif-gh
prj-c-Common (shared) projectprj-c-logging, prj-c-kms
prj-d-Development environment projectprj-d-shared-base
prj-n-Non-production environment projectprj-n-shared-base
prj-p-Production environment projectprj-p-shared-base
wif-host-WIF host project (per BU)wif-host-80r13
{tenant}-{env}-Tenant projectbackstage-np-mly9n

Environment Codes

EnvironmentShort CodeSingle Letter
developmentdd
non-productionnpn
productionpp
commoncc
cross-envce-

Other Naming Patterns

Resource TypePatternExample
State bucketbkt-{project}-tfstate-{suffix}bkt-prj-b-seed-tfstate-6a60
GitHub repo (BU)bu-{name}-{suffix}bu-data-80r13
GitHub repo (tenant){bu}-{tenant}-{suffix}data-template-b8cbu

Org Policies

Key organization policies enforced across the hierarchy (except fldr-pci-dss):

PolicyEffect
Disable nested virtualizationPrevents VMs inside VMs
Disable serial port accessBlocks serial console access
Require OS LoginEnforces OS Login for SSH access
Disable external IPs on VMsPrevents public IP assignment to compute instances
Restrict public Cloud SQLBlocks public IP on Cloud SQL instances
Disable SA key creationPrevents creation of service account keys (forces WIF)
Disable default SA grantsPrevents automatic IAM grants to default SAs
Enforce uniform bucket accessRequires uniform bucket-level access on GCS
Block public GCS accessPrevents public access to storage buckets
Domain restricted sharingLimits IAM grants to approved domains only