๐ง EC2 Instance Types
Think of EC2 instances as different machines built for different jobs. Not every workload needs the same thing โ some want balanced performance, some want raw CPU, some need huge memory, others need fast storage. AWS gives you a family of instance types, each tuned for one of those.
๐ท๏ธ Reading an instance name
<div class="infographic-ec2name">
<style>
.infographic-ec2name {
--ink:#1a1a1a;
--ink-soft:#5c5c5c;
--paper:#ffffff;
--paper-alt:#f6f4ef;
--accent:#2563eb;
--accent-soft:#e3ebfd;
--line:#ddd6c9;
--display-font:Georgia,'Iowan Old Style',serif;
--mono-font:'SF Mono',Menlo,Consolas,monospace;
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
color:var(--ink);
background:var(--paper);
padding:2rem 1.25rem;
max-width:720px;
margin:0 auto;
border-radius:14px;
box-sizing:border-box;
}
.infographic-ec2name[data-theme="dark"]{
--ink:#e8e6e1;
--ink-soft:#9a968c;
--paper:#121212;
--paper-alt:#1e1e26;
--accent:#6f9bff;
--accent-soft:#1c2740;
--line:#2c313d;
}
.infographic-ec2name *{box-sizing:border-box}
.en-name{text-align:center;font-family:var(--mono-font);font-weight:800;font-size:2.1rem;letter-spacing:.01em;margin-bottom:.5rem}
.en-name .seg{transition:color .15s;cursor:default}
.en-name .seg.is-active{color:var(--accent)}
.en-parts{display:flex;justify-content:center;gap:.6rem;margin-bottom:1.75rem;flex-wrap:wrap;padding-bottom:1.5rem;border-bottom:1px solid var(--line)}
.en-part{border:1.5px solid var(--line);border-radius:999px;padding:.45rem 1rem;font-weight:700;font-family:var(--mono-font);font-size:.95rem;cursor:pointer;background:var(--paper-alt);transition:border-color .15s,background .15s}
.en-part:hover{border-color:var(--accent)}
.en-part.is-active{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}
.en-breakdown{display:grid;grid-template-columns:repeat(3,1fr);gap:1.2rem;margin-bottom:0}
@media (max-width:560px){.en-breakdown{grid-template-columns:1fr}}
.en-item{text-align:center;padding:.8rem .5rem;border-radius:10px;transition:background .15s}
.en-item.is-active{background:var(--accent-soft)}
.en-item .icon{font-size:2rem;margin-bottom:.4rem}
.en-item .name{font-weight:700;font-size:.88rem}
.en-item .detail{font-size:.78rem;color:var(--ink-soft);margin-top:.2rem}
@media (prefers-reduced-motion:reduce){
.infographic-ec2name *{transition-duration:.001ms!important}
}
</style>
<div class="en-name" id="en-name">
<span class="seg" data-seg="class">m</span><span class="seg" data-seg="gen">5</span><span>.</span><span class="seg" data-seg="size">2xlarge</span>
</div>
<div class="en-parts">
<div class="en-part is-active" data-p="class">m</div>
<div class="en-part" data-p="gen">5</div>
<div class="en-part" data-p="size">2xlarge</div>
</div>
<div class="en-breakdown">
<div class="en-item" data-b="class">
<div class="icon">๐ง </div>
<div class="name">Instance Class</div>
<div class="detail" id="en-class-detail">M = General Purpose</div>
</div>
<div class="en-item" data-b="gen">
<div class="icon">โฑ๏ธ</div>
<div class="name">Generation</div>
<div class="detail" id="en-gen-detail">5 = 5th generation</div>
</div>
<div class="en-item" data-b="size">
<div class="icon">๐ถ</div>
<div class="name">Size</div>
<div class="detail" id="en-size-detail">2xlarge = relative size (bigger = more vCPU + RAM)</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-ec2name')
|| document.querySelector('.infographic-ec2name');
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');
function setActive(key){
wrapper.querySelectorAll('.en-part').forEach(p=>p.classList.toggle('is-active',p.dataset.p===key));
wrapper.querySelectorAll('.en-item').forEach(b=>b.classList.toggle('is-active',b.dataset.b===key));
}
wrapper.querySelectorAll('.en-part').forEach(p=>{
p.addEventListener('click',()=>setActive(p.dataset.p));
});
wrapper.querySelectorAll('.en-item').forEach(b=>{
b.addEventListener('click',()=>setActive(b.dataset.b));
});
})();
</script>
</div>.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!');
});Take m5.2xlarge:
m โ instance class (General Purpose)
5 โ generation (higher = newer hardware)
2xlarge โ size (bigger = more CPU + RAM, and more cost)
Simple rule: bigger size = more power = higher price.
โก Main EC2 Instance Types
<div class="infographic-ec2name">
<style>
.infographic-ec2name {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f6f4ef;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--ok: #1e8e5a;
--ok-soft: #e2f6ec;
--bad: #c0392b;
--bad-soft: #fbe9e7;
--display-font: Georgia, 'Iowan Old Style', serif;
--mono-font: 'SF Mono', Menlo, Consolas, monospace;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
color: var(--ink);
background: var(--paper);
padding: 2rem 1.25rem 2.5rem;
max-width: 720px;
margin: 0 auto;
border-radius: 14px;
box-sizing: border-box;
}
.infographic-ec2name[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #6f9bff;
--accent-soft:#1c2740;
--line: #2c313d;
--ok: #4fbf87;
--ok-soft: #143024;
--bad: #e57373;
--bad-soft: #3a2222;
}
.infographic-ec2name * { box-sizing: border-box; }
.en-name { text-align: center; font-family: var(--mono-font); font-weight: 800; font-size: 2.1rem;
letter-spacing: 0.01em; margin-bottom: 0.5rem; }
.en-name .seg { transition: color 0.15s; }
.en-parts { display: flex; justify-content: center; gap: 0.6rem; margin-bottom: 1.75rem; flex-wrap: wrap;
padding-bottom: 1.5rem; border-bottom: 1px solid var(--line); }
.en-part { border: 1.5px solid var(--line); border-radius: 999px; padding: 0.45rem 1rem; font-weight: 700;
font-family: var(--mono-font); font-size: 0.95rem; cursor: pointer; background: var(--paper-alt);
transition: border-color 0.15s, background 0.15s, color 0.15s; }
.en-part:hover { border-color: var(--accent); }
.en-part.is-active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.en-breakdown { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; margin-bottom: 2rem; }
@media (max-width: 560px) { .en-breakdown { grid-template-columns: 1fr; } }
.en-item { text-align: center; padding: 0.8rem 0.5rem; border-radius: 10px; cursor: pointer; transition: background 0.15s; }
.en-item.is-active { background: var(--accent-soft); }
.en-item .icon { font-size: 2rem; margin-bottom: 0.4rem; }
.en-item .name { font-weight: 700; font-size: 0.88rem; }
.en-item .detail { font-size: 0.78rem; color: var(--ink-soft); margin-top: 0.2rem; }
.en-builder { border: 1.5px solid var(--line); border-radius: 12px; padding: 1.2rem 1.3rem; background: var(--paper-alt);
margin-bottom: 1.75rem; }
.en-builder-title { font-weight: 700; font-size: 0.9rem; margin: 0 0 0.9rem; text-align: center; }
.en-builder-row { display: flex; justify-content: center; gap: 0.6rem; flex-wrap: wrap; }
.en-builder-row select { font: inherit; font-size: 0.85rem; padding: 0.4rem 0.6rem; border-radius: 6px;
border: 1px solid var(--line); background: var(--paper); color: var(--ink); }
/* --- Good fit / bad fit task demo --- */
.en-task { border: 1.5px solid var(--line); border-radius: 12px; padding: 1.2rem 1.3rem; background: var(--paper-alt); }
.en-task-title { font-weight: 700; font-size: 0.9rem; margin: 0 0 0.9rem; text-align: center; }
.en-task-btns { display: flex; justify-content: center; gap: 0.6rem; flex-wrap: wrap; margin-bottom: 1.1rem; }
.en-task-btns button { font: inherit; font-size: 0.82rem; font-weight: 700; padding: 0.5rem 0.95rem;
border-radius: 999px; cursor: pointer; border: 1.5px solid var(--line); background: var(--paper); color: var(--ink); }
.en-task-btns button.good { border-color: var(--ok); color: var(--ok); }
.en-task-btns button.bad { border-color: var(--bad); color: var(--bad); }
.en-task-btns button:disabled { opacity: 0.5; cursor: default; }
.en-task-label { text-align: center; font-size: 0.85rem; font-weight: 600; margin-bottom: 0.6rem; min-height: 1.2em; }
.en-progress-track { height: 12px; border-radius: 999px; background: var(--line); overflow: hidden; margin-bottom: 0.6rem; }
.en-progress-fill { height: 100%; width: 0%; background: var(--ink-soft); border-radius: 999px; }
.en-progress-fill.good { background: var(--ok); transition: width 0.9s linear; }
.en-progress-fill.bad { background: var(--bad); animation: en-struggle 3.2s steps(18) forwards; }
@keyframes en-struggle {
0% { width: 0%; }
15% { width: 18%; }
22% { width: 19%; }
40% { width: 45%; }
46% { width: 44%; }
70% { width: 68%; }
76% { width: 66%; }
100% { width: 100%; }
}
.en-task-result { text-align: center; font-size: 0.85rem; min-height: 1.3em; font-weight: 600; }
.en-task-result.ok { color: var(--ok); }
.en-task-result.bad { color: var(--bad); }
@media (prefers-reduced-motion: reduce) {
.infographic-ec2name * { transition-duration: 0.001ms !important; animation: none !important; }
}
</style>
<div class="en-name" id="en-name"></div>
<div class="en-parts">
<div class="en-part" data-p="class"></div>
<div class="en-part" data-p="gen"></div>
<div class="en-part" data-p="size"></div>
</div>
<div class="en-breakdown">
<div class="en-item" data-b="class">
<div class="icon">๐ง </div>
<div class="name">Instance Class</div>
<div class="detail" id="en-class-detail"></div>
</div>
<div class="en-item" data-b="gen">
<div class="icon">โฑ๏ธ</div>
<div class="name">Generation</div>
<div class="detail" id="en-gen-detail"></div>
</div>
<div class="en-item" data-b="size">
<div class="icon">๐ถ</div>
<div class="name">Size</div>
<div class="detail" id="en-size-detail"></div>
</div>
</div>
<div class="en-builder">
<p class="en-builder-title">Build your own instance name</p>
<div class="en-builder-row">
<select id="en-sel-class">
<option value="m" selected>m โ General Purpose</option>
<option value="c">c โ Compute Optimized</option>
<option value="r">r โ Memory Optimized</option>
<option value="i">i โ Storage Optimized</option>
</select>
<select id="en-sel-gen">
<option>5</option>
<option selected>6</option>
<option>7</option>
</select>
<select id="en-sel-size">
<option>micro</option>
<option>small</option>
<option>large</option>
<option selected>xlarge</option>
<option>2xlarge</option>
<option>4xlarge</option>
</select>
</div>
</div>
<div class="en-task">
<p class="en-task-title">See what this instance is actually good at</p>
<div class="en-task-btns">
<button class="good" id="en-btn-good">โ
Try a good-fit task</button>
<button class="bad" id="en-btn-bad">โ Try a mismatched task</button>
</div>
<div class="en-task-label" id="en-task-label">Pick a task above.</div>
<div class="en-progress-track"><div class="en-progress-fill" id="en-progress-fill"></div></div>
<div class="en-task-result" id="en-task-result"> </div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-ec2name')
|| document.querySelector('.infographic-ec2name');
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 classNames = { m: 'General Purpose', c: 'Compute Optimized', r: 'Memory Optimized', i: 'Storage Optimized' };
const taskData = {
m: { good: 'Serving a web page', bad: 'Training a large ML model' },
c: { good: 'Encoding a batch of video', bad: 'Hosting a huge in-memory cache' },
r: { good: 'Querying an in-memory database', bad: 'Heavy video encoding' },
i: { good: 'High-speed data read/write', bad: 'Large-scale ML training' }
};
const nameEl = wrapper.querySelector('#en-name');
const selClass = wrapper.querySelector('#en-sel-class');
const selGen = wrapper.querySelector('#en-sel-gen');
const selSize = wrapper.querySelector('#en-sel-size');
const classDetail = wrapper.querySelector('#en-class-detail');
const genDetail = wrapper.querySelector('#en-gen-detail');
const sizeDetail = wrapper.querySelector('#en-size-detail');
const chipClass = wrapper.querySelector('.en-part[data-p="class"]');
const chipGen = wrapper.querySelector('.en-part[data-p="gen"]');
const chipSize = wrapper.querySelector('.en-part[data-p="size"]');
function render() {
const c = selClass.value;
const g = selGen.value;
const s = selSize.value;
nameEl.innerHTML =
'<span class="seg" data-seg="class">' + c + '</span>' +
'<span class="seg" data-seg="gen">' + g + '</span>' +
'<span>.</span>' +
'<span class="seg" data-seg="size">' + s + '</span>';
chipClass.textContent = c;
chipGen.textContent = g;
chipSize.textContent = s;
classDetail.textContent = c.toUpperCase() + ' = ' + classNames[c];
genDetail.textContent = g + ' = generation ' + g;
sizeDetail.textContent = s + ' = relative size (bigger = more vCPU + RAM)';
resetTask();
}
function setActive(key) {
wrapper.querySelectorAll('.en-part').forEach(p => p.classList.toggle('is-active', p.dataset.p === key));
wrapper.querySelectorAll('.en-item').forEach(b => b.classList.toggle('is-active', b.dataset.b === key));
}
wrapper.querySelectorAll('.en-part').forEach(p => p.addEventListener('click', () => setActive(p.dataset.p)));
wrapper.querySelectorAll('.en-item').forEach(b => b.addEventListener('click', () => setActive(b.dataset.b)));
[selClass, selGen, selSize].forEach(el => el.addEventListener('change', render));
// --- Good-fit / mismatched task demo ---
const btnGood = wrapper.querySelector('#en-btn-good');
const btnBad = wrapper.querySelector('#en-btn-bad');
const taskLabel = wrapper.querySelector('#en-task-label');
const progressTrack = wrapper.querySelector('.en-progress-track');
const taskResult = wrapper.querySelector('#en-task-result');
let running = false;
function resetTask() {
running = false;
btnGood.disabled = false;
btnBad.disabled = false;
taskLabel.textContent = 'Pick a task above.';
taskResult.textContent = '\u00a0';
taskResult.className = 'en-task-result';
progressTrack.innerHTML = '<div class="en-progress-fill" id="en-progress-fill"></div>';
}
function runTask(kind) {
if (running) return;
running = true;
btnGood.disabled = true;
btnBad.disabled = true;
const c = selClass.value;
const task = taskData[c][kind];
taskLabel.textContent = task;
taskResult.textContent = '\u00a0';
taskResult.className = 'en-task-result';
progressTrack.innerHTML = '<div class="en-progress-fill ' + kind + '" id="en-progress-fill"></div>';
const fill = wrapper.querySelector('#en-progress-fill');
if (kind === 'good') {
requestAnimationFrame(() => { fill.style.width = '100%'; });
setTimeout(() => {
taskResult.textContent = 'โ
Done fast โ this is exactly what this instance is built for.';
taskResult.classList.add('ok');
running = false;
btnGood.disabled = false;
btnBad.disabled = false;
}, 950);
} else {
setTimeout(() => {
taskResult.textContent = 'โ ๏ธ Finally done โ took a lot longer and strained the instance.';
taskResult.classList.add('bad');
running = false;
btnGood.disabled = false;
btnBad.disabled = false;
}, 3300);
}
}
btnGood.addEventListener('click', () => runTask('good'));
btnBad.addEventListener('click', () => runTask('bad'));
render();
})();
</script>
</div>.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!');
});โ๏ธ General Purpose
The balanced option Good for web servers, small databases, backend apps. Even split of CPU, memory, and networking.
๐ Example: t3.micro (FREE tier โ youโll use this a lot)
๐งฎ Compute Optimized
CPU-heavy Good for batch jobs, video encoding, ML, anything computation-heavy. Named C5, C6, etc.
๐ง Memory Optimized
RAM-heavy Good for large databases, real-time analytics, caching (Redis and friends) โ anything holding huge datasets in memory. Named R5, X1, Z1.
๐พ Storage Optimized
Built for fast disk I/O Good for big data, data warehousing, high-throughput databases. Named I, D, H1.
Quick comparison
Type | vCPU | Memory | Strength | Best for |
|---|---|---|---|---|
t3.micro | 2 | 1 GB | Balanced | Small apps, free tier |
c6i.xlarge | 4 | 8 GB | CPU | Compute-heavy tasks |
r6i.xlarge | 4 | 32 GB | Memory | Databases, caching |
i4i.large | 2 | 16 GB | Storage | Fast data processing |
๐ One useful tool
ec2instances.info โ compare every instance type side by side, check pricing, and filter by CPU or memory.
The one thing to remember
General โ balanced
Compute โ CPU power
Memory โ RAM heavy
Storage โ fast data access