Azure Blob Storage vs Amazon S3 vs Google Cloud Storage
Object storage is the cleanest mapping in the whole cross-cloud table — the same bucket-of-files idea wearing three names. Then Azure slips an extra layer underneath it, and that's the part worth reading.
New to cloud? CAMPUX is a free, build-first course. Start here →
Azure Blob Storage, Amazon S3, and Google Cloud Storage are the same service: cheap, durable object storage where you drop unstructured files, address them by name over HTTPS, and pay pennies to keep them. The concepts map almost perfectly — tiers, lifecycle rules, signed URLs, static hosting, all three have them. The one real difference is structural: on AWS and GCP a bucket is a top-level thing you create directly, while Azure makes you stand up a storage account first and puts containers inside it. That extra layer is the whole gotcha.
If you already know S3, this is the easiest cloud you'll ever cross into. Object storage is the workhorse behind backups, static websites, data lakes, media libraries, and log archives on every cloud, and it works the same way everywhere: unlimited flat storage, no filesystem to manage, an object addressed by a key, served over HTTP. Ninety percent of what you know carries straight over. It's the last ten percent — Azure's storage account — that this note is really about, because it's the single thing that trips up S3 people on their first Azure day.
What all three actually are
Same primitive on every cloud: a place to put a blob (a "binary large object" — really just a file) and get it back by name. You don't mount it like a disk and you don't query it like a database. You PUT an object with a key, you GET it by that key, and the platform handles durability by copying it across hardware behind the scenes. It scales to effectively unlimited size, costs very little per gigabyte, and charges you separately for storage, requests, and egress. That description fits Blob Storage, S3, and Cloud Storage without changing a word.
The terminology, side by side
Three vocabularies for one design. The only row that isn't a clean synonym is the container, and only because of what sits above it on Azure — more on that in a minute.
| What it is | Azure | AWS | GCP |
|---|---|---|---|
| The service | Blob Storage | S3 (Simple Storage Service) | Cloud Storage |
| The container for objects | Container | Bucket | Bucket |
| The stored file | Blob | Object | Object |
| Wrapper above the container | Storage account | (none — bucket is top-level) | (none — bucket is top-level) |
| Accessed via | Storage account endpoint (<acct>.blob.core.windows.net) | S3 endpoint (<bucket>.s3.amazonaws.com) | storage.googleapis.com |
| Temporary access link | SAS token | Presigned URL | Signed URL |
The tiers line up cleanly
Every one of the three lets you pick how hot or cold each object is, priced on the same trade-off: the colder the tier, the cheaper to store and the more you pay (in money and latency) to read it back. Set the tier per object or per container, and the names slot together almost one-to-one.
| Access pattern | Azure | AWS | GCP |
|---|---|---|---|
| Hot — read often | Hot | S3 Standard | Standard |
| Infrequent — weeks to months | Cool + Cold | Standard-IA + One Zone-IA | Nearline + Coldline |
| Archive — rarely, retrieval delay | Archive | Glacier (Instant / Flexible / Deep Archive) | Archive |
And you don't move objects between tiers by hand. All three have lifecycle management: you write a rule once — "anything not touched in 30 days drops to Cool, anything past 180 days goes to Archive, delete after seven years" — and the platform demotes objects on schedule. Same feature, same reason, near-identical policy syntax in spirit. It's how you stop paying hot prices for logs nobody's read since last quarter.
The one place it breaks: Azure's storage account
Here's the thing that isn't a synonym. On AWS you create a bucket directly in your account, and on GCP you create a bucket directly in your project. The bucket's name is globally unique across the entire cloud, and that's the whole hierarchy — bucket, then objects inside it. Two levels.
Azure inserts a level in the middle. You don't create a container first — you create a storage account, and blob containers live inside that account. The globally-unique name you have to fight for isn't the container's, it's the storage account's. The container name is a second-level namespace, unique only within its account. So the endpoint reads myaccount.blob.core.windows.net/mycontainer/myblob — account, then container, then blob. Three levels, not two.
An S3 bucket is about equal parts Azure storage account plus container — and you can't make the container without the account first.
And the storage account isn't only for blobs. It's a shared wrapper that also holds Azure Files, Queues, and Tables — four storage services under one account. There's simply no equivalent object on AWS or GCP; a bucket there is its own top-level thing with nothing bundled alongside it.
The other setting that lives at the account level on Azure is redundancy. You choose LRS, ZRS, GRS, or RA-GRS — how many copies, across how many zones or regions — once, for the whole storage account, and every container inside inherits it. On AWS and GCP that regional or multi-region choice is made per bucket instead. So the mental swap isn't just "bucket becomes container." It's "the durability and naming decisions you make per bucket on AWS get made one level up, per storage account, on Azure."
Coming from S3, your instinct is: create a bucket, start uploading. On Azure that instinct stalls, because there's no "create container" button at the top — you create a storage account first, and containers live inside it. Map it like this: an S3 bucket ≈ an Azure blob container, but the account-level things you set per-bucket on AWS (the globally-unique name, the redundancy, the region) move up to the storage account on Azure. Learn to reach for the storage account first and the rest of Blob Storage feels exactly like S3.
What maps without a fight
Almost everything else. A few worth naming because people ask:
- Consistency. All three are now strongly consistent for reads after a write — upload an object and the very next read returns it, no eventual-consistency window to reason about. S3 dropped its old caveat here years ago; Azure and GCS behave the same.
- Static website hosting. Every one can serve a bucket or container straight to the browser as a static site, index page and all. Same feature, different toggle location.
- Temporary links. Need to hand someone a download that expires, or let a browser upload directly without a public bucket? That's a SAS token on Azure, a presigned URL on S3, and a signed URL on GCS. Identical idea — a signed, time-boxed, scoped URL — three names.
None of those will cost you a weekend. The storage account is the one that does, so it's the one to internalize before you touch the portal.
So how should you think about it?
If object storage is your entry point into a second cloud, do the translation in one direction and keep it simple: the service and the tiers are synonyms you'll stop looking up by week two, and the SAS-token / presigned-URL / signed-URL trio is a straight rename. Spend your attention on the storage account, because it's the only concept here that doesn't exist on the other two. Once you've built one by hand — created the account, set its redundancy, added a container, uploaded a blob — the S3 model reads back as "Azure with the account layer collapsed away," and you'll never confuse a bucket for a container again. That's the order we teach it in the storage accounts class, and it's the same lesson the broader subscription vs account vs project comparison teaches at the billing layer: map on the role, then re-learn the shape.
Common questions
Is an Azure blob container the same as an S3 bucket?
Roughly, yes — both are the folder-like namespace you drop objects into, and an S3 bucket maps most closely to an Azure blob container. But there's a catch: on AWS you create a bucket directly at the top level of your account, and on Azure you can't create a container without first creating a storage account to hold it. So an S3 bucket is about equal parts Azure storage account plus container. The globally-unique name on AWS is the bucket; on Azure it's the storage account.
What is an Azure storage account and does S3 or GCS have one?
A storage account is an Azure-only wrapper. It's the thing you create first, it carries the globally-unique name and the redundancy setting, and it holds not just blob containers but also Azure Files, Queues, and Tables. Neither S3 nor Google Cloud Storage has an equivalent — on AWS and GCP a bucket is a top-level object you create directly. So when you move from S3 to Azure, the extra step of standing up a storage account before you get a container is the thing that surprises people.
How do the storage tiers compare across Azure, AWS, and GCP?
They line up cleanly. Hot data: Azure Hot, S3 Standard, GCS Standard. Infrequent access: Azure Cool and Cold, S3 Standard-IA and One Zone-IA, GCS Nearline and Coldline. Long-term archive: Azure Archive, S3 Glacier in its three flavours, GCS Archive. All three let you write lifecycle rules that move objects down the tiers automatically as they age, so you set the policy once and stop paying hot prices for cold data.
How do I make a temporary shareable download link on each cloud?
Same idea, three names. On Azure you generate a SAS token — a shared access signature appended to the blob URL that grants time-limited, scoped access. On AWS it's a presigned URL. On Google Cloud Storage it's a signed URL. All three let you hand someone a link that works for a set window without making the object public, which is how you do private downloads and direct browser uploads.