It was the French side that drew first blood midway through the first half, when wing-back Maxwel Cornet stroked home a loose ball after Eric Garcia did well to deny Karl Toko Ekambi. After long spells of City probing, Kevin De Bruyne finally fired home in the 69th minute to restore parity.
But when City looked set to push on and chase a winner, Lyon substitute Moussa Dembele raced through on goal and slotted past Ederson, with VAR ignoring calls for offside in the build-up. Dembele then doubled his tally, tapping home from close range after Ederson spilled a tame initial effort.
Pep Guardiola will be struggling to find positives on a night that City failed to make their supreme talent count against a dogged and savvy Lyon outfit.
City's three-man defence looked sluggish against the pacey Lyon counter, and with Sergio Aguero again missing through injury, the Premier League runners-up were desperately short of a world class No. 9 to put away one or two of their decent chances.
Manager rating out of 10
4 -- Guardiola got his system all wrong in the first half, and in what was a bizarrely cautious and defensive looking City set-up. Selection of certain personnel can also be questioned: Do City really need Fernandinho, Rodri and Ilkay Gundogan in the same starting XI?
Player ratings (1-10; 10 = best, players introduced after 70 minutes get no rating)
GK Ederson, 5 -- Got everything behind a fizzing Fernando Marcal effort in the opening 10 minutes, but was left in no-man's land and had no chance against Cornet's curling effort. His late spillage gifted Lyon a third goal that ended the game as a contest.
DF Eric Garcia, 6 -- Did well to deny Toko Ekambi a shot on goal with a well-timed tackle, but the loose ball landed at the feet of Cornet to stroke home the opener. Certainly, the more solid of the two City centre-backs
DF Aymeric Laporte, 5 -- Attempted to step up to catch the Lyon attack offside but was too slow to do so, and the resulting breakaway led to the Cornet opener, before a loose pass led to Lyon's second. A poor day at the office for the Frenchman.
DF Fernandinho, 6 -- Yellow-carded just before the half-hour mark for cynically clipping the elegant Houssem Aouar, but the Brazilian put in a solid shift and was always alert to impending danger around him. Brought off after 55 minutes as his manager looked to change shape, with Riyad Mahrez replacing him.
DF Joao Cancelo, 7 -- Threaded through some lovely passes for the City frontline, and at times was his team's most dangerous player, which is a damning indictment on his colleagues.
MF Rodri, 6 -- Forced a comfortable save from Anthony Lopes with a somewhat scuffed first-time effort after being teed up by Raheem Sterling in the first half. Booked for a foul on Bruno Guimaraes in the 58th minute, before being replaced by David Silva for the final seven minutes of normal time.
MF Ilkay Gundogan, 5 -- City needed more incision in midfield, and the German failed to provide it in what was a passive performance.
MF Kevin De Bruyne, 6 -- It looked like being a frustrating night for the Belgian, with most of his threat coming from set pieces, but he was in the right place at the right time to arrow home Sterling's lay-off to level the score 1-1.
MF Raheem Sterling, 5 -- Good work in the second half saw him lay the ball on a plate for De Bruyne to guide home a great finish to restore parity, but that will surely be forgotten after a horror miss saw him sky the ball into orbit from five yards out with the score at 2-1.
FW Gabriel Jesus, 6 -- Worked hard with little reward but forced a good save from Lopes after working some space in the Lyon box as the second half became stretched.
MF Riyad Mahrez, 5 -- Failed to get into the game in his half-hour cameo.
MF David Silva, N/R -- The Spaniard had nowhere enough time to make an impact on what will be his final City appearance.