ποΈ Amazon RDS
Amazon RDS (Relational Database Service) is AWS's fully managed service for running relational (SQL) databases β create, operate, and scale without managing the server yourself.
π οΈ Supported Engines
π PostgreSQL
π¬ MySQL
π¦ MariaDB
πΆ Oracle
πͺ SQL Server
π¦ IBM Db2
β‘ Amazon Aurora (AWS's own engine β covered below)
π― Exam tip: Any of these engines = relational + SQL.
β Why RDS Instead of DB-on-EC2?
You can install MySQL/PostgreSQL on EC2 β but then you're the DBA: installs, patches, backups, monitoring, failure recovery.
With RDS, AWS is your DBA (Database Administrator)
<!-- Amazon RDS β Key Benefits infographic. Self-contained, drop into codeveda.dev. -->
<div class="infographic-rds">
<header class="rds-head">
<p class="rds-eyebrow">Amazon RDS</p>
<h2 class="rds-title">9 things AWS handles for you</h2>
<p class="rds-sub">Tap a card to see how each benefit actually works.</p>
</header>
<div class="rds-grid" role="list">
<!-- cards injected below -->
</div>
</div>
<style>
.infographic-rds {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', -apple-system, sans-serif;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-rds[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.infographic-rds * { box-sizing: border-box; }
.infographic-rds .rds-head {
text-align: center;
padding: 0 clamp(1rem, 4vw, 2rem) 1.75rem;
}
.infographic-rds .rds-eyebrow {
font-family: var(--body-font);
font-size: 0.72rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--accent);
font-weight: 600;
margin: 0 0 0.5rem;
}
.infographic-rds .rds-title {
font-family: var(--display-font);
font-weight: 500;
font-size: clamp(1.6rem, 4vw, 2.2rem);
margin: 0 0 0.5rem;
line-height: 1.15;
}
.infographic-rds .rds-sub {
color: var(--ink-soft);
font-size: 0.92rem;
margin: 0;
}
.infographic-rds .rds-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1px;
background: var(--line);
border: 1px solid var(--line);
padding: clamp(0.5rem, 3vw, 0);
}
@media (max-width: 720px) {
.infographic-rds .rds-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 460px) {
.infographic-rds .rds-grid { grid-template-columns: 1fr; }
}
.infographic-rds .rds-card {
background: var(--paper);
border: none;
text-align: left;
padding: 1.25rem 1.1rem;
cursor: pointer;
font-family: inherit;
color: inherit;
display: flex;
flex-direction: column;
gap: 0.4rem;
transition: background 0.15s;
border-top: 3px solid transparent;
}
.infographic-rds .rds-card:hover { background: var(--paper-alt); }
.infographic-rds .rds-card.is-open {
background: var(--accent-soft);
border-top-color: var(--accent);
}
.infographic-rds .rds-icon { font-size: 1.3rem; line-height: 1; }
.infographic-rds .rds-label {
font-family: var(--display-font);
font-size: 1rem;
font-weight: 500;
margin: 0;
}
.infographic-rds .rds-detail {
display: none;
font-size: 0.83rem;
color: var(--ink-soft);
line-height: 1.45;
margin: 0.15rem 0 0;
}
.infographic-rds .rds-card.is-open .rds-detail { display: block; }
.infographic-rds .rds-hint {
font-size: 0.72rem;
color: var(--ink-soft);
opacity: 0.7;
margin: 0;
}
.infographic-rds .rds-card.is-open .rds-hint { display: none; }
@media (prefers-reduced-motion: reduce) {
.infographic-rds * { transition-duration: 0.001ms !important; }
}
</style>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-rds')
|| document.querySelector('.infographic-rds');
// --- dark mode detection (cookie / body attribute) ---
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
// --- content ---
var benefits = [
{ icon: 'π', label: 'Fast Provisioning', detail: 'Pick an engine, set config, click Create β up and running in minutes, no manual setup.' },
{ icon: 'π', label: 'Auto OS Patching', detail: 'AWS patches the OS and engine for you. No server login needed.' },
{ icon: 'πΎ', label: 'Backups + PITR', detail: 'Restore to almost any moment in the retention window β not just the last backup. Deleted data at 2:15? Roll back to 2:14.' },
{ icon: 'π', label: 'Built-in Monitoring', detail: 'CPU, storage, memory, connections, and reads/writes β all visible in one dashboard.' },
{ icon: 'π', label: 'Read Replicas', detail: 'Offload read-heavy traffic (browsing) so the primary stays focused on writes (checkout).' },
{ icon: 'π', label: 'Multi-AZ Failover', detail: 'A standby copy lives in another AZ. AWS auto-fails-over if the primary goes down.' },
{ icon: 'π οΈ', label: 'Maintenance Windows', detail: 'Schedule updates and patches during off-peak hours β no surprise downtime.' },
{ icon: 'π', label: 'Elastic Scaling', detail: 'Scale up β more CPU, memory, storage β or out, by adding read replicas.' },
{ icon: 'π½', label: 'EBS-backed Storage', detail: 'Every instance runs on Amazon EBS, built for durability and consistent performance.' }
];
var grid = wrapper.querySelector('.rds-grid');
benefits.forEach(function (b, i) {
var btn = document.createElement('button');
btn.className = 'rds-card';
btn.setAttribute('role', 'listitem');
btn.setAttribute('aria-expanded', 'false');
btn.innerHTML =
'<span class="rds-icon">' + b.icon + '</span>' +
'<p class="rds-label">' + b.label + '</p>' +
'<p class="rds-hint">Tap for details</p>' +
'<p class="rds-detail">' + b.detail + '</p>';
btn.addEventListener('click', function () {
var wasOpen = btn.classList.contains('is-open');
grid.querySelectorAll('.rds-card').forEach(function (c) {
c.classList.remove('is-open');
c.setAttribute('aria-expanded', 'false');
});
if (!wasOpen) {
btn.classList.add('is-open');
btn.setAttribute('aria-expanded', 'true');
}
});
grid.appendChild(btn);
});
})();
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@500&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">π« What RDS Won't Let You Do
You cannot SSH into an RDS instance β no OS-level access, no custom software installs, no OS modifications. AWS owns the infrastructure; you just connect via SQL client/app.
π‘ Quick Tip: Use RDS for easy management and high availability. Use EC2 only when you need full server control.
π― Exam Tip: Need SSH or OS-level access? Choose EC2, not RDS.
ποΈ Where Amazon RDS Fits?
Let's see where Amazon RDS fits within a typical AWS architecture.
<!-- ELB β EC2 β RDS architecture flow. Self-contained, drop into codeveda.dev. -->
<div class="infographic-arch">
<header class="arch-head">
<button class="arch-run-btn" type="button">
<svg class="run-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="6 3 20 12 6 21 6 3"/></svg>
<span class="run-label">Run Flow</span>
</button>
</header>
<div class="arch-canvas">
<svg viewBox="0 0 640 280" xmlns="http://www.w3.org/2000/svg" class="arch-svg">
<defs>
<marker id="arch-arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M0,0 L10,5 L0,10 z" class="arrow-fill"/>
</marker>
</defs>
<!-- entry arrow -->
<line x1="8" y1="150" x2="58" y2="150" class="connector-line entry-line" marker-end="url(#arch-arrow)"/>
<!-- ELB <-> EC2 connectors (fan) -->
<line x1="128" y1="150" x2="300" y2="70" class="connector-line" marker-start="url(#arch-arrow)" marker-end="url(#arch-arrow)"/>
<line x1="128" y1="150" x2="300" y2="150" class="connector-line" marker-start="url(#arch-arrow)" marker-end="url(#arch-arrow)"/>
<line x1="128" y1="150" x2="300" y2="230" class="connector-line" marker-start="url(#arch-arrow)" marker-end="url(#arch-arrow)"/>
<!-- EC2 <-> RDS connectors (converge) -->
<line x1="356" y1="70" x2="500" y2="150" class="connector-line" marker-start="url(#arch-arrow)" marker-end="url(#arch-arrow)"/>
<line x1="356" y1="150" x2="500" y2="150" class="connector-line" marker-start="url(#arch-arrow)" marker-end="url(#arch-arrow)"/>
<line x1="356" y1="230" x2="500" y2="150" class="connector-line" marker-start="url(#arch-arrow)" marker-end="url(#arch-arrow)"/>
<text x="428" y="132" class="rw-text" text-anchor="middle">Read / Write</text>
<!-- motion path (invisible) for the run animation -->
<path id="arch-motion-path" d="M8,150 L95,150 L328,150 L560,150 L328,150" fill="none" stroke="none"/>
<!-- ELB node -->
<g class="arch-node" data-part="lb" tabindex="0" role="button" aria-label="Elastic Load Balancer" aria-expanded="false">
<circle cx="95" cy="150" r="32" class="node-shape"/>
<g transform="translate(77,132) scale(1.5)">
<g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon">
<rect x="16" y="16" width="6" height="6" rx="1"/><rect x="2" y="16" width="6" height="6" rx="1"/><rect x="9" y="2" width="6" height="6" rx="1"/><path d="M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3"/><path d="M12 12V8"/>
</g>
</g>
<text x="95" y="200" text-anchor="middle" class="node-label">Elastic Load</text>
<text x="95" y="215" text-anchor="middle" class="node-label">Balancer</text>
</g>
<!-- EC2 nodes (one clickable group covering all three) -->
<g class="arch-node" data-part="ec2" tabindex="0" role="button" aria-label="EC2 Instances" aria-expanded="false">
<rect x="302" y="44" width="52" height="52" rx="10" class="node-shape"/>
<rect x="302" y="124" width="52" height="52" rx="10" class="node-shape"/>
<rect x="302" y="204" width="52" height="52" rx="10" class="node-shape"/>
<g transform="translate(315,57) scale(1.08)">
<g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon">
<path d="m10.852 14.772-.383.923"/><path d="M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923"/><path d="m13.148 9.228.383-.923"/><path d="m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544"/><path d="m14.772 10.852.923-.383"/><path d="m14.772 13.148.923.383"/><path d="M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5"/><path d="M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5"/><path d="M6 18h.01"/><path d="M6 6h.01"/><path d="m9.228 10.852-.923-.383"/><path d="m9.228 13.148-.923.383"/>
</g>
</g>
<g transform="translate(315,137) scale(1.08)">
<g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon">
<path d="m10.852 14.772-.383.923"/><path d="M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923"/><path d="m13.148 9.228.383-.923"/><path d="m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544"/><path d="m14.772 10.852.923-.383"/><path d="m14.772 13.148.923.383"/><path d="M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5"/><path d="M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5"/><path d="M6 18h.01"/><path d="M6 6h.01"/><path d="m9.228 10.852-.923-.383"/><path d="m9.228 13.148-.923.383"/>
</g>
</g>
<g transform="translate(315,217) scale(1.08)">
<g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon">
<path d="m10.852 14.772-.383.923"/><path d="M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923"/><path d="m13.148 9.228.383-.923"/><path d="m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544"/><path d="m14.772 10.852.923-.383"/><path d="m14.772 13.148.923.383"/><path d="M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5"/><path d="M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5"/><path d="M6 18h.01"/><path d="M6 6h.01"/><path d="m9.228 10.852-.923-.383"/><path d="m9.228 13.148-.923.383"/>
</g>
</g>
<text x="328" y="278" text-anchor="middle" class="node-label">EC2 Instances</text>
</g>
<!-- RDS node -->
<g class="arch-node" data-part="rds" tabindex="0" role="button" aria-label="Amazon RDS" aria-expanded="false">
<rect x="518" y="110" width="84" height="80" rx="12" class="node-shape"/>
<g transform="translate(538,130) scale(1.83)">
<g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon">
<ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/>
</g>
</g>
<text x="560" y="216" text-anchor="middle" class="node-label">Amazon RDS</text>
</g>
<!-- pulse -->
<circle r="7" class="arch-pulse" opacity="0">
<animateMotion id="arch-motion" dur="4s" begin="indefinite" fill="freeze" calcMode="linear" keyTimes="0;0.15;0.5;0.75;1">
<mpath href="#arch-motion-path"/>
</animateMotion>
</circle>
</svg>
<p class="arch-ec2-caption">Possibly in an ASG</p>
</div>
</div>
<style>
.infographic-arch {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', -apple-system, sans-serif;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-arch[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.infographic-arch * { box-sizing: border-box; }
.infographic-arch .arch-head {
text-align: center;
padding: 0.5rem clamp(1rem, 4vw, 2rem) 1.25rem;
}
.infographic-arch .arch-run-btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
background: var(--accent);
color: var(--paper);
border: none;
border-radius: 999px;
padding: 0.55rem 1.3rem;
font-family: inherit;
font-size: 0.88rem;
font-weight: 600;
cursor: pointer;
transition: opacity 0.15s;
}
.infographic-arch .arch-run-btn:hover { opacity: 0.88; }
.infographic-arch .arch-run-btn:disabled { opacity: 0.5; cursor: default; }
.infographic-arch .run-icon { width: 15px; height: 15px; }
.infographic-arch .arch-canvas { padding: 0 clamp(0.75rem, 3vw, 2rem); }
.infographic-arch .arch-svg { width: 100%; height: auto; display: block; overflow: visible; }
.infographic-arch .arch-ec2-caption {
text-align: center;
font-size: 0.72rem;
color: var(--ink-soft);
margin: -0.3rem 0 0.5rem;
}
.infographic-arch .connector-line {
stroke: var(--line);
stroke-width: 1.5;
stroke-dasharray: 4 3;
}
.infographic-arch .entry-line { stroke-dasharray: none; }
.infographic-arch .arrow-fill { fill: var(--ink-soft); }
.infographic-arch .rw-text {
fill: var(--ink-soft);
font-size: 11px;
font-family: var(--body-font);
}
.infographic-arch .arch-node { cursor: pointer; outline: none; }
.infographic-arch .arch-node .node-shape {
fill: var(--paper-alt);
stroke: var(--line);
stroke-width: 1.5;
transition: fill 0.15s, stroke 0.15s, opacity 0.15s;
}
.infographic-arch .arch-node .node-icon { color: var(--accent); }
.infographic-arch .arch-node .node-label {
font-family: var(--display-font);
font-size: 13px;
fill: var(--ink);
}
.infographic-arch .arch-node.is-active .node-shape {
fill: var(--accent-soft);
stroke: var(--accent);
}
.infographic-arch .arch-svg.has-active .arch-node:not(.is-active) { opacity: 0.45; }
.infographic-arch .arch-node:focus-visible .node-shape { stroke: var(--accent); stroke-width: 2.5; }
.infographic-arch .arch-pulse {
fill: var(--accent);
transition: opacity 0.2s;
}
@media (max-width: 560px) {
.infographic-arch .arch-run-btn { width: 100%; justify-content: center; }
}
@media (prefers-reduced-motion: reduce) {
.infographic-arch * { transition-duration: 0.001ms !important; }
}
</style>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-arch')
|| document.querySelector('.infographic-arch');
// --- dark mode detection (cookie / body attribute) ---
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var reducedMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var svg = wrapper.querySelector('.arch-svg');
var nodes = wrapper.querySelectorAll('.arch-node');
var runBtn = wrapper.querySelector('.arch-run-btn');
var pulse = wrapper.querySelector('.arch-pulse');
var motion = wrapper.querySelector('#arch-motion');
function setActive(part) {
nodes.forEach(function (n) {
var isMatch = part && n.dataset.part === part;
n.classList.toggle('is-active', isMatch);
n.setAttribute('aria-expanded', isMatch ? 'true' : 'false');
});
svg.classList.toggle('has-active', !!part);
}
function toggleNode(node) {
var wasActive = node.classList.contains('is-active');
setActive(wasActive ? null : node.dataset.part);
}
nodes.forEach(function (node) {
node.addEventListener('click', function () { toggleNode(node); });
node.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleNode(node); }
});
});
// --- Run Flow animation ---
var totalDur = reducedMotion ? 1200 : 4000;
var stages = [
{ t: 0, part: 'lb' },
{ t: totalDur * 0.15, part: 'ec2' },
{ t: totalDur * 0.5, part: 'rds' },
{ t: totalDur * 0.75, part: 'ec2' },
{ t: totalDur, part: null }
];
var timers = [];
runBtn.addEventListener('click', function () {
timers.forEach(clearTimeout);
timers = [];
runBtn.disabled = true;
motion.setAttribute('dur', (totalDur / 1000) + 's');
pulse.setAttribute('opacity', reducedMotion ? '0' : '1');
try { motion.beginElement(); } catch (e) { /* Safari fallback: no-op, stages still play */ }
stages.forEach(function (stage) {
timers.push(setTimeout(function () { setActive(stage.part); }, stage.t));
});
timers.push(setTimeout(function () {
pulse.setAttribute('opacity', '0');
runBtn.disabled = false;
}, totalDur + 50));
});
})();
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@500&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">π How It Works
Users send requests to your application.
The Elastic Load Balancer (ELB) distributes incoming traffic across multiple EC2 instances.
The EC2 instances process the application's business logic.
Whenever structured data needs to be stored or retrieved, the EC2 instances communicate with Amazon RDS.
All EC2 instances share the same database, ensuring consistent and up-to-date information.
π‘ This three-tier architecture is one of the most common application architectures used on AWS.
β‘ Amazon Aurora

AWS's own cloud-native relational database β MySQL/PostgreSQL-compatible, but built for much higher performance, scalability, and availability.
π Engine Compatibility
π¬ MySQL
π PostgreSQL
Existing apps often migrate over with little to no code changes.
π Why Aurora?
Up to 5Γ faster than MySQL on RDS
Up to 3Γ faster than PostgreSQL on RDS
π¦ Auto Storage Scaling
Grows automatically in 10 GB steps up to 256 TB β no manual resizing.
π° Cost
~20% more than standard RDS, but often cheaper overall thanks to better performance/efficiency.
π― RDS vs Aurora
Amazon RDS | Amazon Aurora |
|---|---|
Multiple relational engines | AWS's own proprietary engine |
Managed version of familiar DBs | Cloud-native, built by AWS |
Solid for general SQL workloads | Higher performance + auto storage scaling |
π Both are managed relational databases β Aurora just adds cloud-native performance.
π Amazon Aurora Serverless
No instances to provision β AWS auto-creates and scales capacity based on demand. Great for infrequent, unpredictable, or spiky workloads.
β Benefits
β‘ Auto capacity management β no manual sizing
π Auto scaling β up and down, no intervention
π₯οΈ No server management β AWS handles it all
π° Pay-per-second β only for what you use
βοΈ How Aurora Serverless Works
<!-- Client β Aurora Proxy Fleet β Aurora Instances β Shared Storage. Self-contained, drop into codeveda.dev. -->
<div class="infographic-aurora">
<header class="aur-head">
<button class="aur-run-btn" type="button">
<svg class="run-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="6 3 20 12 6 21 6 3"/></svg>
<span class="run-label">Run Flow</span>
</button>
</header>
<div class="aur-canvas">
<svg viewBox="0 0 650 480" xmlns="http://www.w3.org/2000/svg" class="aur-svg">
<defs>
<marker id="aur-arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M0,0 L10,5 L0,10 z" class="arrow-fill"/>
</marker>
</defs>
<!-- client <-> proxy -->
<line x1="325" y1="72" x2="325" y2="138" class="connector-line solid" marker-start="url(#aur-arrow)" marker-end="url(#aur-arrow)"/>
<!-- proxy <-> aurora fan -->
<line x1="185" y1="228" x2="75" y2="300" class="connector-line" marker-start="url(#aur-arrow)" marker-end="url(#aur-arrow)"/>
<line x1="255" y1="228" x2="200" y2="300" class="connector-line" marker-start="url(#aur-arrow)" marker-end="url(#aur-arrow)"/>
<line x1="325" y1="228" x2="325" y2="300" class="connector-line" marker-start="url(#aur-arrow)" marker-end="url(#aur-arrow)"/>
<line x1="395" y1="228" x2="450" y2="300" class="connector-line" marker-start="url(#aur-arrow)" marker-end="url(#aur-arrow)"/>
<line x1="465" y1="228" x2="575" y2="300" class="connector-line" marker-start="url(#aur-arrow)" marker-end="url(#aur-arrow)"/>
<!-- motion path (invisible) for the run animation -->
<path id="aur-motion-path" d="M325,45 L325,184 L325,355 L325,440 L325,355" fill="none" stroke="none"/>
<!-- Client node -->
<g class="aur-node" data-part="client" tabindex="0" role="button" aria-label="Client Apps" aria-expanded="false">
<rect x="285" y="8" width="80" height="64" rx="8" class="node-shape"/>
<g transform="translate(305,20) scale(1.667)">
<g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon">
<rect width="20" height="14" x="2" y="3" rx="2"/><line x1="8" x2="16" y1="21" y2="21"/><line x1="12" x2="12" y1="17" y2="21"/>
</g>
</g>
<text x="325" y="0" class="node-label" text-anchor="middle" style="display:none;"></text>
</g>
<text x="325" y="94" text-anchor="middle" class="node-label standalone">Client Apps</text>
<!-- Proxy Fleet node -->
<g class="aur-node" data-part="proxy" tabindex="0" role="button" aria-label="Aurora Proxy Fleet" aria-expanded="false">
<rect x="165" y="140" width="320" height="88" rx="10" class="node-shape"/>
<g transform="translate(312,150) scale(1.083)">
<g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon">
<circle cx="6" cy="19" r="3"/><path d="M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15"/><circle cx="18" cy="5" r="3"/>
</g>
</g>
<text x="325" y="200" text-anchor="middle" class="node-label">Proxy Fleet</text>
<text x="325" y="216" text-anchor="middle" class="node-label node-label--sm">(managed by Aurora)</text>
</g>
<!-- Aurora instance nodes (one clickable group covering all five) -->
<g class="aur-node" data-part="aurora" tabindex="0" role="button" aria-label="Auto-scaled Amazon Aurora instances" aria-expanded="false">
<rect x="27" y="300" width="96" height="110" rx="10" class="node-shape"/>
<rect x="152" y="300" width="96" height="110" rx="10" class="node-shape"/>
<rect x="277" y="300" width="96" height="110" rx="10" class="node-shape"/>
<rect x="402" y="300" width="96" height="110" rx="10" class="node-shape"/>
<rect x="527" y="300" width="96" height="110" rx="10" class="node-shape"/>
<g transform="translate(60,313) scale(1.25)"><g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/></g></g>
<g transform="translate(185,313) scale(1.25)"><g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/></g></g>
<g transform="translate(310,313) scale(1.25)"><g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/></g></g>
<g transform="translate(435,313) scale(1.25)"><g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/></g></g>
<g transform="translate(560,313) scale(1.25)"><g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" class="node-icon"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/></g></g>
<text x="75" y="382" text-anchor="middle" class="node-label node-label--sm">Amazon</text>
<text x="75" y="396" text-anchor="middle" class="node-label node-label--sm">Aurora</text>
<text x="200" y="382" text-anchor="middle" class="node-label node-label--sm">Amazon</text>
<text x="200" y="396" text-anchor="middle" class="node-label node-label--sm">Aurora</text>
<text x="325" y="382" text-anchor="middle" class="node-label node-label--sm">Amazon</text>
<text x="325" y="396" text-anchor="middle" class="node-label node-label--sm">Aurora</text>
<text x="450" y="382" text-anchor="middle" class="node-label node-label--sm">Amazon</text>
<text x="450" y="396" text-anchor="middle" class="node-label node-label--sm">Aurora</text>
<text x="575" y="382" text-anchor="middle" class="node-label node-label--sm">Amazon</text>
<text x="575" y="396" text-anchor="middle" class="node-label node-label--sm">Aurora</text>
</g>
<!-- Shared storage banner -->
<g class="aur-node" data-part="storage" tabindex="0" role="button" aria-label="Shared Aurora Storage" aria-expanded="false">
<path d="M15,440 L55,418 L55,430 L595,430 L595,418 L635,440 L595,462 L595,450 L55,450 L55,462 Z" class="node-shape"/>
<text x="325" y="446" text-anchor="middle" class="node-label">Shared Aurora Storage</text>
</g>
<!-- pulse -->
<circle r="7" class="aur-pulse" opacity="0">
<animateMotion id="aur-motion" dur="4s" begin="indefinite" fill="freeze" calcMode="linear" keyTimes="0;0.15;0.5;0.75;1">
<mpath href="#aur-motion-path"/>
</animateMotion>
</circle>
</svg>
</div>
</div>
<style>
.infographic-aurora {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-deep:#1d4ed8;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', -apple-system, sans-serif;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-aurora[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-deep:#3a63c4;
--accent-soft:#202942;
--line: #2c313d;
}
.infographic-aurora * { box-sizing: border-box; }
.infographic-aurora .aur-head {
text-align: center;
padding: 0.5rem clamp(1rem, 4vw, 2rem) 1rem;
}
.infographic-aurora .aur-run-btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
background: var(--accent);
color: var(--paper);
border: none;
border-radius: 999px;
padding: 0.55rem 1.3rem;
font-family: inherit;
font-size: 0.88rem;
font-weight: 600;
cursor: pointer;
transition: opacity 0.15s;
}
.infographic-aurora .aur-run-btn:hover { opacity: 0.88; }
.infographic-aurora .aur-run-btn:disabled { opacity: 0.5; cursor: default; }
.infographic-aurora .run-icon { width: 15px; height: 15px; }
.infographic-aurora .aur-canvas { padding: 0 clamp(0.75rem, 3vw, 2rem) 1rem; }
.infographic-aurora .aur-svg { width: 100%; height: auto; display: block; overflow: visible; }
.infographic-aurora .connector-line {
stroke: var(--line);
stroke-width: 1.5;
stroke-dasharray: 4 3;
}
.infographic-aurora .connector-line.solid { stroke-dasharray: none; }
.infographic-aurora .arrow-fill { fill: var(--ink-soft); }
.infographic-aurora .aur-node { cursor: pointer; outline: none; }
.infographic-aurora .aur-node .node-shape {
fill: var(--paper-alt);
stroke: var(--line);
stroke-width: 1.5;
transition: fill 0.15s, stroke 0.15s, opacity 0.15s;
}
.infographic-aurora .aur-node.is-active .node-shape { stroke: var(--accent); }
.infographic-aurora .aur-node.is-active .node-shape {
fill: var(--accent-soft);
}
.infographic-aurora .node-icon { color: var(--accent); }
.infographic-aurora .node-label {
font-family: var(--display-font);
font-size: 14px;
fill: var(--ink);
}
.infographic-aurora .node-label--sm { font-size: 12px; }
.infographic-aurora .node-label.standalone { pointer-events: none; }
.infographic-aurora .aur-svg.has-active .aur-node:not(.is-active) { opacity: 0.4; }
.infographic-aurora .aur-node:focus-visible .node-shape { stroke: var(--accent); stroke-width: 2.5; }
.infographic-aurora .aur-pulse {
fill: var(--accent);
transition: opacity 0.2s;
}
@media (prefers-reduced-motion: reduce) {
.infographic-aurora * { transition-duration: 0.001ms !important; }
}
</style>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-aurora')
|| document.querySelector('.infographic-aurora');
// --- dark mode detection (cookie / body attribute) ---
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var reducedMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var svg = wrapper.querySelector('.aur-svg');
var nodes = wrapper.querySelectorAll('.aur-node');
var runBtn = wrapper.querySelector('.aur-run-btn');
var pulse = wrapper.querySelector('.aur-pulse');
var motion = wrapper.querySelector('#aur-motion');
function setActive(part) {
nodes.forEach(function (n) {
var isMatch = part && n.dataset.part === part;
n.classList.toggle('is-active', isMatch);
n.setAttribute('aria-expanded', isMatch ? 'true' : 'false');
});
svg.classList.toggle('has-active', !!part);
}
function toggleNode(node) {
var wasActive = node.classList.contains('is-active');
setActive(wasActive ? null : node.dataset.part);
}
nodes.forEach(function (node) {
node.addEventListener('click', function () { toggleNode(node); });
node.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleNode(node); }
});
});
// --- Run Flow animation ---
var totalDur = reducedMotion ? 1200 : 4000;
var stages = [
{ t: 0, part: 'client' },
{ t: totalDur * 0.15, part: 'proxy' },
{ t: totalDur * 0.5, part: 'aurora' },
{ t: totalDur * 0.75, part: 'storage' },
{ t: totalDur, part: null }
];
var timers = [];
runBtn.addEventListener('click', function () {
timers.forEach(clearTimeout);
timers = [];
runBtn.disabled = true;
motion.setAttribute('dur', (totalDur / 1000) + 's');
pulse.setAttribute('opacity', reducedMotion ? '0' : '1');
try { motion.beginElement(); } catch (e) { /* Safari fallback: no-op, stages still play */ }
stages.forEach(function (stage) {
timers.push(setTimeout(function () { setActive(stage.part); }, stage.t));
});
timers.push(setTimeout(function () {
pulse.setAttribute('opacity', '0');
runBtn.disabled = false;
}, totalDur + 50));
});
})();
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@500&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">App connects like normal β AWS handles provisioning, scaling, and shared storage behind the scenes.
π― Exam tip: "No server management," "auto scaling," "pay for actual usage," "unpredictable workload" β Aurora Serverless.