Kokil Thapa - Professional Web Developer in Nepal
Freelancer Web Developer in Nepal with 15+ Years of Experience

Kokil Thapa is an experienced full-stack web developer focused on building fast, secure, and scalable web applications. He helps businesses and individuals create SEO-friendly, user-focused digital platforms designed for long-term growth.

Multi-Cloud Architecture: A Practical Guide

By Kokil Thapa | Last reviewed: August 2026

Most teams do not wake up wanting three cloud bills. They arrive at Multi-Cloud Architecture: A Practical Guide territory after a merger, a compliance requirement, a vendor outage, or a client contract that mandates a specific provider. Running a Laravel app on one EC2 instance is straightforward; running production workloads across AWS, Azure, and Google Cloud is a different engineering problem — one where networking, identity, observability, and cost control matter more than which logo sits on the invoice. If you are evaluating whether multi-cloud is worth the operational tax, or you already committed and need a sane blueprint, this guide walks through the decisions I make on real client projects — not the slide-deck version vendors sell at conferences. For foundational automation patterns, see the Terraform infrastructure-as-code practical guide first; multi-cloud builds on the same discipline.

What is multi-cloud architecture and when should you actually use it?

Multi-cloud architecture means your production system spans more than one public cloud provider. That is different from hybrid cloud (on-premises plus one public cloud) and different from multi-region (same provider, multiple regions). A Nepali SaaS might keep its primary Laravel API on AWS in ap-south-1 (Mumbai) for latency, run analytics on BigQuery in GCP because the team already knows SQL-based warehousing, and host a Microsoft Teams-integrated reporting module on Azure because the enterprise client mandates it. Each choice has a reason; without reasons, you are paying complexity interest for no return.

In practice, I see four legitimate triggers:

  • Vendor resilience: A regional or provider-wide outage should not take your entire business offline. Payment callbacks, booking confirmations, and client portals for law firms cannot sit on a single failure domain if uptime is contractual.
  • Compliance and data residency: Some contracts require data to stay in specific jurisdictions. Nepal-based businesses serving EU clients may need GDPR-aligned storage; a government-adjacent portal may require audit trails on a provider the procurement team already approved.
  • Best-of-breed services: Route 53 health checks, CloudFront CDN, Azure AD B2C, GCP Vertex AI — no single vendor wins every category. Multi-cloud lets you pick the tool, not the ecosystem.
  • Acquisition or partner integration: Post-merger systems rarely share one cloud account on day one. Multi-cloud is sometimes the interim architecture until you consolidate — and sometimes the permanent one.
Multi-Cloud Reference ArchitectureAWSEC2 · RDS · S3CloudFront CDNAzureApp Service · AKSKey VaultGoogle CloudGKE · Cloud SQLBigQueryShared Layer: Identity · DNS · Observability · IaCUsers · APIs · CI/CD · On-call engineers
Multi-cloud architecture ties AWS, Azure, and GCP through shared identity, DNS, observability, and infrastructure-as-code — not three isolated silos.

A common mistake is treating multi-cloud as an insurance policy you buy before you need it. If your team is three developers maintaining a WooCommerce store and a shared VPS, multi-cloud is almost certainly wrong. If you operate booking systems, payment integrations, and client portals where downtime costs real money, selective multi-cloud — one primary provider plus a warm standby elsewhere — can be rational. The decision tree is simple: list the business requirement first, then map the minimum cloud footprint that satisfies it.

How do you design a multi-cloud architecture for web applications?

Start with workload placement, not provider logos. I classify every component into one of four tiers before drawing architecture diagrams:

  1. Tier 0 — Stateless edge: CDN, WAF, DNS, TLS termination. CloudFront, Cloudflare, or Azure Front Door can front any origin regardless of where the app runs.
  2. Tier 1 — Application compute: Laravel on EC2, App Service, or GKE. Keep this stateless; session data belongs in Redis, not local disk.
  3. Tier 2 — Data stores: MySQL 8.0, PostgreSQL 16/17, Redis 7.x. This is where multi-cloud gets expensive. Avoid active-active databases across providers unless you have a dedicated data team.
  4. Tier 3 — Async and integrations: Queues, webhooks, scheduled jobs, third-party APIs (eSewa, Khalti, Stripe). These tolerate brief cross-cloud latency better than synchronous reads.

Reference pattern for a Laravel production stack

On a production Laravel application I might deploy like this:

  • Primary (AWS): EC2 or ECS Fargate running PHP 8.3/8.4, RDS MySQL 8.0, ElastiCache Redis 7.x, S3 for uploads, SQS for queue workers via Laravel Horizon.
  • Secondary (GCP or Azure): Read-only replica or warm standby with Terraform-managed identical infrastructure. Deploy the same container image or Git artefact both places.
  • Shared services: Cloudflare for DNS and DDoS protection (provider-agnostic), GitLab CI for build pipelines, and a single secrets manager strategy — either HashiCorp Vault or provider-native vaults synced through an external-secrets pattern.

The application code stays identical. Environment-specific values live in .env per cloud, injected at deploy time — never hard-coded provider endpoints in PHP source. I have seen Laravel apps break after a failover because AWS_URL was baked into a config cache from the wrong region. Run php artisan config:clear as part of every failover runbook step.

Infrastructure as code across providers

Do not click-create resources in three consoles. Use Terraform (or OpenTofu) with separate provider blocks and a disciplined state strategy. The guide to managing multi-cloud Terraform state covers remote backends; the short version: one state file per logical stack per environment, stored in a cloud-neutral backend (Terraform Cloud, GitLab-managed state, or S3 with strict locking), never local terraform.tfstate on a laptop.

# main.tf — multi-provider root module (Terraform 1.9+)
terraform {
  required_version = ">= 1.9"
  backend "s3" {
    bucket         = "company-terraform-state"
    key            = "prod/multi-cloud/terraform.tfstate"
    region         = "ap-south-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

provider "aws" {
  region = var.aws_region
}

provider "azurerm" {
  features {}
  subscription_id = var.azure_subscription_id
}

provider "google" {
  project = var.gcp_project_id
  region  = var.gcp_region
}

module "aws_app" {
  source = "./modules/laravel-ec2"
  env    = var.environment
}

module "azure_standby" {
  source = "./modules/laravel-app-service"
  env    = var.environment
}

Pin provider versions explicitly. A silent azurerm major upgrade during terraform plan on a Friday has ended more weekends than I care to count. Commit .terraform.lock.hcl and review provider bumps like application dependency updates.

Workload Placement Decision FlowNew component?Stateless compute?Primary cloudLowest latencyNeeds specificvendor service?Stateful DB?Single primaryDocument rationale · Tag resources · Automate with Terraform
Classify each component by state and latency sensitivity before assigning it to a cloud provider in a multi-cloud design.

Single cloud vs multi-cloud vs hybrid cloud — which fits your team?

Teams debate this in abstract terms. The trade-off is operational surface area versus flexibility. Here is how I compare them for web applications in 2026:

CriteriaSingle cloudMulti-cloudHybrid (on-prem + cloud)
Operational complexityLow — one console, one IAM modelHigh — three IAM models, three billing APIsMedium-high — datacenter plus cloud
Vendor lock-in riskHigher for proprietary services (DynamoDB, Cosmos DB)Lower if you stick to portable primitives (K8s, Postgres, S3-compatible storage)Varies — legacy apps often stuck on-prem
Disaster recoveryMulti-region within one provider (simpler)Cross-provider failover (harder, slower DNS cutover)Depends on link quality and replication
Cost predictabilityEasier with reserved instances / savings plansHarder — egress between clouds adds up fastCapEx for hardware plus cloud OpEx
Best forStartups, SMBs, most Laravel/WooCommerce sitesRegulated industries, enterprise contracts, DR mandatesLegacy ERP, banks, orgs with existing datacenters
Team size floor1 developer with DevOps basics2+ engineers with dedicated infra ownershipIT ops team plus cloud skills

Verdict: default to single cloud with multi-region until a written requirement forces you elsewhere. For most Nepali businesses — law firm portals, eCommerce stores, booking systems — AWS or DigitalOcean in one region with off-site S3 backups and Cloudflare in front covers 95% of resilience needs at a fraction of multi-cloud cost. Multi-cloud earns its keep when the requirement is contractual, not aspirational.

How do you connect AWS, Azure, and GCP in a multi-cloud network?

Public internet between your databases is not a design; it is a incident waiting for a compliance audit. Cross-cloud connectivity falls into three patterns, ordered by complexity:

1. Site-to-site VPN (start here)

Connect AWS VPC to Azure VNet or GCP VPC using IPsec VPN tunnels. Latency adds 2–10 ms depending on region pairs; throughput caps around 1.25 Gbps per tunnel on AWS VGW unless you upgrade to Direct Connect / ExpressRoute. For a Laravel app replicating read traffic or syncing nightly backups, VPN is usually enough. The AWS-to-GCP networking and VPN setup guide walks through tunnel configuration; the same principles apply to Azure with Local Network Gateway resources.

# AWS side — aws_vpn_connection (simplified)
resource "aws_customer_gateway" "peer" {
  bgp_asn    = 65000
  ip_address = var.peer_public_ip
  type       = "ipsec.1"
}

resource "aws_vpn_connection" "to_azure" {
  customer_gateway_id = aws_customer_gateway.peer.id
  type                = "ipsec.1"
  static_routes_only  = true
  vpn_gateway_id      = aws_vpn_gateway.main.id
}

2. Private interconnect (when VPN bandwidth is not enough)

AWS Direct Connect, Azure ExpressRoute, and Google Cloud Interconnect provide dedicated links. Useful for large data replication or real-time analytics pipelines. Cost starts around USD 300–500/month per port before cross-connect fees — roughly Rs 40,000–65,000/month — which is steep for a small SaaS but reasonable for a data-heavy platform.

3. Overlay network with a service mesh or CNI (advanced)

Tools like Cilium Cluster Mesh or Tailscale/WireGuard overlays let pods in GKE talk to pods in EKS without exposing services publicly. This is Kubernetes-native multi-cloud. If you are running plain PHP-FPM on EC2, skip this layer entirely.

DNS is the other half of networking. Use a provider-agnostic DNS service — Cloudflare or Route 53 with health checks — to fail over between origins. Set low TTL (60–300 seconds) on production records you might switch during an incident, but not so low that you amplify query load during normal operation.

Cross-Cloud Networking PatternsAWS VPC10.0.0.0/16EC2 · RDSAzure VNet10.1.0.0/16App ServiceGCP VPC10.2.0.0/16GKE · Cloud SQLVPNVPNCloudflare DNS · Health Checks · FailoverNever expose database ports to 0.0.0.0/0
IPsec VPN tunnels connect cloud VPCs privately; DNS health checks route traffic during failover in multi-cloud setups.

What are the hardest operational problems in multi-cloud architecture?

Multi-cloud fails in operations long before it fails in architecture diagrams. These are the problems I troubleshoot repeatedly:

Identity and access management sprawl

AWS IAM roles, Azure RBAC, GCP service accounts — three permission models, three audit logs. Centralise human access through SSO (Okta, Azure AD, or Google Workspace with SAML) and use short-lived credentials for CI/CD. GitLab CI OIDC to AWS and Azure eliminates long-lived access keys sitting in pipeline variables. I have recovered client repos where an AWS key in a public GitLab fork caused a Rs 200,000+ (~USD 1,500) cryptomining bill over a weekend.

Observability fragmentation

CloudWatch, Azure Monitor, and Google Cloud Logging do not talk to each other. Ship logs and metrics to a neutral backend: Grafana Cloud, Datadog, or a self-hosted stack with Prometheus and Loki. OpenTelemetry instrumentation in your Laravel app — one SDK, multiple exporters — beats bolting on three agent configurations after an outage. Structure logs as JSON with trace_id, cloud, and region fields so you can filter during a partial failover.

Secret management

Never duplicate secrets manually across clouds. Options that work in 2026:

  • HashiCorp Vault with dynamic database credentials
  • AWS Secrets Manager as source of truth with replication to Azure Key Vault via CI sync jobs
  • External Secrets Operator on Kubernetes pulling from one vault into all clusters

Rotate secrets on a schedule. Payment gateway keys (Khalti, eSewa, Stripe) must update in all environments simultaneously — a half-updated rotation breaks callbacks on whichever cloud still holds the old key.

Egress cost surprises

Moving 100 GB/month between AWS and GCP over the public internet costs more than many teams expect. Model egress in your architecture review. Keep data close to compute; replicate summaries, not raw event streams, across clouds unless regulation demands full copies.

How do you run disaster recovery and control costs across multiple clouds?

Disaster recovery (DR) is the most common legitimate reason for multi-cloud. The pattern I recommend for web apps: active-passive, not active-active.

Active-passive DR runbook

  1. Primary region running hot: Full traffic, live database, queue workers processing jobs.
  2. Secondary cloud warm standby: Infrastructure provisioned via Terraform, container images pre-built, database restored from latest cross-cloud backup (or async replica if budget allows).
  3. RPO/RTO targets written down: Recovery Point Objective (how much data you can lose) and Recovery Time Objective (how fast you must recover). A booking portal might target RPO 15 minutes, RTO 60 minutes. A brochure site can tolerate RPO 24 hours.
  4. Automated backups to provider-neutral storage: Nightly MySQL dumps to S3 with cross-region replication, or use the patterns in the cloud backup and disaster recovery strategy guide. Test restores quarterly — an untested backup is wishful thinking.
  5. DNS failover: Health check fails on primary → update DNS to secondary origin → verify payment webhooks still reach the new endpoint (update gateway callback URLs if IP-based).

On sister sites I maintain with Deployer 7 and GitLab CI on shared EC2, the DR story is simpler: same codebase, off-site S3 backups, and a documented restore-to-fresh-VPS procedure. That is single-cloud DR done right, and it outperforms most half-built multi-cloud setups.

Active-Passive Failover Sequence1. Normal ops2. Health checkFAIL3. Restore DB4. DNS cutoverTTL 60sPrimary — AWS ap-south-1Live traffic · RDS primaryOffline after step 2Standby — AzureWarm infra · Restored DBActive after step 4Failover5. Verify webhooks · 6. Notify on-call · 7. Post-incident review
Active-passive multi-cloud DR: detect failure, restore database on standby, cut over DNS, then verify payment webhooks and integrations.

FinOps across providers

Multi-cloud without cost governance bleeds budget silently. Practical controls for 2026:

  • Tag everything: Environment, Team, CostCenter, Cloud on every resource. Untagged resources are invisible in chargeback reports.
  • One dashboard: AWS Cost Explorer, Azure Cost Management, and GCP Billing export feed into a spreadsheet or tool like Kubecost / CloudHealth. Nepali startups should read the AWS and Azure budgeting guide for Nepal startups before committing cross-cloud spend.
  • Right-size standby: DR infrastructure does not need production-grade instances 24/7. Scale down App Service tiers or stop non-essential EC2 instances; Terraform terraform apply promotes instance sizes during failover.
  • Reserved capacity on primary only: Buy one-year reserved instances on the cloud that carries 90% of traffic. Pay on-demand for the cold standby.

A realistic monthly cost picture for a mid-size Laravel SaaS: primary AWS stack USD 400–800 (Rs 53,000–106,000), warm Azure standby USD 80–150 (Rs 10,600–20,000), cross-cloud egress USD 20–100 depending on replication volume, plus USD 50–100 for observability and DNS. That is 30–50% more than single-cloud multi-region — budget for it upfront or do not start.

What should you implement first when adopting multi-cloud?

If you have a written requirement to proceed, ship in this order:

  1. Portable application layer: Dockerise the Laravel app, externalise sessions to Redis, store uploads on S3-compatible object storage, run queue workers as separate processes.
  2. Single IaC pipeline: One Git repo, Terraform modules per cloud, CI plan/apply with approval gates. See deploying the same app to AWS and Azure with Terraform for a concrete starting point.
  3. Backup and restore tested: Before any VPN or failover work, prove you can rebuild from backups in under your RTO target.
  4. Private networking: VPN between VPCs; restrict security groups / NSGs to tunnel CIDRs only.
  5. DNS failover: Health-checked records with documented runbook.
  6. Game days: Quarterly simulated failover during business hours. Measure actual RTO, not the number in the slide deck.

Skip Kubernetes across three clouds until you have a platform team. Plain compute — EC2, App Service, or managed PHP platforms — with identical deploy artefacts is faster to operate for most PHP/Laravel shops.

Build multi-cloud with intent, not by accident

Multi-Cloud Architecture: A Practical Guide is not a mandate to spread workloads everywhere. It is a framework for when business requirements — resilience, compliance, client mandates, or acquisition integration — genuinely outweigh the operational cost of running AWS, Azure, and GCP together. Default to one primary cloud with tested backups and multi-region redundancy; add a second provider only with documented RPO/RTO targets, Terraform-managed infrastructure, private networking, unified observability, and a failover runbook your team has actually executed. That is the difference between multi-cloud as architecture and multi-cloud as expensive technical debt.

If you are planning a multi-cloud migration, DR redesign, or need an honest assessment of whether your Nepal-based business actually needs more than one provider, get in touch for a architecture review. I work through stack choices, cost models in NPR, and deployment automation on production systems — not theoretical diagrams.

Frequently Asked Questions

Multi-cloud architecture means running different workloads across two or more public cloud providers—commonly AWS, Azure, and Google Cloud—instead of putting everything on one platform. You might host your Laravel API on AWS, use Azure for Microsoft 365 integration, and run analytics on GCP. The goal is picking the best service per job, reducing single-vendor dependency, and meeting compliance or regional requirements without treating clouds as interchangeable clones.

Adopt multi-cloud when you have a concrete reason: regulatory data residency, avoiding vendor lock-in on a critical service, or a product that genuinely needs a provider-specific capability. Skip it for a brochure site, small WooCommerce store, or early-stage Laravel app on one VPS. In my experience, most Nepal SMBs and agencies are better served by one well-managed cloud or dedicated server until uptime, compliance, or scale forces a split.

Typically 15–40% more than single cloud due to duplicate networking, cross-cloud egress fees, and extra ops headcount—often Rs 50,000–200,000/month (~USD 370–1,480) above a comparable single-cloud setup for mid-size workloads.

Hybrid cloud combines on-premises or colocated infrastructure with one or more public clouds—common for legacy ERP, local file storage, or regulated data kept in-house while the web tier runs in AWS. Multi-cloud uses multiple public cloud providers without requiring owned hardware. A law-firm portal might stay hybrid if documents remain on a Kathmandu server while the public site sits on EC2. Multi-cloud adds provider diversity but also multiplies billing, IAM, and monitoring surfaces.

AWS plus Azure is the most common pairing when you need enterprise Microsoft integration alongside broad compute and storage. AWS plus GCP suits data-heavy or ML-adjacent workloads. Avoid mixing three hyperscalers unless compliance or acquisition history demands it. For a production Laravel stack I maintain on shared EC2, AWS alone covers web, database, Redis, and S3-style object storage. Add Azure or GCP only when a specific API, region, or managed service justifies the operational overhead.

Operational complexity is the main cost. You inherit separate IAM models, billing consoles, VPC designs, and incident runbooks per provider. Cross-cloud networking adds latency and egress charges that single-cloud architects rarely face. Debugging a payment webhook failure becomes harder when your gateway, app, and logs span two clouds. Teams underestimate the need for platform engineers who understand Terraform or Pulumi, centralized logging, and consistent deployment patterns like the GitLab CI plus Deployer workflows I use on single-region setups.

Lock-in is reduced at the application layer, not by running two clouds blindly. Use portable containers, standard SQL on MySQL 8 or PostgreSQL 16/17, object storage behind the S3 API, and infrastructure-as-code with Terraform 1.x or OpenTofu. Wrap provider-specific services—managed Kafka, proprietary AI APIs—in abstraction layers. On client Laravel projects I prefer boring dependencies: Redis 7, standard queues, and REST APIs. Multi-cloud without portable architecture just trades one lock-in for two bills and twice the ops work.

Terraform or OpenTofu for declarative provisioning across AWS, Azure, and GCP is the baseline. Add a secrets manager—HashiCorp Vault or each cloud’s native equivalent—and centralized observability such as Grafana Cloud, Datadog, or self-hosted Prometheus with Loki. CI/CD should stay provider-agnostic; GitLab CI pipelines that build artefacts and deploy via SSH or Kubernetes work across clouds. For DNS and traffic routing, Cloudflare or AWS Route 53 with health checks beat hand-editing records per provider during incidents.

Treat cross-cloud traffic as expensive and slow by default. Use private interconnects—AWS Direct Connect, Azure ExpressRoute, or GCP Cloud Interconnect—only when sustained high-volume sync justifies cost; otherwise prefer HTTPS APIs over the public internet with mTLS. Avoid stretching a single database cluster across regions and providers; replicate asynchronously instead. Define clear network boundaries: each cloud gets its own VPC/VNet, non-overlapping CIDR blocks, and a documented egress path. Misconfigured peering is a common source of surprise egress bills and asymmetric routing bugs.

Multi-cloud DR works when workloads are truly portable and failover is tested quarterly, not assumed from a diagram. Active-passive is realistic: primary Laravel app on AWS with a warm standby on Azure or a second AWS region, DNS failover via Route 53 or Cloudflare, and database replication with a defined RPO/RTO. Active-active across providers is rare for monolithic PHP apps. For sister sites I deploy with Deployer 7, a second region or provider helps only if deploy scripts, env secrets, and database restore procedures are identical and rehearsed.

Identity fragmentation is the top risk. Each cloud has its own IAM, keys, and audit logs, so a compromised access key in one account may go unnoticed without centralized SIEM. Enforce MFA everywhere, short-lived credentials, and least-privilege roles per environment. Data in transit needs TLS 1.2+ end to end; data at rest needs KMS keys you control and rotate. Compliance teams must map the same GDPR or local data rules across regions. Never copy production .env files between clouds without re-encrypting secrets and re-scoping network ACLs.

Usually no, at least not at launch. A single AWS or DigitalOcean droplet, or local hosting with good backups, covers most Kathmandu agency and eCommerce needs at Rs 3,000–15,000/month (~USD 22–110). Multi-cloud makes sense when you serve international clients requiring EU data residency, need Azure AD for enterprise SSO, or cannot tolerate a single-provider outage. Start single-cloud with Infrastructure as Code habits so a future split is a migration project, not a rewrite. Budget for an engineer who understands deployment, not three cloud sales pitches.

Centralize metrics, logs, and traces in one observability stack rather than logging into three consoles during an outage. OpenTelemetry instrumentation in your Laravel or Node.js 22 LTS services feeds Grafana, Datadog, or New Relic. Tag every resource with environment, service, and cost-center labels consistent across AWS, Azure, and GCP. Alert on SLOs—error rate, queue depth, payment callback latency—not raw CPU. I’ve seen teams miss failures because CloudWatch and Azure Monitor alerts fired in silos while users hit a broken cross-cloud API gateway.

Adopting multi-cloud for resume-driven architecture instead of a business requirement tops the list. Next is underestimating egress fees when syncing large media libraries or database dumps between providers. Running one logical app split across two clouds without latency budgeting breaks session-heavy Laravel apps. Copy-pasting Terraform modules without adapting IAM and networking creates security holes. Skipping a unified backup and restore drill leaves you with redundant storage but no proven recovery. Treat multi-cloud as an ops product with owners, runbooks, and cost reviews—not a one-time migration.

No. Kubernetes helps when you run the same containerized services on EKS, AKS, and GKE and have staff to manage control planes, ingress, and upgrades. Most PHP/Laravel, WordPress, and WooCommerce workloads I ship run fine on VMs, managed app platforms, or single-cluster setups. Use Kubernetes if microservices scale independently and teams already know kubectl, Helm, and pod security policies. For a two-cloud DR standby, a replicated VM image plus Deployer-style releases is often simpler, cheaper, and easier for the next developer to maintain.

Share this article

Quick Contact Options
Choose how you want to connect me: