๐ง What is Amazon S3?
Amazon S3 (Simple Storage Service) is one of AWS's core building blocks โ object storage that's advertised as "infinitely scalable."
๐ก Key idea: Store any amount of data, anytime, anywhere.
๐ผ๏ธ Structure: ๐ชฃ Bucket โ ๐ Objects โ ๐ Keys (paths)
Why S3 Matters
๐ Backbone of much of the internet
๐ Powers many other AWS services
๐ก๏ธ Built for high durability and scale
๐ Common Use Cases
Use Case | What It Means |
|---|---|
๐ฆ Storage & Backup | Files, images, videos, database backups |
๐ก๏ธ Disaster Recovery | Replicate data across regions |
๐ง Archival | Cheap long-term storage |
๐ Static Website Hosting | Host HTML/CSS/JS directly |
๐ Data Lakes & Analytics | Foundation for big data processing |
๐ Hybrid Cloud | Extend on-prem storage into the cloud |
Real-world: ๐ Nasdaq stores years of data on S3; ๐ง Cisco runs analytics on top of it.
๐ชฃ Amazon S3 Buckets โ Top-Level Containers

A bucket is a container for objects. S3 allows people to store objects (files) in โbucketsโ
Key properties:
๐ Name must be globally unique
๐ Created in a specific AWS region
โ ๏ธ Important nuance:
S3 looks global, but buckets are regional. There are actually two naming layers โ a globally unique namespace (no two accounts can share a name) and a regional namespace (the same name can be reused across different regions under certain conditions).
๐ Naming rules: 3โ63 characters, lowercase letters/numbers/hyphens only โ no uppercase, no underscores.
๐ฆ Amazon S3 Objects โ The Actual Files
<div class="infographic-s3objects">
<style>
.infographic-s3objects {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f6f4ef;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--bucket: #1f7a4d;
--bucket-soft:#e3f3ea;
--circle: #c98a1f;
--circle-soft:#fbeecd;
--square: #2f8f4e;
--square-soft:#e4f4e8;
--triangle: #3f6fd1;
--triangle-soft:#e6ecfb;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
color: var(--ink);
background: var(--paper);
max-width: 760px;
margin: 0 auto;
padding: 1.75rem 1.25rem 2rem;
box-sizing: border-box;
}
.infographic-s3objects[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #6f9bff;
--accent-soft:#1c2740;
--line: #2c313d;
--bucket: #4fbf85;
--bucket-soft:#12271d;
--circle: #e0ab52;
--circle-soft:#332711;
--square: #59c07f;
--square-soft:#122a1c;
--triangle: #7fa1f0;
--triangle-soft:#1a2440;
}
.infographic-s3objects * { box-sizing: border-box; }
.s3o-eyebrow {
text-align: center; font-size: 0.75rem; letter-spacing: 0.08em; text-transform: uppercase;
color: var(--ink-soft); margin: 0 0 0.3rem;
}
.s3o-title {
text-align: center; font-family: Georgia, serif; font-size: 1.35rem; margin: 0 0 1.75rem;
}
.s3o-stage {
position: relative;
width: 100%;
}
.s3o-canvas { width: 100%; height: auto; display: block; overflow: visible; }
.s3o-arrow { fill: none; stroke: var(--ink-soft); stroke-width: 2; stroke-dasharray: 4 5; }
.s3o-arrowhead { fill: var(--ink-soft); }
.s3o-object { cursor: pointer; transition: transform 0.55s cubic-bezier(.4,0,.2,1), opacity 0.4s ease 0.15s; }
.s3o-object.is-added { opacity: 0; pointer-events: none; }
.s3o-object:hover:not(.is-added) .s3o-obj-shape { filter: brightness(1.08); }
.s3o-object:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.s3o-circle { fill: var(--circle-soft); stroke: var(--circle); stroke-width: 2.5; }
.s3o-square { fill: var(--square-soft); stroke: var(--square); stroke-width: 2.5; }
.s3o-triangle { fill: var(--triangle-soft); stroke: var(--triangle); stroke-width: 2.5; }
.s3o-bucket-outline { fill: none; stroke: var(--bucket); stroke-width: 3; stroke-linejoin: round; transition: stroke 0.3s; }
.s3o-bucket.is-full .s3o-bucket-outline { stroke: var(--bucket); }
.s3o-inside-icon {
opacity: 0;
transform: translate(var(--ix), var(--iy)) scale(0.6);
transform-origin: center;
transition: opacity 0.4s ease 0.35s, transform 0.4s ease 0.35s;
}
.s3o-inside-icon.is-visible { opacity: 1; transform: translate(var(--ix), var(--iy)) scale(1); }
.s3o-caption {
font-size: 0.82rem; font-weight: 600; text-align: center; fill: var(--ink);
}
.s3o-controls { display: flex; justify-content: center; gap: 0.6rem; margin-top: 1.5rem; flex-wrap: wrap; }
.s3o-hint { text-align: center; font-size: 0.8rem; color: var(--ink-soft); margin: 0.5rem 0 0; }
.s3o-btn {
font: inherit; font-size: 0.85rem; font-weight: 600; color: var(--ink);
background: var(--paper-alt); border: 1.5px solid var(--line); border-radius: 999px;
padding: 0.5rem 1.15rem; cursor: pointer; transition: border-color 0.15s, background 0.15s;
}
.s3o-btn:hover { border-color: var(--accent); }
.s3o-btn:disabled { opacity: 0.4; cursor: default; }
.s3o-btn.run { color: #fff; border-color: var(--accent); background: var(--accent); }
.s3o-btn.run:hover { border-color: var(--accent); }
.s3o-btn.reset { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
@media (prefers-reduced-motion: reduce) {
.infographic-s3objects * { transition-duration: 0.001ms !important; }
}
</style>
<p class="s3o-eyebrow">Amazon S3</p>
<h2 class="s3o-title">๐ชฃ Objects Live Inside a Bucket</h2>
<div class="s3o-stage">
<svg class="s3o-canvas" viewBox="0 0 640 300" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="s3o-arrow-head" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto">
<path d="M0,0 L8,4 L0,8 Z" class="s3o-arrowhead"/>
</marker>
</defs>
<!-- decorative curved arrow -->
<path class="s3o-arrow" d="M 130 150 C 170 90, 260 70, 330 105" marker-end="url(#s3o-arrow-head)"/>
<!-- objects -->
<g class="s3o-object" data-shape="circle" tabindex="0" role="button" aria-label="Add circle object to bucket" transform="translate(60,150)">
<circle class="s3o-obj-shape s3o-circle" cx="0" cy="0" r="20"/>
</g>
<g class="s3o-object" data-shape="square" tabindex="0" role="button" aria-label="Add square object to bucket" transform="translate(112,140)">
<rect class="s3o-obj-shape s3o-square" x="-16" y="-16" width="32" height="32" rx="3"/>
</g>
<g class="s3o-object" data-shape="triangle" tabindex="0" role="button" aria-label="Add triangle object to bucket" transform="translate(85,205)">
<polygon class="s3o-obj-shape s3o-triangle" points="0,-20 22,18 -22,18"/>
</g>
<text class="s3o-caption" x="85" y="260" text-anchor="middle">Objects</text>
<!-- bucket -->
<g class="s3o-bucket" id="s3o-bucket">
<ellipse class="s3o-bucket-outline" cx="400" cy="110" rx="52" ry="16"/>
<path class="s3o-bucket-outline" d="M 350 110 L 362 210 Q 400 224 438 210 L 450 110"/>
<path class="s3o-bucket-outline" d="M 438 150 Q 470 150 470 168 Q 470 184 440 178"/>
<!-- inside slots -->
<g class="s3o-inside-icon" id="s3o-inside-triangle" style="--ix:378px; --iy:140px;">
<polygon class="s3o-triangle" points="0,-11 12,10 -12,10"/>
</g>
<g class="s3o-inside-icon" id="s3o-inside-square" style="--ix:382px; --iy:180px;">
<rect class="s3o-square" x="-10" y="-10" width="20" height="20" rx="2"/>
</g>
<g class="s3o-inside-icon" id="s3o-inside-circle" style="--ix:418px; --iy:150px;">
<circle class="s3o-circle" cx="0" cy="0" r="12"/>
</g>
</g>
<text class="s3o-caption" id="s3o-bucket-label" x="400" y="260" text-anchor="middle">S3 bucket</text>
</svg>
</div>
<p class="s3o-hint" id="s3o-hint">Press Run to store the objects โ or click a shape to add it on its own.</p>
<div class="s3o-controls">
<button class="s3o-btn run" id="s3o-run">โถ Run</button>
<button class="s3o-btn reset" id="s3o-reset" disabled>โบ Reset</button>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-s3objects')
|| document.querySelector('.infographic-s3objects');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
const objects = wrapper.querySelectorAll('.s3o-object');
const bucket = wrapper.querySelector('#s3o-bucket');
const label = wrapper.querySelector('#s3o-bucket-label');
const hint = wrapper.querySelector('#s3o-hint');
const resetBtn = wrapper.querySelector('#s3o-reset');
const runBtn = wrapper.querySelector('#s3o-run');
// target positions (inside bucket) for each shape, in the same
// coordinate space as the object's own translate transform
const targets = { circle: [418, 150], square: [382, 180], triangle: [378, 140] };
let addedCount = 0;
function addObject(el) {
const shape = el.dataset.shape;
if (el.classList.contains('is-added')) return;
const [tx, ty] = targets[shape];
el.style.transform = 'translate(' + tx + 'px,' + ty + 'px) scale(0.55)';
el.classList.add('is-added');
const insideIcon = wrapper.querySelector('#s3o-inside-' + shape);
insideIcon.classList.add('is-visible');
addedCount += 1;
resetBtn.disabled = false;
if (addedCount === objects.length) {
bucket.classList.add('is-full');
label.textContent = 'S3 bucket with objects';
hint.textContent = 'All objects are now stored in the bucket.';
runBtn.disabled = true;
}
}
objects.forEach(function (el) {
el.addEventListener('click', function () { addObject(el); });
el.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); addObject(el); }
});
});
runBtn.addEventListener('click', function () {
runBtn.disabled = true;
const remaining = Array.from(objects).filter(function (el) {
return !el.classList.contains('is-added');
});
remaining.forEach(function (el, i) {
setTimeout(function () { addObject(el); }, i * 450);
});
});
resetBtn.addEventListener('click', function () {
objects.forEach(function (el) {
el.classList.remove('is-added');
el.style.transform = '';
});
wrapper.querySelectorAll('.s3o-inside-icon').forEach(function (i) {
i.classList.remove('is-visible');
});
bucket.classList.remove('is-full');
label.textContent = 'S3 bucket';
hint.textContent = 'Press Run to store the objects โ or click a shape to add it on its own.';
addedCount = 0;
resetBtn.disabled = true;
runBtn.disabled = false;
});
})();
</script>
</div>An object is a file stored in a bucket.
๐ฆ Object = Data + Metadata + Key
๐ Object Keys โ The Full Path
The key is the full path to a file, e.g.:
s3://my-bucket/my-folder/another-folder/file.txtPrefix:
my-folder/another-folder/Object name:
file.txtKey = Prefix + Object name
โ ๏ธ Important: S3 has no real folders โ what look like folders are just slashes inside the key name.
๐ฆ Max object size: 5 TB
๐ค For anything over 5 GB, use Multipart Upload (split the file into parts, upload separately)
๐ Metadata: key-value pairs describing the object
๐ท๏ธ Tags: up to 10 per object, used for security rules and lifecycle policies
๐ Version ID: appears only if versioning is enabled; lets you recover older versions
๐ง Quick Recap
๐ชฃ Bucket = container (regional)
๐ Object = file
๐ Key = full path
๐ "Folders" = an illusion created by key names
๐ Naming is global, but the bucket itself lives in one region
๐ฅ Common Exam Traps
โ S3 is not truly global โ buckets are regional
โ There are no real directories, only keys with slashes
โ Files over 5 GB need Multipart Upload
๐ฅ Bottom line: S3 is scalable, secure, durable object storage โ and the foundation a lot of AWS is built on.