Lyon, who upset Juventus and Manchester City in the previous rounds, had warmed up on the field before the game with rarely seen intensity and it showed as they took the game to Bayern and they went close again in the 17th minute.
Powerful striker Karl Toko Ekambi found space in the Bayern box and should have done better after his first shot was blocked and his follow-up effort struck the post.
But moments later Bayern grabbed the lead – a clever ball from Joshua Kimmich found Gnabry who danced in from the right and unleashed an unstoppable shot, from over 20 metres out, into the top corner.
Gnabry went close again with a snap-shot that Lyon keeper Anthony Lopes did well to keep out as Bayern pushed hard for a second.
It came in the 33rd minute – and was started and finished by Gnabry.
The former Arsenal midfielder fed Ivan Perisic on the left and the Croatian’s low cross found Robert Lewandowski at the back post.
His weak shot was saved by Lopes, only for the alert Gnabry to pounce and convert his ninth goal in nine Champions League games.
Lewandowski, looking well below his usual levels of sharpness, had another good chance after the interval, but he again made it too easy for Lopes, leaving Lyon still with hope.
Moussa Dembele, the two-goal hero in the quarter-final win over Manchester City, came on for Depay in the 58th minute and added much-needed life to the Lyon attack.
But once again, when the chance came for the French side, they failed to make the most of it — Houssem Aouar finding Ekambi in the box but the Cameroonian’s finish was straight at Manuel Neuer.
Bayern lacked the intensity of their first-half display but they made sure of the win in the 88th minute when Lewandowski rose to head home a Kimmich cross from a free kick.