I tisdags säkrade Liverpool finalplatsen på spansk mark, via 3–2 mot Villarreal och 5–2 över två matcher.
Manchester City såg ut att göra samma sak. In i matchens sista ordinarie minut ledde Pep Guardiolas gäng med 1–0 och semifinalen sammanlagt med 5–3.
Riyad Mahrez känsliga tillslag i 73:e minuten såg i det läget ut att komfortabelt ta City till klubbens andra raka final, den på Stade de France i Saint-Denis norr om Paris den 28 maj.
Men räkna aldrig bort Real Madrid, i synnerhet inte hemma på Santiago Bernabéu.
Rodrygos underbara kväll
Rodrygo kvitterade i 90:e minuten och i andra tilläggsminuten kom 2–1-målet som tvingade fram förlängning. Rodrygo var ytterst nära ett hattrick minuten senare, men då räddade Ederson.
Värt att påpeka: Innan Rodrygo tog över showen hade Citys inhoppare Jack Grealish ett avslut som rensades undan på mållinjen.
Fem minuter in i förlängningen kom Ruben Dias sent in i duellen med Benzema. Italienske domaren Daniele Orsato dömde straff. Veteranen reste sig och slog in det hittills viktigaste av sina 15 mål i turneringen den här säsongen.
En lika mäktig, som märklig och oväntad upplösning på en match som länge, länge kontrollerades av City.
Thibaut Courtois är den målvakt som stått för flest räddningar i slutspelet och 20 minuter in i matchen höll han Reals finalchans vid liv. Belgaren sträckte ut sina 200 centimeter och styrde undan Bernardo Silvas avslut till hörna.
Matchens klart farligaste chans så långt.
Sysselsatt målvakt
Courtois hölls sysselsatt, inte minst på Phil Fodens rappa skott, i en första halvlek som Manchester City i stora drag kontrollerade. City tog inga som helst risker. Karim Benzema hölls under sträng bevakning från Aymeric Laporte och Ruben Dias. Högerbacken Kyle Walker, som inte spelat på tre veckor på grund av en fotskada, använde effektivt sin fysik och stoppade genombrottsförsöken från Vinicius Junior och Casemiro.
Bara sekunder in i andra halvlek, direkt efter avspark, satsade Real på en variant som så när gav utdelning. Dani Carvajal, Benzema och Vinicius Junior satte full fart framåt.
Carvajal spelade på volley in en långboll, men Vinicius Junior var inte helt i balans vid bortre stolpen och missade målet.
Ancelottis genidrag
Den attacken satte tonen. Ett betydligt modigare och desperatare Real tryckte tillbaka City, som fick fullt upp att freda sin totala ledning. Offensiven spetsades när tränaren Carlo Ancelotti tog ut centrale mittfältare Toni Kroos och skickade in Rodrygo.
Ett genidrag av den erfarne tränaren som i helgen blev den förste att vinna ligan med fem olika klubbar i fem länder.
Ancelotti vann Champions League som tränare för Milan 2003 och 2007. Han tog även titeln med Real Madrid 2014.