1.The object storage model: buckets, keys, metadata, versioning
Object storage holds data as whole, immutable objects — not files in a directory tree and not rows in a table. A bucket is a flat namespace; every object inside it is addressed by a key, a string that is the object's entire identity (there are no real subdirectories, only keys that share a prefix). Each object carries metadata alongside its bytes — content type, custom headers, timestamps. Versioning, once turned on for a bucket, keeps every past copy of an object instead of overwriting it on write or delete. Lifecycle rules then automate what happens to those objects and versions over time: moving them to cheaper storage tiers or expiring them, based on age or prefix, with no application code involved.
Key features
- A bucket is a flat, globally-scoped namespace; a key is a single opaque string that is the full identity of an object inside it — there is no real directory tree underneath
- An object = its data (the bytes) + its metadata (content type, custom key-value headers, timestamps) — metadata can be read without downloading the object body
- A "folder" shown in a console or CLI is a prefix illusion: keys that share a leading substring like photos/2026/, matched by a query, not a real filesystem path
- Versioning, once enabled on a bucket, cannot be fully turned back off (only suspended) — every subsequent write or delete produces a new version instead of overwriting or truly removing data
- With versioning on, a DELETE does not erase the object — it inserts a delete marker that becomes the new current version; the prior version still exists and is still billed
- Lifecycle rules act on age and prefix (e.g. "objects under logs/ older than 30 days") to transition storage class or expire objects/versions automatically, without application code
The four core concepts of the object storage model
- Client → Bucket: PUT inv-4471.pdf (creates v1 (current))
- Client → Bucket: PUT inv-4471.pdf (creates v2 (current), v1 kept)
- Client → Bucket: DELETE inv-4471.pdf (adds a delete marker (current) — v1, v2 still stored and billed)
Command
bucket: my-app-uploads
key: invoices/2026/inv-4471.pdf
metadata: Content-Type: application/pdf, uploaded-by: svc-billing
version id: a1b2c3... (only exists once versioning is enabled)Bucket = flat container, key = full object identity (no real folders, only shared prefixes), metadata = data about the object stored alongside it. Versioning keeps every version; DELETE adds a marker rather than erasing data. Lifecycle rules are what actually reclaim storage from old versions — configure them together, not versioning alone.