Cloud Object Storage
The cheap, infinite bucket under everything
S3, GCS and Azure Blob are the backbone of the modern data stack: cheap, durable, versioned object storage that every lake, warehouse and pipeline lands on.
What you will learn
- Explain object storage's model (buckets, keys, objects) and its consistency guarantees
- Choose storage classes and lifecycle rules to control cost
- Secure access with IAM, bucket policies and encryption
What is this?
Object storage stores unstructured bytes addressed by a key inside a bucket, with no filesystem hierarchy (the 'folders' are just key prefixes). It is designed for durability across regions and near-infinite scale at low cost. Every modern platform — lakes, warehouses, backups — uses it as its raw landing zone because it's cheap enough to keep everything and fast enough to feed queries.
Why do you need it?
- Cost-per-GB collapses versus a database: keep raw data indefinitely for pennies.
- Durability is engineered (11 nines S3) with automatic replication across facilities.
- Versioning and lifecycle let you keep every overwrite and auto-purge cold data without custom jobs.
- It is the interchange format: sources publish to objects, tools read them, no one owns an ETL port.
Mental model
A self-storage warehouse full of labeled crates
Cloud object storage
You don't organize the crates by shelf; you label each crate with a key (folder/name) and the warehouse handles durability, insurance and retrieval. Objects are just labeled crates you can fetch by key or scan with a prefix.
How it works
- Buckets are namespaces; objects are bytes + metadata + version-id, addressed by key.
- Storage classes trade access latency/cost: STANDARD, IA (infrequent), GLACIER (archive with restore time).
- Lifecycle rules can transition class automatically and expire objects on a schedule.
- Consistency: S3 now offers strong read-after-write for PUTs of new objects; beware eventual consistency windows in some paths.
- Access via IAM roles/keys, bucket policies, ACLs and server-side encryption (SSE/S3 KMS).
- Data goes in via SDK/CLI/events (S3 Event Notifications) → pipelines (Glue, Lambda, Kafka connectors) → tools (Athena, Spark, Snowflake external data).
The object storage lifecycle from write to serving.
In production
- A startup lands every nightly export into S3 as raw/YYYY/MM/DD and runs Athena over it directly, deferring a warehouse for a year.
- A media company version-switches stored content so every publish is a new object version, with a lifecycle rule deleting versions older than 90 days.
- A bank archives 7 years of GLACIER retention for compliance and restores a single month on subpoena via a restore ticket.
Best practices
- Use key partitioning (dt=, or YYYY/MM/DD) so queries and lifecycles prune cheaply.
- Turn on versioning for troubleshooting, with a lifecycle to expire old versions.
- Apply IAM least-privilege per bucket/prefix; never share long-lived access keys.
- Encrypt at rest with SSE-KMS and set a bucket deny-public-access guard.
Common mistakes
- Treating keys as a real filesystem and doing millions of tiny LIST/HEAD calls (object latencies and throttling).
- Forgetting cross-region replication cost and latency when the warehouse lives elsewhere.
- Using STANDARD forever and watching the bill grow while data never gets queried.
- No bucket policy → a leaked role or key exposes everything.
Debugging tips
- When a downstream job 'sees nothing', check whether the expected object prefix actually has the object (list one prefix).
- For 'impossible' missing objects, check eventual consistency windows after concurrent writes and read-after-list.
- Cost spike: query the cost breakdown by storage class and region — Glacier rehydration or IA minimums are common culprits.
- Access denied yet the key fits: diff the IAM policy, bucket policy, and any ACL/session tags all at once.
Interview checkpoint
Quick quiz
Which workload fits object storage best?
Key partitioning such as dt=2026-09-22 lets query engines prune partitions cheaply.