Azure vs AWS vs GCP: the equivalents, service family by service family
You already know one cloud. This is the map that turns the other two into a rename sheet — and warns you about the places the map lies. One section per service family, with the traps named.
New to cloud? CAMPUX is a free, build-first course. Start here →
Most of what you know carries straight across. An Azure virtual machine is an AWS EC2 instance is a GCP Compute Engine instance; Blob Storage is S3 is Cloud Storage; a virtual network is a VPC is a VPC. Learn the primitive once and you have learned it three times. But three things do not map cleanly — the account and hierarchy model, the identity model, and the networking defaults — and those are exactly where a term-for-term cheat sheet gets you into trouble.
I have run production on all three and taught engineers crossing between them. The first move across always feels like a language wall: a different console, a launch wizard asking the same questions in a different order, three words for one thing. Then you notice most of the wall is synonyms. The useful skill is not memorizing the synonyms — it is knowing the handful of places where the words look like synonyms but the thing underneath is genuinely different. That is what costs people a weekend.
The one-screen translation table
Here is the glossary most comparison articles stretch into three thousand words. Screenshot it, then read past it, because the rows are not equal: some are true synonyms and a few are traps.
| What it is | Azure | AWS | GCP |
|---|---|---|---|
| Billing and quota boundary | Subscription | Account | Project |
| Top of the org tree | Management group | Organization and OUs | Organization and folders |
| Resource container | Resource group | None native — tags and stacks | Project |
| Directory of users | Microsoft Entra ID | IAM Identity Center / IAM users | Cloud Identity |
| Authorization model | Azure RBAC (role at a scope) | IAM policies (JSON on a principal) | Cloud IAM (role binding on a resource) |
| Non-human identity | Managed identity or service principal | IAM role | Service account |
| Virtual machine | Virtual Machine | EC2 instance | Compute Engine instance |
| Managed Kubernetes | AKS | EKS | GKE |
| Functions | Azure Functions | Lambda | Cloud Run functions |
| Private network | Virtual network | VPC | VPC network |
| Object storage | Blob Storage | S3 | Cloud Storage |
| Managed relational database | Azure SQL / Flexible Server | RDS | Cloud SQL |
| Native infrastructure as code | ARM / Bicep | CloudFormation | Infrastructure Manager (Terraform-based) |
| Secrets store | Key Vault | Secrets Manager | Secret Manager |
| Global DNS | Azure DNS | Route 53 | Cloud DNS |
The synonyms are trivia you will stop looking up by week two. The three leaks below are the actual skill.
Accounts and hierarchy: the first leak
Every cheat sheet lines up subscription, account and project in one neat row. That row is the single most misleading line in cloud, because the three are the same on billing and completely different on isolation.
| Trait | Azure subscription | AWS account | GCP project |
|---|---|---|---|
| Primary role | Billing and quota boundary | Billing, quota and strong isolation | Billing and quota boundary |
| Behaves like | A floor, holding resource groups | A whole building with locked doors | A room, holding one app or environment |
| Typical count | A few to a few dozen | Many — often one per team and environment | Many — often one per app and environment |
| Where identity lives | Above it, in the Entra tenant | Inside the account, plus Identity Center | Above it, in the organization |
| Isolation strength | Soft — RBAC does the walls | Hard — the account is the wall | Medium — per-project IAM |
That isolation row is the whole trap. An AWS engineer creates accounts freely because the account is the blast-radius boundary; an Azure engineer who copies that habit ends up with dozens of subscriptions and an administrative mess, because in Azure the isolation is supposed to come from RBAC and policy rather than from the subscription count. Going the other way, an Azure engineer who treats an AWS account like a subscription will put production and development in one account and be surprised how little separates them.
The layer above: management groups, OUs and folders
| Trait | Azure | AWS | GCP |
|---|---|---|---|
| Grouping node | Management group | Organizational unit | Folder |
| What it groups | Subscriptions | Accounts | Projects |
| Guardrail engine | Azure Policy | Service control policies | Org Policy |
| Enforcement model | Deny, audit, and modify or deploy | Deny-only — it caps permissions, never grants | Constraint-based on/off guardrails |
| Bound to | The Entra tenant, kept separate from identity | A single management (payer) account | A verified Cloud Identity domain |
The enforcement row matters more than the names. Azure Policy can do things — deny, but also audit, modify a resource, or deploy a missing one. A service control policy can only take permissions away, never grant them, so an AWS guardrail cannot remediate; it can only forbid. Design accordingly: on Azure you can auto-fix a missing tag, on AWS you can only refuse the deployment that lacks it.
The container that AWS does not have
| Trait | Azure resource group | AWS | GCP project |
|---|---|---|---|
| A real container? | Yes, a first-class object | No native container | Yes — the project is it |
| Resources live inside it? | Yes, in exactly one | No — tags only label them | Yes, usually one app or environment per project |
| Delete it, resources gone? | Yes, it deletes everything in it | No — you delete the stack instead | Yes, it deletes everything in it |
| Cost attribution by | Group, with tags on top | Tags — the only lever | Project, with labels |
This is the leak that hurts people crossing into AWS. There is no box to put an application in, so tagging discipline is not a nice-to-have — it is the only thing standing between you and an untraceable bill. And crossing the other way, a GCP engineer has to notice that a project is doing two jobs at once, acting as both the billing boundary and the resource container, which is why GCP estates end up with far more projects than an Azure estate has subscriptions.
Identity: the biggest lie the cheat sheets tell
They put "IAM" in one row across all three clouds. Underneath that word are three genuinely different machines, and this is the section worth reading twice.
| Trait | Azure | AWS | GCP |
|---|---|---|---|
| Directory — who you are | Microsoft Entra ID, a separate product | Inside IAM and Identity Center | Cloud Identity or Workspace |
| Authorization — what you may do | Azure RBAC, a separate system | IAM, the same service | Cloud IAM, the same service |
| Split between the two? | Two systems, on purpose | One service | One service |
| How you grant access | Assign a named role at a scope | Attach a JSON policy document | Bind a role to a member on a resource |
| Inheritance | Down the scope tree, management group to resource | None inside an account; policies cap across accounts | Down the resource tree, organization to resource |
| Non-human identity | Managed identity or service principal | IAM role, assumed | Service account |
The split in the first three rows is the thing to internalize. On Azure, who you are and what you may do are deliberately two systems: Entra ID authenticates, Azure RBAC authorizes, and you can hold an Entra identity with no Azure permissions at all. On AWS and GCP they are one service. That is why an Azure question about "IAM" is ambiguous until you say which half you mean, and why AWS engineers keep looking for the policy JSON that Azure does not have.
The non-human row is the other one that bites. An AWS engineer reaches for a role and assumes it; an Azure engineer attaches a managed identity to a resource and grants it a role; a GCP engineer creates a service account, which is both an identity and a resource you can grant others access to. Three different mental shapes for the same job.
Networking: same primitives, different defaults
| Concept | Azure | AWS | GCP |
|---|---|---|---|
| Private network | Virtual network | VPC | VPC network |
| Host or resource firewall | Network security group | Security group | VPC firewall rules |
| Subnet-level stateless filter | The security group does both | Network ACL | Firewall rules and hierarchical policies |
| Network-to-network peering | Virtual network peering | VPC peering | VPC network peering |
| Site-to-site to on-premises | VPN Gateway | Site-to-Site VPN | Cloud VPN |
| Private dedicated link | ExpressRoute | Direct Connect | Cloud Interconnect |
Because AWS is the most common origin, here is the crib sheet in that direction specifically, with the thing to watch in each row.
| AWS | Azure | Watch out for |
|---|---|---|
| VPC | Virtual network | Subnets span availability zones, and there is no internet-gateway object to attach |
| Security group plus network ACL | Network security group | One layer instead of two, priority-numbered, and it does both allow and deny |
| Transit Gateway | Hub-and-spoke peering or Virtual WAN | Peering is non-transitive; user-defined routes steer spoke traffic through the hub |
| Interface endpoint | Private endpoint | You wire the private DNS zone and its network links yourself, and forgetting that is the classic outage |
| Route 53 Resolver | Private DNS zones and the DNS Private Resolver | Inbound and outbound endpoints for hybrid resolution |
| NLB and ALB | Load Balancer and Application Gateway | Plus Front Door and Traffic Manager — four products to choose between, not two |
| NAT Gateway | NAT Gateway | Same name, attaches per subnet, and it is now the expected egress pattern |
Virtual machines
| Concept | Azure | AWS EC2 | GCP Compute Engine |
|---|---|---|---|
| The machine | Virtual machine | Instance | Instance |
| The OS template | Image | AMI | Image |
| Attached disk | Managed disk | EBS volume | Persistent disk |
| Sizing unit | VM size, such as D4s v5 | Instance type, such as m7i.large | Machine type, such as n2-standard-4 |
| Auto-scaling group | Virtual machine scale set | Auto Scaling group | Managed instance group |
| Static public address | Public IP | Elastic IP | External IP |
This family is the cleanest mapping of the lot — it really is mostly a rename sheet. The one habit worth carrying carefully is the billing distinction: an Azure VM that is stopped from inside the guest still reserves compute and still bills, and only a deallocated VM stops the compute meter. The equivalent surprise exists on the other clouds in different shapes, so check what "stopped" means before you rely on it to save money.
Managed Kubernetes
| Trait | AKS | EKS | GKE |
|---|---|---|---|
| Control-plane cost | Free, with a paid tier for an SLA | A per-hour fee per cluster | Free tier available; Autopilot bills per pod |
| Node management | Node pools | Node groups, or Fargate | Node pools, or Autopilot |
| Cluster identity | Entra ID | IAM roles for service accounts, or Pod Identity | Google IAM with Workload Identity |
| Serverless node option | Container Instances virtual nodes | Fargate | Autopilot |
| Reputation | Easiest for Microsoft shops | Most flexible, most setup | Most automated |
Kubernetes itself is the portable part; what differs is everything around it — how nodes are managed, how a pod gets a cloud identity, and who pays for the control plane. The identity row is where cross-cloud experience actually transfers least, because each provider solved "let this pod talk to that managed service" in its own way.
Functions
| Concept | Azure Functions | AWS Lambda | Google Cloud |
|---|---|---|---|
| The unit of code | A function inside a function app | A Lambda function | A function, now running on Cloud Run |
| Grouping and deploy unit | The function app holds many functions and the plan | None — each function stands alone | None — each function stands alone |
| Input and output wiring | Bindings, declarative, no SDK glue | Call the SDK inside the function | Call the SDK inside the function |
| Getting an HTTP endpoint | HTTP trigger, built in | API Gateway or a function URL | Direct HTTPS on the function |
| Cold-start mitigation | Premium plan or always-ready instances | Provisioned concurrency | Minimum instances |
Two rows carry the real difference. Bindings are genuinely distinctive to Azure: you declare that a function reads from a queue and writes to a table, and the platform does the plumbing, where the other two have you call an SDK. And the function app is a grouping concept the others lack, which matters for cost and scale because the plan is attached to the app rather than to each function.
On pricing, all three meter roughly the same way — invocations plus resource-seconds, with a free grant — and the numbers move often enough that quoting them here would age badly. Price your own shape in each provider's calculator. For a small project the honest answer is that the bill will be near zero on any of them and the choice should turn on which ecosystem your other services live in.
Object storage
| What it is | Azure | AWS | GCP |
|---|---|---|---|
| The container for objects | Container | Bucket | Bucket |
| The stored file | Blob | Object | Object |
| Wrapper above the container | Storage account | None — the bucket is top-level | None — the bucket is top-level |
| Temporary access link | Shared access signature | Presigned URL | Signed URL |
| Hot tier | Hot | S3 Standard | Standard |
The storage account is the leak here. On AWS and GCP a bucket is a top-level thing you create directly; on Azure the container lives inside a storage account, and the account is where redundancy, network rules, firewall settings and the endpoint name are configured. Engineers arriving from S3 routinely miss that a decision they think they are making per bucket is actually made once per account.
Infrastructure as code
| Concept | Azure | AWS | GCP |
|---|---|---|---|
| Template language | ARM JSON, or Bicep | CloudFormation JSON or YAML | Terraform, via Infrastructure Manager |
| The deployed unit | A deployment into a scope | A stack, or stack sets across accounts | A deployment |
| Higher-level authoring | Bicep, which compiles to ARM | CDK, which synthesizes to CloudFormation | Terraform modules |
| Preview before apply | What-if | Change sets | Terraform plan |
| Momentum | Actively invested in | Actively invested in | Consolidated onto Terraform |
Almost every cross-cloud comparison still lists Deployment Manager as Google's native infrastructure-as-code tool. It is deprecated: Google discontinued support on 1 April 2026, blocked new users from enabling the API on 30 June 2026, and points existing users at Infrastructure Manager, which is a managed environment for running Terraform rather than a bespoke template language. The practical effect is that the third column is now Terraform, which makes cross-cloud infrastructure-as-code skills more portable than they used to be. If a guide tells you to learn Deployment Manager, it was written before this year.
So which do you learn?
One, deeply, and then the others are a translation exercise rather than a new subject. The tables above are the whole reason: the primitives are the same and only the vocabulary and a few structural decisions differ. Learn what a private network, an identity, a role assignment, an object store and a deployment template are, and the second cloud costs you a fortnight rather than a year.
If you have no reason to prefer one, the volume of enterprise postings that name a cloud leans Microsoft, and Azure slots into the identity most companies already run. But the honest answer is to learn whichever your target employers run, because depth in the one they use beats a shallow tour of all three every time.
Questions people also ask
What is the AWS equivalent of an Azure subscription?
An AWS account, on billing and quota — but the two behave differently in practice. An AWS account is also the strong isolation boundary, which is why AWS estates have many accounts, while Azure expects isolation to come from RBAC and policy inside a smaller number of subscriptions. Copying the AWS habit into Azure produces an administrative mess, and copying the Azure habit into AWS produces production and development sharing a wall that is not there.
What is the Azure equivalent of a VPC?
A virtual network. The primitives map closely — subnets, route tables, peering, VPN and a dedicated private link all have direct counterparts. The differences to watch are that Azure subnets span availability zones, that there is no internet-gateway object, that the network security group does the job of both a security group and a network ACL with priority-numbered allow and deny rules, and that peering is non-transitive so hub-and-spoke needs user-defined routes.
Is IAM the same on Azure, AWS and GCP?
No, and this is the biggest thing the cheat sheets get wrong. Azure deliberately splits identity from authorization: Entra ID says who you are and Azure RBAC says what you may do, as two systems. AWS and GCP combine both in one service. Azure grants access by assigning a named role at a scope, AWS by attaching a JSON policy to a principal, and GCP by binding a role to a member on a resource.
Does AWS have resource groups like Azure?
Not as a real container. Azure resource groups and GCP projects are first-class objects that resources live inside and that delete their contents when removed. AWS has no equivalent box, so grouping is done with tags and deployment stacks. That makes tagging discipline mandatory rather than optional on AWS, because tags are the only lever for both access conditions and cost attribution.
What is the GCP equivalent of CloudFormation?
Infrastructure Manager, which runs Terraform as a managed service. The older answer, Deployment Manager, is deprecated: support was discontinued on 1 April 2026 and new users were blocked from enabling it on 30 June 2026. Any comparison still naming Deployment Manager as the native tool predates that change.
What is the difference between Azure Functions and AWS Lambda?
Mostly grouping and wiring. Azure Functions live inside a function app that holds several functions and carries the hosting plan, while each Lambda stands alone. Azure also has bindings, which declare inputs and outputs so the platform handles the plumbing, where Lambda has you call the SDK in your code. Both meter invocations and resource-seconds with a free grant, so for a small project the bill is near zero either way and ecosystem fit should decide it.
Which is easier, AKS, EKS or GKE?
GKE is generally the most automated, AKS the most straightforward for Microsoft-centric teams, and EKS the most flexible with the most setup. Kubernetes itself is the portable part; what differs is node management, who pays for the control plane, and how a pod gets a cloud identity — and that last one is where cross-cloud experience transfers least, because each provider solved it differently.
Should I learn Azure, AWS or GCP first?
Whichever your target employers run, and then only one until you are deep. The primitives are shared, so the second cloud is a translation exercise measured in weeks rather than a new subject. If you have no signal either way, enterprise postings that name a cloud lean Microsoft and Azure fits the identity stack most companies already run.