Lopez went clear with Alberto Contador (Trek-Segafredo) on the long ascent to the high altitude summit finish to Sierra Nevada, pushing on alone in the final five kilometres to catch and pass earlier attacker Adam Yates (Orica-Scott) to take his first Grand Tour stage win.
Behind Team Sky set a brutal pace to quickly neutralise an attack by Vincenzo Nibali (Bahrain-Merida), before catching and dropping Contador in the final two kilometres.
Froome then matched the final burst of Wilco Kelderman (Team Sunweb) to finish fifth on the stage, extending his lead at the top of the general classification by a few second as Nibali was gapped in the final final throes of the day.
How it happened
The short, mountainous stage 15 saw a viciously fast start, with more than 50km covered in the opening hour. Such a pace meant no breakaway was able to get away until 43km into the stage when Edward Theuns (Trek-Segafredo), Matteo Trentin (Quick Step), Tom Van Asbroeck (Cannondale-Drapac), Sander Armée (Lotto-Soudal), Lluis Mas (Caja Rural-Seguros RGA), Anthony Perez and Stéphane Rossetto (Cofidis) and Nelson Oliveira (Movistar) were able to slip away.
Trentin unsurprisingly took the day's intermediate sprint, before they hit the opening climb of the day: the first-category Alto de Hazallanas.
This long and testing climb immediately decimated the break, with Rossetto going solo with Armée riding hard in pursuit before catching and passing his French rival.
Back in the peloton, the main group was led by riders from the teams of the GC contenders, with a number of the contenders for the red jersey fancying their chances. However the pace wasn't high enough to deter attacks, with Romain Bardet (Ag2r La Mondiale) attack with Adam Yates (Orica-Scott) and Steven Kruijswijk (LottoNL-Jumbo) in close attendance.
By the summit of the climb, Bardet, Yates and Kruijswijk were little over than a minute behind Armée, and had almost two minutes on the chasing peloton.
The gaps remained steady on the following descent, but with the final 35km effectively being one continuous climb, Armée was steadily reeled in by the Bardet group, while the peloton also cut the gap to under a minute going into the final 30km.
The first big move from the GC contenders came with 27km remaining as Alberto Contador attacked out of the peloton, dragging Miguel Angel Lopezalong with him. That move didn't prompt any panic in the ranks of Team Sky, with three riders still setting a steady pace ahead of Chris Froome on the front of the bunch.
Contador quickly opened a gap of around 20 seconds, while at the front of the bunch Yates was also on the attack, moving clear of Bardet and Kruijwsijk.
Cruelly, the race organisers put a KOM point midway up the final climb, with only a brief descent to break the rhythm. Yates led over the KOM point, with just over a minute back to Contador, Lopez, and a rejuvenated Bardet, while Sky continued to lead the peloton 45 seconds further back.
With the gap between Contador and the rest of the contenders going out to 1-20, Nibali decided the time was right to counter-attack with 13km remaining, quickly opening a gap just as he had done with attacks in previous stages.
However as was also the case in previous stages, Nibali was quickly caught by the red jersey, with Froome still having Mikel Nieve and Wout Poels to set tempo on the front.
Nieve was the rider being used up first, and the Spaniard's effort was having an effect as the gap to Yates came do to 1-30 with seven kilometres remaining, while the Contador group was only 35 seconds up the road.
The next acceleration came from Lopez, who surged clear of Contador and Bardet as he went in search of his first win in a Grand Tour, and also move up the general classification.
The young Colombian made short work of bridging to Yates and went straight over the top as the Orica-Scott rider ground to a halt after trying to match the move.
Meanwhile Poels had taken over the work for the red jersey, and had caught Contador and Bardet, both riders moving into the wheels of the group. However Poels' effort was not bringing back Lopez, who still held a lead of a minute going into the final couple of kilometres.
With 1.5km Ilnur Zakarin (Katusha-Alpecin) leapt out of the group of favourites, which prompted Sky to raise the pace once again and Contador to be shelled out of the back.
Zakarin's effort wasn't enough to catch Lopez, who crossed the line alone to take a fine stage win, while Kelderman took third with Chaves, Froome, and Nibali all in close attendance. However Contador was losing time, struggling through the final few hundred metres to concede 40 seconds to Froome.
Vuelta a España 2017, stage 15: Alcalá la Real to Sierra Nevada (129.5km)
1. Miguel Angel Lopez (Col) Astana Pro Team, in 3-34-41 03:34:41
2. Ilnur Zakarin (Rus) Katusha-Alpecin, at 36 secs 00:00:36
3. Wilco Kelderman (Ned) Sunweb, at 45 secs 00:00:45
4. Esteban Chaves (Col) Orica-Scott, at 47 secs 00:00:47
5. Christopher Froome (GBr) Team Sky, at 47 secs
6. Michael Woods (Can) Cannondale-Drapac, at 50 secs 00:00:50
7. Vincenzo Nibali (Ita) Bahrain-Merida, at 53 secs 00:00:53
8. Wout Poels (Ned) Team Sky, at 53 secs
9. Louis Meintjes (RSA) UAE-Team Emirates, at 53 secs
10. Pello Bilbao (Esp) Astana, at 1-02
11.Fabio Aru (Ita) Astana, at 1-02
13. Alberto Contador (Esp) Trek-Segafredo, at 1-27
General classification after stage 15
1. Christopher Froome (GBr) Team Sky, in 62-06-25
2. Vincenzo Nibali (Ita) Bahrain-Merida, at 1-01
3. Ilnur Zakarin (Rus) Katusha-Alpecin, at 2-08
4. Wilco Kelderman (Ned) Team Sunweb, at 2-11
5. Esteban Chaves (Col) Orica-Scott, at 2-39
6. Miguel Angel Lopez (Col) Astana, at 2-51
7. Fabio Aru (Ita) Astana, at 3-24
8. Michael Woods (Can) Cannondale-Drapac, at 3-26
9. Alberto Contador Velasco (Esp) Trek-Segafredo, at 2-59
10. Wout Poels (Ned) Team Sky, at 5-22
Thank you for reading 20 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try first month for just £1 / $1 / €1