The game had looked as if it was heading for a draw until the striker arrived to slot home Kenny McLean’s cross.
Bristol City took the lead in the 34th minute when Jason Knight finished well from Mark Sykes’ ball in.
But a George Tanner own goal in the 59th minute put Norwich level before Idah’s injury-time winner.
Norwich’s third win in four matches means they leapfrog their opponents into 13th in the Championship table, while Robins boss Liam Manning’s side drop to 14th after back-to-back defeats.
Both sides had early openings, with Norwich defender Shane Duffy sending a header over the bar before Taylor Gardner-Hickman forced Angus Gunn into a smart save.
The Canaries were inches away from opening the scoring in the 24th minute when Onel Hernandez struck the post with a shot from the edge of the box.
But it was the Robins who seized the advantage 10 minutes later when Knight pounced on Sykes’ cross.
Manning’s side had their tails up and twice went close to doubling their lead before the break, with Gunn saving from Tommy Conway before tipping a Knight header over the bar.
Norwich failed to register a shot on target in the opening 45 minutes but started the second half with much more attacking intent, with Ashley Barnes and Marcelino Nunez forcing Max O’Leary into saves and Gabriel Sara having a couple of efforts blocked.
David Wagner’s side got their reward, albeit with a slice of good fortune, shortly before the hour mark through an own goal when Tanner diverted Dimitris Giannoulis’ cross past his own goalkeeper.
The hosts then went in search of a winner but Sam Bell’s shot was off-target and a Conway header was well held by Gunn, before Idah popped up with the crucial intervention with his sixth goal of the season, sparking wild celebrations and a hug from boss Wagner, who ran on to the pitch to congratulate the Republic of Ireland international.
“It’s a tough one to take really, in terms of the manner of the goals we conceded. They were on us rather then them having to work hard for them so that’s probably the biggest frustration.
“We worked hard to create an opportunity and score a fantastic goal but if you don’t get the small details right you get punished for it. It’s a frustrating one.
“When the pressure comes we have to step up and deal with it and be brave and force the momentum back on the opposition. It’s been a heavy week but it’s allowed me to learn a lot about the players.”
“It was quite emotional for us. It was a tight and even game. We started both halves better than our opponent. In the first half we hit the post and missed a clear-cut chance, then with their first opportunity they scored.
“I think when you come back from 1-0 down and win with the last action of the game there is emotion and that’s what everyone has shown today. I know how much everyone invests to win football matches and most games get decided by small margins.
“I said at half-time we are capable of winning this. We have good characters and they try to make things happen. He (Idah) is at the moment the most dangerous substitute in the league and big credit to him. He is always switched on and when the opponent gets tired he can cause problems.”