The visitors took the lead on 12 minutes through Mariano's deflected long-range effort.
Balde Keita started the turnaround by surging down the right channel and firing in off the post on the half-hour mark.
On 36 minutes, Radamel Falcao put away the rebound from his own saved penalty to level the scores.
Lyon's comeback appeared to hit a stumbling block when Keita was sent off for two yellow cards, the latter on the stroke of half time.
However, Rony Lopes sealed all three points two minutes from time with a shot from the edge of the area to send the home crowd into raptures.
MONACO (4-2-3-1): Subasic (Sy 15'); Raggi, Jemerson, Glik, Toure; Tielemans, Fabinho; Balde, Moutinho, Lopes; Falcao (Jovetic 55')
LYON (4-2-3-1): Lopes; Tete, Marcelo, Morel, Mendy; Aouar, Ndombele; Traore (Cornet 75'), Fekir, Depay (Maolida 86'); Mariano