Skip to main content

Infrastructure Overview

The DevEx Backstage Platform infrastructure is managed via Terraform and deployed on Google Cloud Platform (GCP). This documentation covers the infrastructure architecture, environments, and key resources.

Directory Structure

terraform/
├── common/ # Shared infrastructure modules (called by both environments)
│ ├── main.tf # Primary resource definitions (~880 lines)
│ ├── variables.tf # Input variables
│ ├── outputs.tf # Output values
│ ├── versions.tf # Provider requirements
│ └── templates/ # Cloud-init and Vault configuration templates

├── modules/ # Reusable Terraform modules
│ └── gh-runner-mig-arm64/ # ARM64 GitHub Actions runners

├── non-production/ # Non-prod environment configuration
│ ├── main.tf # Calls common module
│ ├── backend.tf # Terraform Cloud backend
│ └── remote.tf # Remote data sources

└── production/ # Production environment configuration
├── main.tf # Calls common module
├── backend.tf # Terraform Cloud backend
└── remote.tf # Remote data sources

Environments

EnvironmentTFC WorkspaceAuto-DeployPurpose
Non-Productionwrkspc-np-devex-backstage✅ YesDevelopment and staging
Productionwrkspc-p-devex-backstage❌ ManualProduction deployment

Both environments use the same common/ module, with environment-specific variables provided via Terraform Cloud workspace variables.

Architecture Diagram

Key Resources

Networking

ResourcePurposeCIDR/Details
private-network VPCMain networkPrimary region: northamerica-northeast1
shared-subnetBackstage & Vault services10.1.0.0/28
devpods-subnetDevPods infrastructure10.1.254.0/24
github-actions-subnetGitHub runners10.2.1.0/24 (us-central1)
VPC ConnectorCloud Run → private resourcese2-micro, 2-3 instances
Cloud NATOutbound internet accessAll subnets

Compute

ResourceTypePurpose
Vault Instancee2-standard-2Secrets management
Vault Data Disk50GB SSDPersistent Vault storage
GitHub RunnersARM64 T2ACI/CD job execution

Database

ResourceDetails
Cloud SQL InstancePostgreSQL 15, db-g1-small
Databasebackstage-db
Userbackstage with random 32-char password
NetworkPrivate IP only (via service networking)

Storage

BucketPurpose
{project}-backstage-techdocsTechDocs storage
{project}-vault-configVault configuration files

Security

ResourcePurpose
vault-keyringKMS keyring for Vault auto-unseal
vault-unseal-keyRSA encryption key (30-day rotation)
Service Accountsbackstage-app, vault-app
IAP OAuth ClientSecure external Vault access
Self-signed TLSVault internal communication

Service Accounts & IAM

Backstage Service Account (backstage-app)

RolePurpose
cloudsql.clientConnect to Cloud SQL
iam.serviceAccountTokenCreatorCreate Vault tokens
secretmanager.secretAccessorAccess Vault CA cert
storage.objectCreatorWrite TechDocs

Vault Service Account (vault-app)

RolePurpose
cloudkms.cryptoKeyEncrypterDecrypterKMS auto-unseal
compute.viewerList compute instances
logging.logWriterWrite logs
monitoring.metricWriterWrite metrics
storage.objectViewerRead Vault config

Vault Architecture

Vault Components

  • Instance: Ubuntu 22.04, e2-standard-2, Shielded VM
  • Internal LB: 10.1.0.10:8200 for Cloud Run access
  • External LB: HTTPS + IAP for admin access
  • Auto-unseal: GCP KMS key with 30-day rotation
  • TLS: Self-signed certificate for internal traffic

GitHub Actions Runners

The gh-runner-mig-arm64 module provisions ARM64 GitHub Actions runners:

FeatureConfiguration
ArchitectureARM64 (T2A/C4A)
ContainerUbuntu 22.04 + Docker-in-Docker
AuthenticationGitHub App (ID: 1998375)
EphemeralSingle job execution
Regionus-central1 (ARM64 availability)
Zonesa, b, f (excluding c for ARM64)

Runner Labels

["arm64", "ubuntu", "docker", "gcp", "basic-example", "{env_type}"]

Terraform Cloud Integration

Workspace Configuration

terraform {
cloud {
organization = "Badal_devex"
workspaces {
name = "wrkspc-np-devex-backstage" # or wrkspc-p-devex-backstage
}
}
}

Variables (Provided by TFC)

VariableTypeDescription
project_idstringGCP Project ID
regionstringPrimary region
zonestringPrimary zone
env_typestringnonprod or prod
backstage_urlstringBackstage application URL
github_private_keysensitiveGitHub App private key

Outputs

The common module exports these values for use by CI/CD:

OutputPurpose
backstage_cloud_sql_instance_connection_nameCloud SQL connection
backstage_vpc_connector_idVPC connector for Cloud Run
backstage_service_account_emailCloud Run service account
backstage_db_password_secret_idDB password secret
vault_internal_urlVault URL for backend
vault_external_ipVault external access
vault_iap_audienceIAP audience for JWT