🌩️ Types of Cloud Computing
As the service type changes, the amount you need to manage decreases. In the diagram, blue chips represents components managed by you, while orange chips represents components handled by the cloud provider.
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Cloud Service Models</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,500;0,6..72,600;1,6..72,500&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
.infographic-cloudsvc {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--you: #2563eb;
--you-soft: #e3ebfd;
--vendor: #c2760c;
--vendor-soft:#fbeed9;
--display-font: 'Newsreader', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
background: var(--paper);
color: var(--ink);
font-family: var(--body-font);
max-width: 880px;
margin: 0 auto;
padding: clamp(1.25rem, 5vw, 3rem);
box-sizing: border-box;
}
.infographic-cloudsvc[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--you: #5b8def;
--you-soft: #202942;
--vendor: #e0a13f;
--vendor-soft:#3a2e14;
}
.infographic-cloudsvc * { box-sizing: border-box; }
.infographic-cloudsvc h1 {
font-family: var(--display-font);
font-weight: 600;
font-size: clamp(1.4rem, 3.6vw, 1.9rem);
margin: 0 0 0.3rem;
letter-spacing: -0.01em;
}
.infographic-cloudsvc .subhead {
color: var(--ink-soft);
font-size: 0.92rem;
margin: 0 0 1.6rem;
max-width: 60ch;
line-height: 1.5;
}
/* legend */
.infographic-cloudsvc .legend {
display: flex; gap: 1.4rem; margin-bottom: 1.1rem; flex-wrap: wrap;
font-size: 0.82rem; color: var(--ink-soft);
}
.infographic-cloudsvc .legend span { display: inline-flex; align-items: center; gap: 0.4rem; }
.infographic-cloudsvc .legend .swatch { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }
.infographic-cloudsvc .legend .swatch.you { background: var(--you); }
.infographic-cloudsvc .legend .swatch.vendor { background: var(--vendor); }
/* grid wrapper for horizontal scroll on mobile */
.infographic-cloudsvc .grid-scroll {
overflow-x: auto;
padding-bottom: 0.25rem;
-webkit-overflow-scrolling: touch;
}
.infographic-cloudsvc .stack {
display: grid;
grid-template-columns: 116px repeat(4, minmax(112px, 1fr));
min-width: 620px;
gap: 6px;
}
.infographic-cloudsvc .row-label-head,
.infographic-cloudsvc .col-head {
background: transparent;
}
.infographic-cloudsvc .col-head {
background: none;
border: none;
font: inherit;
font-family: var(--body-font);
font-weight: 600;
font-size: 0.85rem;
color: var(--ink);
text-align: center;
padding: 0.4rem 0.3rem 0.7rem;
cursor: pointer;
border-radius: 8px;
transition: background 0.15s, color 0.15s;
line-height: 1.25;
}
.infographic-cloudsvc .col-head .acronym {
display: block;
font-size: 0.7rem;
color: var(--ink-soft);
font-weight: 500;
margin-top: 0.1rem;
}
.infographic-cloudsvc .col-head.is-active {
background: var(--accent-soft);
color: var(--accent);
}
.infographic-cloudsvc .col-head.is-active .acronym { color: var(--accent); }
.infographic-cloudsvc .row-label {
background: none;
border: none;
font: inherit;
font-family: var(--body-font);
font-weight: 500;
font-size: 0.82rem;
color: var(--ink-soft);
text-align: right;
padding: 0.55rem 0.6rem;
cursor: pointer;
display: flex;
align-items: center;
justify-content: flex-end;
border-radius: 8px;
transition: background 0.15s, color 0.15s;
}
.infographic-cloudsvc .row-label.is-active {
background: var(--paper-alt);
color: var(--ink);
font-weight: 600;
}
.infographic-cloudsvc .cell {
padding: 0.55rem 0.3rem;
text-align: center;
font-size: 0.78rem;
font-weight: 600;
border-radius: 8px;
color: #fff;
opacity: 1;
transition: opacity 0.15s, transform 0.15s;
}
.infographic-cloudsvc .cell.you { background: var(--you); }
.infographic-cloudsvc .cell.vendor { background: var(--vendor); }
.infographic-cloudsvc .stack.col-highlighted .col-head:not(.is-active),
.infographic-cloudsvc .stack.col-highlighted .cell:not(.col-active) {
opacity: 0.28;
}
.infographic-cloudsvc .stack.row-highlighted .row-label:not(.is-active),
.infographic-cloudsvc .stack.row-highlighted .cell:not(.row-active) {
opacity: 0.28;
}
.infographic-cloudsvc .cell.row-active,
.infographic-cloudsvc .cell.col-active {
transform: scale(1.04);
}
/* summary */
.infographic-cloudsvc .summary {
margin-top: 1.3rem;
padding: 0.9rem 1.1rem;
background: var(--paper-alt);
border-radius: 10px;
font-size: 0.88rem;
line-height: 1.55;
color: var(--ink);
min-height: 1.5em;
}
.infographic-cloudsvc .summary strong { color: var(--accent); }
.infographic-cloudsvc .summary .hint {
color: var(--ink-soft);
font-size: 0.82rem;
}
@media (max-width: 600px) {
.infographic-cloudsvc .stack { min-width: 560px; }
}
@media (prefers-reduced-motion: reduce) {
.infographic-cloudsvc * { transition-duration: 0.001ms !important; animation-duration: 0.001ms !important; }
}
</style>
</head>
<body>
<div class="infographic-cloudsvc">
<h1>Who manages the stack?</h1>
<p class="subhead">Every model runs on the same nine layers. What changes is who's on the hook for each one — click a model to see its split, or a layer to trace it across all four.</p>
<div class="legend">
<span><span class="swatch you"></span>You manage</span>
<span><span class="swatch vendor"></span>Vendor manages</span>
</div>
<div class="grid-scroll">
<div class="stack" id="stack">
<div class="row-label-head"></div>
<button class="col-head" data-col="0">On-premises</button>
<button class="col-head" data-col="1">Infrastructure<span class="acronym">IaaS</span></button>
<button class="col-head" data-col="2">Platform<span class="acronym">PaaS</span></button>
<button class="col-head" data-col="3">Software<span class="acronym">SaaS</span></button>
</div>
</div>
<div class="summary" id="summary">
<span class="hint">Click any model name or layer to see the responsibility split.</span>
</div>
</div>
<script>
(function () {
// ---- dark mode detection (runs first, synchronously) ----
const wrapper = document.currentScript.closest('.infographic-cloudsvc')
|| document.querySelector('.infographic-cloudsvc');
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');
// ---- data ----
const layers = ["Applications","Data","Runtime","Middleware","O/S","Virtualization","Servers","Storage","Networking"];
const models = ["On-premises","IaaS","PaaS","SaaS"];
// how many of the 9 layers (top-down) are vendor-managed, per model
const vendorCut = [0, 4, 7, 9];
const stack = document.getElementById('stack');
const summary = document.getElementById('summary');
// build rows
layers.forEach((layer, r) => {
const label = document.createElement('button');
label.className = 'row-label';
label.dataset.row = r;
label.textContent = layer;
stack.appendChild(label);
models.forEach((m, c) => {
const cell = document.createElement('div');
const isVendor = r >= (9 - vendorCut[c]);
cell.className = 'cell ' + (isVendor ? 'vendor' : 'you');
cell.dataset.row = r;
cell.dataset.col = c;
cell.textContent = layer;
stack.appendChild(cell);
});
});
const colHeads = stack.querySelectorAll('.col-head');
const rowLabels = stack.querySelectorAll('.row-label');
const cells = stack.querySelectorAll('.cell');
function clearAll() {
stack.classList.remove('col-highlighted', 'row-highlighted');
colHeads.forEach(h => h.classList.remove('is-active'));
rowLabels.forEach(l => l.classList.remove('is-active'));
cells.forEach(c => c.classList.remove('col-active', 'row-active'));
}
colHeads.forEach(head => {
head.addEventListener('click', () => {
const alreadyActive = head.classList.contains('is-active');
clearAll();
if (alreadyActive) {
summary.innerHTML = '<span class="hint">Click any model name or layer to see the responsibility split.</span>';
return;
}
const col = Number(head.dataset.col);
stack.classList.add('col-highlighted');
head.classList.add('is-active');
cells.forEach(c => { if (Number(c.dataset.col) === col) c.classList.add('col-active'); });
const youCount = 9 - vendorCut[col];
const vendorCount = vendorCut[col];
summary.innerHTML = `<strong>${models[col]}</strong> — you manage ${youCount} of 9 layers, the provider manages the other ${vendorCount}.`;
});
});
rowLabels.forEach(label => {
label.addEventListener('click', () => {
const alreadyActive = label.classList.contains('is-active');
clearAll();
if (alreadyActive) {
summary.innerHTML = '<span class="hint">Click any model name or layer to see the responsibility split.</span>';
return;
}
const row = Number(label.dataset.row);
stack.classList.add('row-highlighted');
label.classList.add('is-active');
const owners = [];
cells.forEach(c => {
if (Number(c.dataset.row) === row) {
c.classList.add('row-active');
owners.push(c.classList.contains('vendor') ? 'vendor' : 'you');
}
});
const firstVendorIdx = owners.indexOf('vendor');
const crossover = firstVendorIdx === -1 ? 'never handed off — it stays your responsibility everywhere'
: `handed to the provider starting at <strong>${models[firstVendorIdx]}</strong>`;
summary.innerHTML = `<strong>${layers[row]}</strong> is ${crossover}.`;
});
});
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});Provide building blocks for cloud IT
Provides networking, computers, data storage space
Highest level of flexibility
Easy parallel with traditional on-premises IT
✅ Example :
Amazon EC2 (on AWS)
GCP, Azure, Rackspace, Digital Ocean, Linode
Removes the need for your organization to manage the underlying infrastructure
Focus on the deployment and management of your applications
✅ Example :
Elastic Beanstalk (on AWS)
Heroku, Google App Engine (GCP), Windows Azure (Microsoft)
Completed product that is run and managed by the service provider
✅ Example :
Many AWS services (e.g., Rekognition for Machine Learning)
Google Apps (Gmail), Dropbox, Zoom
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Cloud Pricing Fundamentals</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,500;0,6..72,600;1,6..72,500&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
.infographic-cloudpricing {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--charge: #c2760c;
--charge-soft: #fbeed9;
--display-font: 'Newsreader', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
background: var(--paper);
color: var(--ink);
font-family: var(--body-font);
max-width: 880px;
margin: 0 auto;
padding: clamp(1.25rem, 5vw, 3rem);
box-sizing: border-box;
}
.infographic-cloudpricing[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1c2029;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--charge: #e0a13f;
--charge-soft: #3a2e14;
}
.infographic-cloudpricing * { box-sizing: border-box; }
.infographic-cloudpricing h1 {
font-family: var(--display-font);
font-weight: 600;
font-size: clamp(1.4rem, 3.6vw, 1.9rem);
margin: 0 0 0.3rem;
letter-spacing: -0.01em;
}
.infographic-cloudpricing .subhead {
color: var(--ink-soft);
font-size: 0.92rem;
margin: 0 0 1.7rem;
max-width: 62ch;
line-height: 1.5;
}
.infographic-cloudpricing .cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
@media (max-width: 680px) {
.infographic-cloudpricing .cards { grid-template-columns: 1fr; }
}
.infographic-cloudpricing .card {
background: var(--paper-alt);
border: 1px solid var(--line);
border-radius: 10px;
border-top: 3px solid transparent;
padding: 1.2rem 1.1rem;
cursor: pointer;
transition: border-color 0.15s, background 0.15s;
}
.infographic-cloudpricing .card.is-open {
border-color: var(--accent);
background: var(--paper);
}
.infographic-cloudpricing .card-head {
display: flex;
align-items: center;
gap: 0.65rem;
background: none;
border: none;
width: 100%;
text-align: left;
padding: 0;
font: inherit;
cursor: pointer;
color: var(--ink);
}
.infographic-cloudpricing .icon {
width: 26px; height: 26px; flex: none;
color: var(--accent);
}
.infographic-cloudpricing .card-title {
font-family: var(--display-font);
font-weight: 600;
font-size: 1.05rem;
}
.infographic-cloudpricing .card-tagline {
font-size: 0.78rem;
color: var(--ink-soft);
margin-top: 0.1rem;
}
.infographic-cloudpricing .chevron {
margin-left: auto;
color: var(--ink-soft);
transition: transform 0.2s;
flex: none;
}
.infographic-cloudpricing .card.is-open .chevron { transform: rotate(180deg); color: var(--accent); }
.infographic-cloudpricing .card-body {
display: none;
margin-top: 0.9rem;
padding-top: 0.9rem;
border-top: 1px solid var(--line);
}
.infographic-cloudpricing .card.is-open .card-body { display: block; }
.infographic-cloudpricing .card-body ul {
margin: 0;
padding-left: 1.1rem;
font-size: 0.85rem;
color: var(--ink-soft);
line-height: 1.6;
}
.infographic-cloudpricing .card-body li { margin-bottom: 0.3rem; }
.infographic-cloudpricing .card-body li:last-child { margin-bottom: 0; }
.infographic-cloudpricing .card-body strong { color: var(--ink); }
/* data transfer toggle */
.infographic-cloudpricing .transfer-demo {
margin-top: 0.9rem;
display: flex;
align-items: center;
gap: 0.6rem;
flex-wrap: wrap;
}
.infographic-cloudpricing .dir-btn {
font: inherit;
font-size: 0.8rem;
font-weight: 600;
background: var(--paper);
border: 1px solid var(--line);
border-radius: 7px;
padding: 0.4rem 0.8rem;
cursor: pointer;
color: var(--ink);
transition: border-color 0.15s, background 0.15s;
}
.infographic-cloudpricing .dir-btn.is-selected {
border-color: var(--accent);
background: var(--accent-soft);
color: var(--accent);
}
.infographic-cloudpricing .transfer-result {
font-family: var(--body-font);
font-weight: 700;
font-size: 0.82rem;
padding: 0.4rem 0.75rem;
border-radius: 7px;
background: var(--paper);
border: 1px solid var(--line);
color: var(--ink-soft);
transition: background 0.2s, color 0.2s, border-color 0.2s;
}
.infographic-cloudpricing .transfer-result.free {
background: var(--accent-soft); color: var(--accent); border-color: var(--accent);
}
.infographic-cloudpricing .transfer-result.charged {
background: var(--charge-soft); color: var(--charge); border-color: var(--charge);
animation: nudge 0.35s;
}
@keyframes nudge {
0%, 100% { transform: translateX(0); }
30% { transform: translateX(-3px); }
60% { transform: translateX(3px); }
}
.infographic-cloudpricing .footline {
margin-top: 1.4rem;
font-size: 0.85rem;
color: var(--ink-soft);
font-style: italic;
}
.infographic-cloudpricing .footline strong { color: var(--ink); font-style: normal; }
@media (prefers-reduced-motion: reduce) {
.infographic-cloudpricing * { animation-duration: 0.001ms !important; transition-duration: 0.001ms !important; }
}
</style>
</head>
<body>
<div class="infographic-cloudpricing">
<h1>You only pay for what you use</h1>
<p class="subhead">AWS and most cloud providers bill on a pay-as-you-go model — three meters run at once. Click each to see what drives the bill.</p>
<div class="cards" id="cards">
<div class="card" data-card="compute">
<button class="card-head">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><rect x="3" y="4" width="18" height="6" rx="1.5"/><rect x="3" y="14" width="18" height="6" rx="1.5"/><circle cx="7" cy="7" r="0.6" fill="currentColor"/><circle cx="7" cy="17" r="0.6" fill="currentColor"/></svg>
<span>
<span class="card-title">Compute</span>
<span class="card-tagline">Metered by time</span>
</span>
<svg class="chevron" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg>
</button>
<div class="card-body">
<ul>
<li>You pay for <strong>compute time</strong> — the clock, not the code</li>
<li>Cost scales with <strong>how long</strong> servers or apps stay running</li>
</ul>
</div>
</div>
<div class="card" data-card="storage">
<button class="card-head">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><ellipse cx="12" cy="5" rx="8" ry="2.5"/><path d="M4 5v14c0 1.4 3.6 2.5 8 2.5s8-1.1 8-2.5V5"/><path d="M4 12c0 1.4 3.6 2.5 8 2.5s8-1.1 8-2.5"/></svg>
<span>
<span class="card-title">Storage</span>
<span class="card-tagline">Metered by volume</span>
</span>
<svg class="chevron" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg>
</button>
<div class="card-body">
<ul>
<li>You pay for <strong>data you keep</strong> in the cloud</li>
<li>Cost depends on <strong>storage type</strong> and <strong>amount stored</strong></li>
</ul>
</div>
</div>
<div class="card" data-card="transfer">
<button class="card-head">
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M12 3v12"/><path d="M7 10l5 5 5-5"/><path d="M4 19h16"/></svg>
<span>
<span class="card-title">Data Transfer</span>
<span class="card-tagline">Metered by direction</span>
</span>
<svg class="chevron" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg>
</button>
<div class="card-body">
<ul>
<li>Uploading data <strong>into</strong> the cloud is usually free</li>
<li>Downloading data <strong>out</strong> of the cloud is usually charged</li>
</ul>
<div class="transfer-demo">
<button class="dir-btn" data-dir="in">⬆ Transfer IN</button>
<button class="dir-btn" data-dir="out">⬇ Transfer OUT</button>
<span class="transfer-result" id="transferResult">Pick a direction →</span>
</div>
</div>
</div>
</div>
<p class="footline">No servers to buy, no idle capacity to pay for — <strong>the meter follows usage, not ownership.</strong></p>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-cloudpricing')
|| document.querySelector('.infographic-cloudpricing');
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');
document.querySelectorAll('.infographic-cloudpricing .card-head').forEach(head => {
head.addEventListener('click', () => {
const card = head.closest('.card');
const wasOpen = card.classList.contains('is-open');
document.querySelectorAll('.infographic-cloudpricing .card').forEach(c => c.classList.remove('is-open'));
if (!wasOpen) card.classList.add('is-open');
});
});
const dirBtns = document.querySelectorAll('.infographic-cloudpricing .dir-btn');
const result = document.getElementById('transferResult');
dirBtns.forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
dirBtns.forEach(b => b.classList.remove('is-selected'));
btn.classList.add('is-selected');
result.classList.remove('free', 'charged');
if (btn.dataset.dir === 'in') {
result.textContent = 'Free ✓';
requestAnimationFrame(() => result.classList.add('free'));
} else {
result.textContent = 'Charged $';
requestAnimationFrame(() => result.classList.add('charged'));
}
});
});
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});