Cloud Services Cheat Sheet — AWS vs Azure vs GCP vs DigitalOcean

6 min read

When you work across providers — or help someone migrate — the biggest mental overhead is translating primitives. This is my personal reference for that translation, plus the Terraform modules I reach for most often.


Compute

ConceptAWSAzureGCPDigitalOcean
Virtual machineEC2Virtual MachineCompute Engine (GCE)Droplet
VM imageAMIManaged Image / GalleryCustom ImageSnapshot
GPU instanceEC2 P/G/Inf seriesNC/ND/NV seriesA100/T4/L4 VMsGPU Droplets
Spot / preemptibleEC2 SpotAzure Spot VMSpot VM
Bare metalEC2 Bare MetalAzure Bare MetalBare Metal Solution
VM scale setAuto Scaling GroupVMSSMIG (Managed Instance Group)

Terraform modules

# AWS — community module for an ASG-backed fleet
module "ec2" {
  source  = "terraform-aws-modules/ec2-instance/aws"
  version = "~> 5.0"
}
 
module "autoscaling" {
  source  = "terraform-aws-modules/autoscaling/aws"
  version = "~> 7.0"
}
 
# Azure
module "linux_virtual_machine" {
  source  = "Azure/virtual-machine/azurerm"
  version = "~> 1.0"
}
 
# GCP
module "compute_instance" {
  source  = "terraform-google-modules/vm/google//modules/compute_instance"
  version = "~> 11.0"
}
 
# DigitalOcean
resource "digitalocean_droplet" "web" {}   # first-party resource, no module needed

Containers & Kubernetes

ConceptAWSAzureGCPDigitalOcean
Managed KubernetesEKSAKSGKEDOKS
Serverless containersFargateContainer Apps / ACICloud RunApp Platform
Container registryECRACRArtifact RegistryContainer Registry
Helm / app catalogMarketplace 1-click

Terraform modules

# AWS EKS
module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~> 20.0"
}
 
# Azure AKS
module "aks" {
  source  = "Azure/aks/azurerm"
  version = "~> 8.0"
}
 
# GCP GKE
module "gke" {
  source  = "terraform-google-modules/kubernetes-engine/google"
  version = "~> 33.0"
}
 
# DigitalOcean DOKS
resource "digitalocean_kubernetes_cluster" "primary" {}

Serverless / Functions

ConceptAWSAzureGCPDigitalOcean
Functions-as-a-ServiceLambdaAzure FunctionsCloud Functions / Cloud Run FunctionsFunctions
Event-driven triggersEventBridge / SNS / SQSEvent Grid / Service BusEventarc / Pub/Sub
API gatewayAPI Gateway / ALBAPI ManagementCloud Endpoints / API Gateway

Terraform modules

# AWS Lambda
module "lambda_function" {
  source  = "terraform-aws-modules/lambda/aws"
  version = "~> 7.0"
}
 
module "apigateway_v2" {
  source  = "terraform-aws-modules/apigateway-v2/aws"
  version = "~> 5.0"
}
 
# Azure Functions — use azurerm provider resources directly
resource "azurerm_linux_function_app" "fn" {}
 
# GCP Cloud Functions
resource "google_cloudfunctions2_function" "fn" {}

Object Storage

ConceptAWSAzureGCPDigitalOcean
Object / blob storeS3Blob Storage (ADLS Gen2)Cloud Storage (GCS)Spaces
Static website hostingS3 + CloudFrontStatic Website on BlobCloud Storage + LBSpaces CDN
Lifecycle policiesS3 LifecycleBlob LifecycleObject Lifecycle
Storage classesStandard / IA / GlacierHot / Cool / ArchiveStandard / Nearline / Coldline / ArchiveStandard

Terraform modules

# AWS S3
module "s3_bucket" {
  source  = "terraform-aws-modules/s3-bucket/aws"
  version = "~> 4.0"
}
 
# Azure — provider resource
resource "azurerm_storage_account" "sa" {}
resource "azurerm_storage_container" "blob" {}
 
# GCP
module "gcs_buckets" {
  source  = "terraform-google-modules/cloud-storage/google"
  version = "~> 6.0"
}
 
# DigitalOcean
resource "digitalocean_spaces_bucket" "assets" {}

Block Storage

ConceptAWSAzureGCPDigitalOcean
Block volumeEBSManaged DiskPersistent DiskBlock Storage Volume
High-perf NVMeio2 Block ExpressUltra DiskExtreme PD
SnapshotEBS SnapshotDisk SnapshotDisk SnapshotVolume Snapshot

Terraform

# AWS
resource "aws_ebs_volume" "data" {}
 
# Azure
resource "azurerm_managed_disk" "data" {}
 
# GCP
resource "google_compute_disk" "data" {}
 
# DigitalOcean
resource "digitalocean_volume" "data" {}

File / Shared Storage

ConceptAWSAzureGCPDigitalOcean
NFS-compatibleEFSAzure Files (NFS)Filestore
SMB / CIFSFSx for WindowsAzure Files (SMB)
HPC / parallel FSFSx for LustreAzure HPC CacheParallelstore

Relational Databases

ConceptAWSAzureGCPDigitalOcean
Managed MySQLRDS MySQL / Aurora MySQLAzure Database for MySQLCloud SQL MySQLManaged MySQL
Managed PostgreSQLRDS PostgreSQL / Aurora PostgreSQLAzure Database for PostgreSQLCloud SQL PostgreSQL / AlloyDBManaged PostgreSQL
Managed SQL ServerRDS SQL Server / RDS CustomAzure SQL Database
Serverless RDBMSAurora Serverless v2Azure SQL Serverless

Terraform modules

# AWS RDS
module "db" {
  source  = "terraform-aws-modules/rds/aws"
  version = "~> 6.0"
}
 
module "aurora" {
  source  = "terraform-aws-modules/rds-aurora/aws"
  version = "~> 9.0"
}
 
# Azure
resource "azurerm_postgresql_flexible_server" "db" {}
 
# GCP
module "sql_db" {
  source  = "GoogleCloudPlatform/sql-db/google"
  version = "~> 21.0"
}
 
# DigitalOcean
resource "digitalocean_database_cluster" "pg" {
  engine = "pg"
}

NoSQL / Document / Wide-Column

ConceptAWSAzureGCPDigitalOcean
Key-value / documentDynamoDBCosmos DBFirestore / Datastore
Wide-columnDynamoDB (single-table)Cosmos DB (Cassandra API)Bigtable
In-memory cacheElastiCache (Redis/Memcached)Azure Cache for RedisMemorystoreManaged Redis
SearchOpenSearch ServiceAzure AI SearchVertex AI Search

Terraform modules

# AWS DynamoDB
module "dynamodb_table" {
  source  = "terraform-aws-modules/dynamodb-table/aws"
  version = "~> 4.0"
}
 
# AWS ElastiCache
module "elasticache" {
  source  = "terraform-aws-modules/elasticache/aws"
  version = "~> 1.0"
}
 
# GCP Bigtable
resource "google_bigtable_instance" "bt" {}
 
# GCP Memorystore
resource "google_redis_instance" "cache" {}

Networking

ConceptAWSAzureGCPDigitalOcean
Virtual networkVPCVNetVPCVPC
SubnetSubnetSubnetSubnet
Load balancer (L4)NLBAzure Load BalancerNetwork LBLoad Balancer
Load balancer (L7 / HTTP)ALBApplication GatewayCloud LB (global)Load Balancer
CDNCloudFrontAzure CDN / Front DoorCloud CDNSpaces CDN
DNSRoute 53Azure DNSCloud DNSDNS
Private connectivityVPC Peering / Transit GatewayVNet Peering / vWANVPC Peering / Cloud InterconnectVPC Peering
VPNAWS VPNVPN GatewayCloud VPN
Firewall (L3/L4)Security Group / NACLNSGVPC Firewall RulesCloud Firewall
WAFWAF (CloudFront/ALB)Azure WAFCloud Armor

Terraform modules

# AWS VPC
module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "~> 5.0"
}
 
# AWS ALB
module "alb" {
  source  = "terraform-aws-modules/alb/aws"
  version = "~> 9.0"
}
 
# AWS Security Group
module "security_group" {
  source  = "terraform-aws-modules/security-group/aws"
  version = "~> 5.0"
}
 
# Azure VNet
module "network" {
  source  = "Azure/network/azurerm"
  version = "~> 5.0"
}
 
# GCP network
module "network" {
  source  = "terraform-google-modules/network/google"
  version = "~> 9.0"
}
 
# DigitalOcean VPC
resource "digitalocean_vpc" "primary" {}

Identity & Access

ConceptAWSAzureGCPDigitalOcean
IAM serviceIAMEntra ID (AAD) + RBACIAM
VM identityIAM Role on instance profileManaged IdentityService Account
Secrets managerSecrets Manager / Parameter StoreKey VaultSecret Manager
Certificate managerACMKey Vault CertificatesCertificate Manager

Terraform modules

# AWS IAM
module "iam_role" {
  source  = "terraform-aws-modules/iam/aws//modules/iam-assumable-role"
  version = "~> 5.0"
}
 
# AWS Secrets Manager
resource "aws_secretsmanager_secret" "app" {}
 
# GCP Secret Manager
resource "google_secret_manager_secret" "app" {}
 
# Azure Key Vault
resource "azurerm_key_vault" "kv" {}

Monitoring & Observability

ConceptAWSAzureGCPDigitalOcean
MetricsCloudWatch MetricsAzure Monitor MetricsCloud MonitoringMonitoring (hosted Grafana)
LogsCloudWatch LogsLog Analytics WorkspaceCloud Logging
TracesX-RayApplication InsightsCloud Trace
DashboardsCloudWatch DashboardsAzure WorkbooksCloud Monitoring DashboardsGrafana
AlertsCloudWatch AlarmsAzure Monitor AlertsCloud AlertingAlerts

CI/CD & Developer Tools

ConceptAWSAzureGCPDigitalOcean
Managed CI/CDCodePipeline + CodeBuildAzure DevOps / GitHub ActionsCloud BuildApp Platform CI
Artifact storeCodeArtifactAzure ArtifactsArtifact RegistryContainer Registry
IaC state backendS3 + DynamoDB (lock)Azure Blob (lock via lease)GCS (lock via object)Spaces

Terraform remote state snippets

# AWS
terraform {
  backend "s3" {
    bucket         = "my-tfstate"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-lock"
    encrypt        = true
  }
}
 
# Azure
terraform {
  backend "azurerm" {
    resource_group_name  = "tfstate-rg"
    storage_account_name = "tfstateacct"
    container_name       = "tfstate"
    key                  = "prod.terraform.tfstate"
  }
}
 
# GCP
terraform {
  backend "gcs" {
    bucket = "my-tfstate-bucket"
    prefix = "prod"
  }
}

Pricing Model Quick-Reference

DimensionAWSAzureGCPDigitalOcean
Commit discountReserved Instances / Savings PlansReserved VM / Savings PlanCommitted Use Discounts
Sustained use auto-discountYes (GCE VMs)
Free tier12-month + Always Free12-month + Always Free90-day $300 credit + Always Free$200 credit (60 days)
Billing granularityPer-second (most services)Per-minute or per-secondPer-secondPer-hour (Droplets)

My Go-To Terraform Module Sources

SourceBest for
terraform-aws-modulesAWS — most complete, battle-tested community modules
AzureAzure — official Microsoft modules
terraform-google-modulesGCP — Google-maintained modules
digitalocean/digitaloceanDO — first-party provider, use resources directly
cloudposseOpinionated, composable modules across AWS

This will stay a living doc — I’ll add messaging queues, AI/ML services, and managed Kafka equivalents once I’ve done enough cross-provider work to have opinions worth sharing.