Skip to content
Codeloom
AWS

AWS vs GCP vs Azure: Cloud Providers Compared

A practical comparison of AWS, Google Cloud, and Microsoft Azure covering compute, storage, pricing, Kubernetes, serverless, and when to choose each provider.

·11 min read · By Codeloom
Intermediate 14 min read

What you'll learn

  • How compute, storage, and database services compare across providers
  • Pricing models and cost optimization strategies for each platform
  • Kubernetes and serverless differences between AWS, GCP, and Azure
  • Decision framework for choosing the right cloud provider

Prerequisites

  • Basic understanding of cloud computing concepts
  • Familiarity with at least one cloud provider

The Big Three in Context

Amazon Web Services, Google Cloud Platform, and Microsoft Azure dominate the public cloud market. AWS launched in 2006 and has the largest market share and the broadest service catalog. Azure followed in 2010 and benefits from deep integration with the Microsoft ecosystem. GCP entered in 2011 and brings Google’s expertise in data analytics, machine learning, and Kubernetes.

Each provider offers hundreds of services, but most workloads rely on a core set: compute, storage, databases, networking, containers, and serverless. This comparison focuses on those core services and the practical differences that affect your architecture decisions.

Compute Services

Virtual Machines

FeatureAWSGCPAzure
Service nameEC2Compute EngineVirtual Machines
Instance families750+ types100+ types700+ types
Custom machine typesNo (fixed sizes)Yes (custom vCPU/RAM)Limited (constrained families)
Spot/preemptibleSpot Instances (up to 90% off)Spot VMs (up to 91% off)Spot VMs (up to 90% off)
Sustained use discountNo (use Savings Plans)Yes (automatic)No (use Reservations)

GCP stands out with custom machine types. Instead of choosing from predefined sizes, you specify exactly how many vCPUs and how much RAM you need. This eliminates paying for resources you do not use.

# GCP: Create a custom machine with 6 vCPUs and 24 GB RAM
gcloud compute instances create my-vm \
    --custom-cpu=6 \
    --custom-memory=24GB \
    --zone=us-central1-a

AWS and Azure rely on predefined instance families. AWS has the broadest selection, covering specialized workloads like high-memory SAP instances, GPU clusters, and ARM-based Graviton processors:

# AWS: Launch a Graviton-based instance
aws ec2 run-instances \
    --instance-type m7g.xlarge \
    --image-id ami-0abcdef1234567890

Auto Scaling

All three providers offer auto scaling, but the implementations differ:

  • AWS Auto Scaling Groups are the most mature, with predictive scaling that uses ML to anticipate demand.
  • GCP Managed Instance Groups support autoscaling with per-instance health checks.
  • Azure VM Scale Sets integrate tightly with Azure Load Balancer and Application Gateway.

Storage Services

Object Storage

FeatureAWS S3GCP Cloud StorageAzure Blob Storage
Storage classes7 (Standard, IA, Glacier, etc.)4 (Standard, Nearline, Coldline, Archive)4 (Hot, Cool, Cold, Archive)
Min storage duration (archive)180 days (Glacier Deep)365 days (Archive)180 days (Archive)
Retrieval time (archive)12 hours (Deep Archive)HoursHours
Lifecycle policiesYesYesYes
VersioningYesYesYes

AWS S3 has the most granular storage classes. GCP Cloud Storage applies automatic discounts for sustained access patterns. Azure Blob Storage integrates well with Active Directory for access control.

# AWS: Upload with intelligent tiering
aws s3 cp large-file.zip s3://my-bucket/ \
    --storage-class INTELLIGENT_TIERING

# GCP: Upload to a nearline bucket
gsutil cp large-file.zip gs://my-bucket/

# Azure: Upload to cool tier
az storage blob upload \
    --account-name mystorage \
    --container-name mycontainer \
    --name large-file.zip \
    --file large-file.zip \
    --tier Cool

Block Storage

  • AWS EBS offers gp3 (general purpose), io2 (provisioned IOPS), and st1/sc1 (throughput/cold HDD).
  • GCP Persistent Disks offer standard, balanced, SSD, and extreme options. They can be attached to multiple VMs in read-only mode.
  • Azure Managed Disks offer Standard HDD, Standard SSD, Premium SSD, and Ultra Disk.

GCP persistent disks automatically replicate across zones within a region, while AWS EBS volumes are confined to a single availability zone.

Database Services

Relational Databases

FeatureAWS RDS / AuroraGCP Cloud SQL / AlloyDBAzure SQL Database
Managed enginesMySQL, PostgreSQL, MariaDB, Oracle, SQL ServerMySQL, PostgreSQLSQL Server, MySQL, PostgreSQL
Serverless optionAurora Serverless v2AlloyDB ServerlessAzure SQL Serverless
Max storage128 TB (Aurora)64 TB (AlloyDB)100 TB (Hyperscale)
Read replicasUp to 15 (Aurora)Up to 20 (Cloud SQL)Up to 4 (Hyperscale: unlimited)

AWS Aurora is a standout service. It is MySQL- and PostgreSQL-compatible but offers 5x the throughput of standard MySQL and 3x the throughput of standard PostgreSQL, with storage that automatically grows.

GCP’s AlloyDB is a newer PostgreSQL-compatible service that uses a columnar engine for analytical queries alongside transactional workloads.

Azure SQL Database offers the deepest SQL Server integration and a unique Hyperscale tier for very large databases.

NoSQL Databases

  • AWS DynamoDB - Key-value and document store with single-digit millisecond performance. On-demand and provisioned capacity modes.
  • GCP Bigtable - Wide-column store designed for massive analytical and operational workloads. Firestore for document databases.
  • Azure Cosmos DB - Multi-model database supporting document, key-value, graph, and column-family. Offers five consistency levels from strong to eventual.

Cosmos DB is unique in offering tunable consistency. You can choose exactly where you fall on the consistency-latency spectrum, which none of the other providers match.

Kubernetes

FeatureAWS EKSGCP GKEAzure AKS
Control plane cost$0.10/hour (~$73/month)Free (Standard), $0.10/hour (Enterprise)Free (Standard)
Auto-upgradeOptionalDefaultOptional
Autopilot modeNoYes (GKE Autopilot)No
Node auto-provisioningKarpenterGKE NAPKarpenter (preview)
Max nodes per cluster5,00015,0005,000

GCP GKE is widely considered the best managed Kubernetes service. This makes sense since Google invented Kubernetes. GKE Autopilot manages nodes entirely, so you only define pods and Google handles the infrastructure:

# GKE Autopilot - you only write this, no node management
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
        - name: web
          image: gcr.io/my-project/web-app:latest
          resources:
            requests:
              cpu: "500m"
              memory: "512Mi"

AWS EKS requires more setup but integrates deeply with AWS services like IAM, ALB, and CloudWatch. Azure AKS offers free control planes and strong integration with Azure Active Directory.

Serverless

Functions as a Service

FeatureAWS LambdaGCP Cloud FunctionsAzure Functions
Max execution time15 minutes60 minutes (2nd gen)10 minutes (Consumption), unlimited (Premium)
LanguagesNode, Python, Java, Go, .NET, Ruby, customNode, Python, Java, Go, .NET, Ruby, PHPNode, Python, Java, C#, PowerShell, custom
Concurrency controlReserved concurrencyMax instancesMax instances
Cold start mitigationProvisioned concurrencyMin instancesPre-warmed instances

AWS Lambda has the broadest ecosystem of event sources (over 200 AWS service integrations). GCP Cloud Functions 2nd gen runs on Cloud Run under the hood, giving you longer execution times. Azure Functions offers the most flexible hosting options including a dedicated plan with no timeout.

# AWS Lambda handler
import json

def handler(event, context):
    name = event.get('queryStringParameters', {}).get('name', 'World')
    return {
        'statusCode': 200,
        'body': json.dumps({'message': f'Hello, {name}!'})
    }
# GCP Cloud Function
import functions_framework

@functions_framework.http
def hello(request):
    name = request.args.get('name', 'World')
    return f'Hello, {name}!'

Container Serverless

  • AWS Fargate - Run containers without managing servers. Works with both ECS and EKS.
  • GCP Cloud Run - Run containers with automatic scaling to zero. Supports any language or binary.
  • Azure Container Apps - Kubernetes-based but fully managed. Built on Dapr and KEDA.

Cloud Run is notable for its simplicity. You give it a container image and it handles everything else, scaling to zero when idle:

gcloud run deploy my-service \
    --image gcr.io/my-project/my-app:latest \
    --region us-central1 \
    --allow-unauthenticated

Pricing Comparison

Direct pricing comparisons are difficult because configurations vary, but here are general observations:

Compute: GCP is often cheapest for sustained workloads due to automatic sustained-use discounts (up to 30% off for running an instance all month). AWS Graviton instances offer the best price-performance ratio. Azure is competitive if you have Enterprise Agreements.

Storage: S3 and GCS are similarly priced for standard storage (around $0.023/GB/month in US regions). Azure Blob is comparable. Egress costs are where prices diverge.

Egress: All three charge for data leaving their network. GCP is the cheapest for egress, especially with their premium network tier discounts. AWS is the most expensive. All three offer free ingress.

Commitment discounts:

  • AWS: Savings Plans (1 or 3 year, up to 72% off) and Reserved Instances.
  • GCP: Committed Use Discounts (1 or 3 year, up to 57% off) plus automatic sustained-use discounts.
  • Azure: Reserved VM Instances (1 or 3 year, up to 72% off) and Azure Hybrid Benefit for Windows/SQL Server licenses.

Free tiers:

  • AWS: 12-month free tier plus always-free services (Lambda, DynamoDB, etc.).
  • GCP: $300 in credits for 90 days plus always-free tier.
  • Azure: $200 in credits for 30 days plus 12-month free services plus always-free services.

Networking

Global network: GCP runs on Google’s private global fiber network, which offers lower latency for cross-region traffic. AWS and Azure use a mix of private backbone and public internet depending on the service tier.

Load balancing: GCP has a single global load balancer that distributes traffic across regions with a single anycast IP. AWS and Azure require separate load balancers per region (AWS Global Accelerator provides a similar capability but as a separate service).

VPC peering: All three support VPC/VNet peering. GCP VPC is global by default (subnets span regions), while AWS and Azure VPCs are regional.

When to Choose Each Provider

Choose AWS When

  • You need the broadest selection of managed services.
  • Your team already has AWS expertise.
  • You are building on services with no equivalent elsewhere (Aurora, DynamoDB, Step Functions).
  • You need the most mature marketplace of third-party integrations.
  • You want Graviton (ARM) instances for cost-optimized compute.

Choose GCP When

  • Kubernetes is central to your architecture (GKE is the strongest managed Kubernetes).
  • You are doing large-scale data analytics or ML (BigQuery, Vertex AI).
  • You want the simplest serverless container experience (Cloud Run).
  • You need a strong global network with low cross-region latency.
  • You prefer automatic cost optimizations (sustained-use discounts, custom machine types).

Choose Azure When

  • Your organization uses Microsoft 365, Active Directory, or Windows Server extensively.
  • You have existing Microsoft enterprise agreements or licenses (Azure Hybrid Benefit).
  • You are running .NET workloads or SQL Server.
  • You need hybrid cloud with on-premises integration (Azure Arc, Azure Stack).
  • Compliance requirements favor Microsoft’s government and healthcare certifications.

Multi-Cloud Considerations

Many organizations use multiple providers. Common patterns include:

  • Primary + DR: Run production on one provider and disaster recovery on another.
  • Best-of-breed: Use GCP for data analytics, AWS for core infrastructure, and Azure for identity.
  • Vendor leverage: Avoid lock-in by abstracting provider-specific services behind interfaces.

Tools like Terraform, Pulumi, and Crossplane help manage multi-cloud infrastructure with a single workflow:

# Terraform: same workflow, different providers
provider "aws" {
  region = "us-east-1"
}

provider "google" {
  project = "my-gcp-project"
  region  = "us-central1"
}

resource "aws_s3_bucket" "primary" {
  bucket = "my-primary-data"
}

resource "google_storage_bucket" "backup" {
  name     = "my-backup-data"
  location = "US"
}

The tradeoff is complexity. Multi-cloud requires expertise across providers, increases networking costs for cross-cloud traffic, and limits your ability to use provider-specific managed services.

Wrapping Up

AWS leads in breadth of services and market maturity. GCP leads in Kubernetes, data analytics, and developer experience. Azure leads in enterprise Microsoft integration and hybrid cloud. The right choice depends on your team’s expertise, existing technology investments, and workload requirements. Start with the provider that best matches your primary workload, and expand to others only when a specific service justifies the added complexity.