In the final moments of this epic battle, Kevin De Bruyne continued to give everything, bursting forward to try to force a winner.
His ball to Erling Haaland was cut out and De Bruyne's shoulders dropped. He had nothing left in the tank, but had given his all to rescue a draw for Manchester City.
As he has done so often in the past, De Bruyne hauled City out of a hole, his majestic 67th-minute equaliser making it honours even in the Bernabeu.
His was a remorseless display, leading from the front, showing his enduring class with his crucial goal and leading by example with his relentless drive.
All the talk before the game was of City getting revenge for last season's agonising semi-final defeat to Real, when a place in the final was within their grasp.
While this result did not serve to fully avenge that heartbreaking exit, it went a long way to exorcising it, with City showing great resolve to earn a draw.
De Bruyne's strike extended City's unbeaten run to 21 games and Pep Guardiola and his players will fancy themselves to get the job done at home, when they host the holders at the Etihad Stadium.
A showdown between the two best sides in Europe more than lived up to its billing, with the two teams trading blows right up to the final whistle.
On the eve of the game, Guardiola warned his players not to be consumed by revenge for last season's dramatic exit so close to getting over the line.
Leading 1-0 on the night and 5-3 on aggregate, Real scored in the 90th and 91st minutes, before winning the tie in extra-time after City's implosion.
City could have gone the same way when they went behind here, but it is a measure of their collective strength of character that they fought back.
Just as they did in the both legs of the semi-final a year ago, City dominated possession and dictated the pace and tempo of the game.
John Stones started at the back, but drifted into his now familiar midfield role whenever City had the ball, which was most of the time.
But the longer City failed to turn their dominance of possession into the hard currency of a goal, they remained vulnerable, and so it proved.
Eduardo Camavinga exchanged passes with Luka Modric in the 36th minute, then set off on a surging forward run towards City's goal.
Camavinga slipped the ball inside to Vinicius and, with City's defence backing off, the Brazilian unleashed an unstoppable shot which flew past Ederson.
It was a brutal reminder to City – as if they needed one after last season - of Real's ability to score from nothing and turn a game on its head.
City had been in complete control up until that point, but the goal sapped their early swagger and they paid the price for not scoring when on top.
When City did manage to threaten, they were thwarted, David Alaba executing a perfectly-timed challenge to stop Erling Haaland as he prepared to shoot in the 55th minute.
But they got the equaliser their endeavour merited, Ilkay Gundogan laying the ball off to De Bruyne, who swept a rasping shot beyond the reach of his Belgium team-mate Courtois.
In the final minute, Ederson pulled off a majestic save at full stretch to deny sub Aurelien Tchouaméni and set up an epic second leg next week.