π§© AWS Glue
Organizations pull data from databases, apps, and S3 β often in different formats that make analysis hard.
AWS Glue is AWS's fully managed ETL service β extracts data from various sources, transforms it into the format you need, and loads it into a destination for analysis.
π― Exam Tip
β Glue = fully managed serverless ETL service
β ETL = Extract, Transform, Load
β Prepares/transforms data before analysis
β Commonly pairs with S3, RDS, Redshift, Athena, EMR
β "ETL" β AWS Glue
π§ Core Idea
Data lives in multiple places and formats β customer data in RDS, sales reports in S3, logs elsewhere. Before you can analyze it all together, it needs cleaning, combining, or reformatting. That process is ETL, and Glue automates it with no servers to manage.
π What is ETL?
Extract β pull data from one or more sources
Transform β clean, modify, combine, or reformat it
Load β store the result in its final destination for analysis
Extract β Transform β LoadβοΈ How Glue Works
Say your data lives in S3 and RDS, and you want to analyze it all in Redshift:
<div class="infographic-etl2">
<style>
.infographic-etl2 {
--paper: #ffffff;
--ink: #1a1a1a;
--line: #444444;
--accent: #2563eb;
--s3-color: #2e7d32;
--rds-color: #205ec9;
--glue-fill: #8c4fff;
--body-font: 'Inter', -apple-system, sans-serif;
max-width: 880px;
margin: 0 auto;
box-sizing: border-box;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-etl2[data-theme="dark"] {
--paper: #121212;
--ink: #e8e6e1;
--line: #9a968c;
}
.infographic-etl2 * { box-sizing: border-box; }
.infographic-etl2 .etl2-inner { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1rem, 4vw, 2rem); }
.infographic-etl2 .etl2-controls {
display: flex;
gap: 0.6rem;
margin-bottom: 1.5rem;
}
.infographic-etl2 .etl2-btn {
display: inline-flex;
align-items: center;
gap: 0.4rem;
background: var(--accent);
color: #fff;
border: none;
padding: 0.5rem 1rem;
font: inherit;
font-weight: 600;
font-size: 0.82rem;
cursor: pointer;
}
.infographic-etl2 .etl2-btn.etl2-reset {
background: none;
color: var(--ink);
border: 1px solid var(--line);
}
.infographic-etl2 .etl2-btn:disabled { opacity: 0.5; cursor: default; }
.infographic-etl2 .etl2-btn svg { width: 12px; height: 12px; }
.infographic-etl2 svg.etl2-diagram { display: block; width: 100%; height: auto; }
.infographic-etl2 .etl2-label {
font-size: 15px;
font-weight: 400;
fill: var(--ink);
font-family: var(--body-font);
}
.infographic-etl2 .etl2-bold {
font-size: 15px;
font-weight: 700;
fill: var(--ink);
font-family: var(--body-font);
}
.infographic-etl2 .etl2-tag {
font-size: 14px;
font-weight: 400;
fill: var(--ink);
font-family: var(--body-font);
}
.infographic-etl2 .etl2-connector {
fill: none;
stroke: var(--line);
stroke-width: 1.5;
transition: stroke 0.2s, stroke-width 0.2s;
}
.infographic-etl2 .etl2-connector.is-lit {
stroke: var(--accent);
stroke-width: 2.2;
}
.infographic-etl2 .etl2-box {
transition: filter 0.25s, transform 0.25s;
transform-box: fill-box;
transform-origin: center;
}
.infographic-etl2 .etl2-box.is-pulsing {
transform: scale(1.06);
filter: drop-shadow(0 0 6px rgba(140,79,255,0.6));
}
.infographic-etl2 .etl2-packet {
fill: var(--accent);
opacity: 0;
transition: cx 1.1s ease-in-out, cy 1.1s ease-in-out, opacity 0.2s;
}
.infographic-etl2 .etl2-packet.is-visible { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
.infographic-etl2 .etl2-packet { transition: opacity 0.2s; }
.infographic-etl2 .etl2-box { transition: none; }
}
</style>
<div class="etl2-inner">
<div class="etl2-controls">
<button class="etl2-btn" id="etl2Play">
<svg viewBox="0 0 24 24" fill="currentColor"><polygon points="5,3 21,12 5,21"/></svg>
Play
</button>
<button class="etl2-btn etl2-reset" id="etl2Reset">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M3 12a9 9 0 1 1 3 6.7"/><path d="M3 21v-6h6"/></svg>
Reset
</button>
</div>
<svg class="etl2-diagram" viewBox="0 0 1000 260" xmlns="http://www.w3.org/2000/svg">
<!-- S3 label + icon -->
<text x="150" y="60" text-anchor="end" class="etl2-label">S3 Bucket</text>
<g transform="translate(170,24) scale(2.2)" fill="none" stroke="var(--s3-color)" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
<rect width="20" height="5" x="2" y="3" rx="1"/>
<path d="M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8"/>
<path d="M10 12h4"/>
</g>
<!-- RDS label + icon -->
<text x="150" y="175" text-anchor="end" class="etl2-label">Amazon RDS</text>
<g transform="translate(170,148)">
<rect x="1" y="1" width="52" height="52" rx="3" fill="none" stroke="var(--rds-color)" stroke-width="2"/>
<g transform="translate(11,10) scale(1.3)" fill="none" stroke="var(--rds-color)" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
<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>
<!-- connector lines: S3 + RDS merge, then Extract, then Load -->
<path class="etl2-connector" id="lineS3" d="M226 55 H310 V133 H420"/>
<path class="etl2-connector" id="lineRDS" d="M226 175 H310 V133 H420"/>
<path class="etl2-connector" id="lineExtract" d="M310 133 H420" marker-end="url(#arrowHead)"/>
<path class="etl2-connector" id="lineLoad" d="M550 133 H730" marker-end="url(#arrowHead)"/>
<defs>
<marker id="arrowHead" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto">
<path d="M0 0 L8 4 L0 8 Z" fill="var(--line)"/>
</marker>
</defs>
<!-- Extract / Load labels -->
<text x="365" y="120" text-anchor="middle" class="etl2-bold" id="labelExtract">Extract</text>
<text x="640" y="120" text-anchor="middle" class="etl2-bold" id="labelLoad">Load</text>
<!-- Glue ETL box -->
<text x="490" y="65" text-anchor="middle" class="etl2-label">Glue ETL</text>
<g class="etl2-box" id="glueBox">
<rect x="430" y="80" width="120" height="106" fill="var(--glue-fill)"/>
<g transform="translate(468,108) scale(2)" fill="none" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z"/>
</g>
</g>
<text x="490" y="212" text-anchor="middle" class="etl2-tag">Transform</text>
<!-- Redshift box -->
<g class="etl2-box" id="redshiftBox">
<rect x="760" y="80" width="120" height="106" fill="var(--glue-fill)"/>
<g transform="translate(798,108) scale(1.9)" fill="none" stroke="#ffffff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<path d="M18 21V10a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1v11"/>
<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 1.132-1.803l7.95-3.974a2 2 0 0 1 1.837 0l7.948 3.974A2 2 0 0 1 22 8z"/>
<path d="M6 13h12"/>
<path d="M6 17h12"/>
</g>
</g>
<text x="820" y="212" text-anchor="middle" class="etl2-label">Redshift</text>
<!-- travelling packet -->
<circle class="etl2-packet" id="etl2Packet" cx="226" cy="133" r="6"/>
</svg>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-etl2')
|| document.querySelector('.infographic-etl2');
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 playBtn = wrapper.querySelector('#etl2Play');
var resetBtn = wrapper.querySelector('#etl2Reset');
var packet = wrapper.querySelector('#etl2Packet');
var lineS3 = wrapper.querySelector('#lineS3');
var lineRDS = wrapper.querySelector('#lineRDS');
var lineExtract = wrapper.querySelector('#lineExtract');
var lineLoad = wrapper.querySelector('#lineLoad');
var glueBox = wrapper.querySelector('#glueBox');
var redshiftBox = wrapper.querySelector('#redshiftBox');
var allLines = [lineS3, lineRDS, lineExtract, lineLoad];
var allBoxes = [glueBox, redshiftBox];
var timers = [];
function clearTimers() { timers.forEach(clearTimeout); timers = []; }
function resetState() {
clearTimers();
allLines.forEach(function (l) { l.classList.remove('is-lit'); });
allBoxes.forEach(function (b) { b.classList.remove('is-pulsing'); });
packet.classList.remove('is-visible');
packet.setAttribute('cx', 226);
packet.setAttribute('cy', 133);
playBtn.disabled = false;
}
function play() {
resetState();
playBtn.disabled = true;
var d = 900;
packet.classList.add('is-visible');
lineS3.classList.add('is-lit');
lineRDS.classList.add('is-lit');
timers.push(setTimeout(function () {
lineExtract.classList.add('is-lit');
packet.setAttribute('cx', 420);
packet.setAttribute('cy', 133);
}, 50));
timers.push(setTimeout(function () {
glueBox.classList.add('is-pulsing');
}, d));
timers.push(setTimeout(function () {
glueBox.classList.remove('is-pulsing');
lineLoad.classList.add('is-lit');
packet.setAttribute('cx', 730);
packet.setAttribute('cy', 133);
}, d + 500));
timers.push(setTimeout(function () {
redshiftBox.classList.add('is-pulsing');
packet.classList.remove('is-visible');
}, d + 500 + d));
timers.push(setTimeout(function () {
redshiftBox.classList.remove('is-pulsing');
playBtn.disabled = false;
}, d + 500 + d + 700));
}
playBtn.addEventListener('click', play);
resetBtn.addEventListener('click', resetState);
})();
</script>
</div>1οΈβ£ Extract β reads data from sources like S3 and RDS
2οΈβ£ Transform β removes duplicates, renames columns, reformats data, merges datasets, cleans bad values
(you write the logic, Glue runs it)
3οΈβ£ Load β writes the transformed data to Redshift, S3, or another supported store, ready for analytics
βοΈ Why Use Glue?
Traditional ETL needed dedicated servers. With Glue: no servers to manage, AWS auto-provisions compute, and it scales automatically with your workload β you just focus on transformation logic.
π AWS Glue Data Catalog
A companion service β not typically tested on the Cloud Practitioner exam, but useful to know.
It's a centralized catalog for your dataset metadata: table names, column names, data types, schemas, and locations β a directory of your organization's data.
Glue Data Catalog
β Table names, column names, data types, schemas
π Integrations
Works with Athena, Redshift, and EMR β these services use the catalog to auto-discover datasets and understand schemas before querying/processing.
π― Common Use Cases
ETL, preparing data for analytics, cleaning/transforming datasets, building data pipelines, loading data into warehouses like Redshift.
π Summary
π§© AWS Glue = fully managed serverless ETL service
π ETL = Extract, Transform, Load
π Commonly works with S3, RDS, Redshift
π Glue Data Catalog stores dataset metadata, used by Athena, Redshift, EMR
π― Exam takeaway: "ETL" or "preparing data for analytics" β AWS Glue