Skip to content

ADR-003: Multi-Cloud Strategy

Status

Accepted

Context

Implementation Studio initially launched with GCP-only support for cloud infrastructure. As the platform evolved, we faced a strategic decision:

  1. Market reality - AWS is the largest cloud provider (32% market share), many customers use AWS
  2. Completeness - Multi-cloud support would make the platform more valuable and applicable
  3. Learning value - Teaching cloud-agnostic thinking and highlighting provider differences
  4. Competitive advantage - Most tutorials focus on one cloud; multi-cloud expertise is valuable
  5. Maintenance burden - Adding AWS would double modules, documentation, and testing
  6. Scope question - If we add AWS, should we also add Azure? Where does it end?

The decision impacts:

  • Module development - Need AWS equivalents for GCP modules
  • Lab updates - Labs must support multiple providers
  • Documentation - Provider comparisons, migration guides, feature parity
  • Maintenance - Ongoing maintenance of multiple provider implementations
  • Learning experience - Learners can choose their preferred cloud provider

Decision

We will add AWS support to Implementation Studio, creating a GCP + AWS multi-cloud platform. We will not add Azure support at this time.

AWS Support Scope

Core Infrastructure Modules (Phase 1):

  • ✅ EKS Cluster (equivalent to GKE)
  • ✅ VPC (equivalent to GCP VPC)
  • ✅ VPC Private (equivalent to GCP Private VPC)
  • ✅ ECR (equivalent to Artifact Registry)
  • ✅ Security Groups (equivalent to Firewall Rules)
  • ✅ RDS (equivalent to Cloud SQL)

Lab Support:

  • ✅ Lab 01: Standard Deployment (GCP + AWS)
  • ✅ Lab 03: Private Network Deployment (GCP + AWS)
  • ✅ Lab 04: Firewall-Restricted Deployment (GCP + AWS)
  • ✅ Lab 05: POC Sprint (Kind + GCP + AWS)
  • ✅ Lab 06: Multi-Tenant Deployment (Kind + GCP + AWS)
  • ✅ Lab 07: Integration Patterns (GCP + AWS)
  • ✅ Labs 02, 08, 09: Cloud-agnostic (no changes needed)

Azure Decision

We will NOT add Azure support for the following reasons:

  • Market coverage - GCP + AWS covers ~60% of cloud market
  • Maintenance burden - Adding Azure would triple maintenance (GCP + AWS + Azure)
  • Focus - Better to excel at GCP + AWS than be mediocre at all three
  • Community - Azure support can be a community contribution if demand exists
  • Resource constraints - Limited time/resources to maintain three providers

Consequences

Positive

  • Broader applicability - Platform useful for AWS customers (largest market share)
  • Learning value - Teaches cloud-agnostic thinking and provider differences
  • Competitive differentiation - Most tutorials focus on one cloud; we cover two
  • Real-world relevance - Many customers use AWS; skills are transferable
  • Portfolio value - Demonstrates multi-cloud expertise (valuable for career)
  • Flexibility - Learners can choose their preferred cloud provider
  • Feature comparison - Highlights differences between providers (educational)

Negative

  • Maintenance burden - 2x modules, 2x documentation, 2x testing
  • Complexity - Different patterns (EKS vs GKE), terminology, best practices
  • Documentation overhead - Must document provider differences and migration paths
  • Feature parity - Must keep features in sync between providers
  • Testing complexity - Must test both providers, manage two sets of credentials
  • Learning curve - More documentation to navigate, potential confusion for beginners

Neutral

  • Market coverage - GCP + AWS covers ~60% of market (good, not perfect)
  • Future expansion - Azure can be added later if demand exists
  • Community contributions - Azure support can be community-driven

Alternatives Considered

Option 1: GCP Only (Status Quo)

Pros:

  • Simpler - Single provider, less complexity
  • Faster development - No need to maintain AWS modules
  • Lower maintenance - Half the modules, documentation, testing
  • Focused - Can excel at GCP patterns
  • Lower barrier - Easier for beginners (one cloud to learn)

Cons:

  • Limited applicability - Only useful for GCP customers
  • Missed opportunity - AWS is largest cloud provider (32% market share)
  • Less valuable - Skills less transferable
  • Competitive disadvantage - Other platforms may offer multi-cloud
  • Learning limitation - Doesn't teach cloud-agnostic thinking

Why not chosen: While simpler, GCP-only limits the platform's applicability and learning value. AWS support significantly increases the platform's value proposition.

Option 2: AWS Only

Pros:

  • Largest market - AWS has 32% market share
  • Broader applicability - More customers use AWS
  • Simpler - Single provider, less complexity
  • Focused - Can excel at AWS patterns

Cons:

  • Abandon GCP investment - Would lose all GCP modules and labs
  • Less differentiation - Many tutorials already focus on AWS
  • Learning limitation - Doesn't teach cloud-agnostic thinking
  • Waste of effort - GCP modules already built and working

Why not chosen: Abandoning GCP would waste existing investment. GCP + AWS provides better coverage and learning value.

Option 3: GCP + AWS + Azure (All Three)

Pros:

  • Complete coverage - Covers all major cloud providers
  • Maximum applicability - Useful for any cloud customer
  • Comprehensive - Most complete learning platform

Cons:

  • 3x maintenance burden - Triple the modules, documentation, testing
  • Quality risk - Harder to maintain quality across three providers
  • Resource constraints - Limited time/resources to maintain three providers
  • Diminishing returns - GCP + AWS covers ~60% of market; Azure adds ~20%
  • Complexity - More documentation, more patterns, more confusion
  • Focus dilution - May spread effort too thin

Why not chosen: The maintenance burden of three providers outweighs the benefits. GCP + AWS covers the majority of the market, and Azure can be added later if demand exists.

Option 4: Cloud-Agnostic Abstraction Layer

Pros:

  • Single interface - One module interface, multiple backends
  • Easier expansion - Adding new providers is easier
  • Consistent patterns - Same patterns across all providers
  • Less duplication - Shared logic, provider-specific implementations

Cons:

  • Complexity - Abstraction layer adds complexity
  • Hides differences - May hide important provider-specific differences
  • Learning limitation - Doesn't teach provider-specific patterns
  • Maintenance overhead - Abstraction layer itself requires maintenance
  • Less educational - Learners don't see provider differences clearly

Why not chosen: While elegant, an abstraction layer would hide important provider differences and reduce educational value. Direct provider modules are clearer and more educational.

Option 5: Parallel Tracks (Separate GCP/AWS Labs)

Pros:

  • Clear separation - Learners follow one track (GCP or AWS)
  • No confusion - No need to choose provider in each lab
  • Focused learning - Can complete without learning both

Cons:

  • Duplicate content - Labs duplicated for each provider
  • More maintenance - Duplicate labs to maintain
  • Harder to sync - Difficult to keep labs in sync
  • Less flexible - Can't easily switch providers

Why not chosen: Duplicating labs would create significant maintenance burden. Conditional module selection (single lab, choose provider) is more maintainable.

Decision Rationale

GCP + AWS was chosen because it:

  1. Maximizes market coverage - GCP + AWS covers ~60% of cloud market
  2. Balances value and maintenance - Good coverage without excessive maintenance burden
  3. Teaches cloud-agnostic thinking - Learners see provider differences and similarities
  4. Demonstrates expertise - Multi-cloud skills are valuable and differentiate the platform
  5. Maintains quality - Two providers is manageable; three would risk quality
  6. Allows future expansion - Azure can be added later if demand exists

Azure exclusion was decided because:

  1. Diminishing returns - GCP + AWS covers majority of market; Azure adds less value
  2. Maintenance burden - Three providers would triple maintenance
  3. Quality risk - Harder to maintain quality across three providers
  4. Resource constraints - Limited time/resources for three providers
  5. Community option - Azure can be community contribution if demand exists

Implementation

Phase 1: Core AWS Modules ✅ Complete

Created AWS equivalents for core GCP modules:

  • modules/aws/eks-cluster/ - EKS cluster (equivalent to GKE)
  • modules/aws/vpc/ - VPC with public/private subnets
  • modules/aws/vpc-private/ - Private VPC with VPC endpoints
  • modules/aws/ecr/ - Elastic Container Registry
  • modules/aws/security-groups/ - Security groups for strict egress
  • modules/aws/rds/ - RDS for database integration

Phase 2: Lab Updates ✅ Complete

Updated labs to support both providers:

  • Lab 01 - Standard deployment (GCP + AWS)
  • Lab 03 - Private network (GCP + AWS)
  • Lab 04 - Firewall-restricted (GCP + AWS)
  • Lab 05 - POC Sprint (Kind + GCP + AWS)
  • Lab 06 - Multi-tenant (Kind + GCP + AWS)
  • Lab 07 - Integration patterns (GCP + AWS)

Phase 3: Documentation ✅ Complete

Created comprehensive multi-cloud documentation:

  • docs/02-multi-cloud/provider-comparison.md - Technical GCP vs AWS comparison
  • docs/02-multi-cloud/migration-guide.md - Migration instructions
  • docs/02-multi-cloud/feature-parity-matrix.md - Feature comparison
  • Updated all lab documentation with provider selection guides

Module Parity Strategy

Keep modules functionally equivalent:

  • Same variable names where appropriate
  • Same output structure
  • Document differences clearly
  • Provide migration guides

Example:

hcl
# GCP
module "gke_cluster" {
  source = "../../modules/gcp/gke-cluster"
  project_id = var.project_id
  # ...
}

# AWS
module "eks_cluster" {
  source = "../../modules/aws/eks-cluster"
  # Equivalent variables
  # ...
}

Provider Selection in Labs

Labs use conditional module selection:

hcl
variable "cloud_provider" {
  description = "Cloud provider: gcp or aws"
  type        = string
  validation {
    condition     = contains(["gcp", "aws"], var.cloud_provider)
    error_message = "Cloud provider must be 'gcp' or 'aws'."
  }
}

module "cluster" {
  source = var.cloud_provider == "gcp"
    ? "../../modules/gcp/gke-cluster"
    : "../../modules/aws/eks-cluster"
  # ...
}

Future Considerations

Azure Support

Decision: Not adding Azure support at this time.

Future consideration: Azure support can be added if:

  • Community demand exists
  • Resources become available
  • GCP + AWS are successful and well-maintained

Approach: Azure support would be a community contribution, not core platform feature.

Other Cloud Providers

Decision: Focus on GCP + AWS only.

Rationale: GCP + AWS covers majority of market. Adding more providers (Oracle Cloud, IBM Cloud, etc.) would dilute focus without significant value.

References


Date: January 5, 2026
Author: Ben Hankins
Status: Accepted

Released under the MIT License.