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.
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
| Feature | AWS | GCP | Azure |
|---|---|---|---|
| Service name | EC2 | Compute Engine | Virtual Machines |
| Instance families | 750+ types | 100+ types | 700+ types |
| Custom machine types | No (fixed sizes) | Yes (custom vCPU/RAM) | Limited (constrained families) |
| Spot/preemptible | Spot Instances (up to 90% off) | Spot VMs (up to 91% off) | Spot VMs (up to 90% off) |
| Sustained use discount | No (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
| Feature | AWS S3 | GCP Cloud Storage | Azure Blob Storage |
|---|---|---|---|
| Storage classes | 7 (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) | Hours | Hours |
| Lifecycle policies | Yes | Yes | Yes |
| Versioning | Yes | Yes | Yes |
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
| Feature | AWS RDS / Aurora | GCP Cloud SQL / AlloyDB | Azure SQL Database |
|---|---|---|---|
| Managed engines | MySQL, PostgreSQL, MariaDB, Oracle, SQL Server | MySQL, PostgreSQL | SQL Server, MySQL, PostgreSQL |
| Serverless option | Aurora Serverless v2 | AlloyDB Serverless | Azure SQL Serverless |
| Max storage | 128 TB (Aurora) | 64 TB (AlloyDB) | 100 TB (Hyperscale) |
| Read replicas | Up 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
| Feature | AWS EKS | GCP GKE | Azure AKS |
|---|---|---|---|
| Control plane cost | $0.10/hour (~$73/month) | Free (Standard), $0.10/hour (Enterprise) | Free (Standard) |
| Auto-upgrade | Optional | Default | Optional |
| Autopilot mode | No | Yes (GKE Autopilot) | No |
| Node auto-provisioning | Karpenter | GKE NAP | Karpenter (preview) |
| Max nodes per cluster | 5,000 | 15,000 | 5,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
| Feature | AWS Lambda | GCP Cloud Functions | Azure Functions |
|---|---|---|---|
| Max execution time | 15 minutes | 60 minutes (2nd gen) | 10 minutes (Consumption), unlimited (Premium) |
| Languages | Node, Python, Java, Go, .NET, Ruby, custom | Node, Python, Java, Go, .NET, Ruby, PHP | Node, Python, Java, C#, PowerShell, custom |
| Concurrency control | Reserved concurrency | Max instances | Max instances |
| Cold start mitigation | Provisioned concurrency | Min instances | Pre-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.
Related articles
- AWS What Is AWS? A Practical Introduction
A no-fluff introduction to Amazon Web Services — the mental model of compute, storage, database, and networking, regions and AZs, the free tier, and an IAM-first mindset.
- AWS AWS CDK: Infrastructure in TypeScript Getting Started
Get started with AWS CDK using TypeScript. Define cloud infrastructure with constructs, stacks, and deploy real AWS resources with familiar programming patterns.
- AWS AWS CloudFormation: Infrastructure as Code Guide
Learn AWS CloudFormation from scratch. Build, update, and manage AWS infrastructure with YAML templates, parameters, outputs, and nested stacks.
- AWS AWS Cost Optimization: 10 Ways to Reduce Your Bill
Cut your AWS bill with 10 proven cost optimization strategies covering Reserved Instances, right-sizing, S3 tiers, spot instances, and more.