The Norwegian striker had barely touched the ball before Kevin De Bruyne picked up possession outside the Bayern Munich box, fed Jack Grealish and his pass across the six-yard box was slid home by Haaland.
The game, which had been delayed 15 minutes due to an electrical storm, was then paused as another storm passed over Lambeau Field, causing the referee to take the players off and allow the near-80,000 crowd to take refuge on the concourses.
City had already gone close to opening the scoring twice though shots by De Bruyne and Grealish that whistled a foot wide of either post.
READ ALSO: Bafana secure win in away CHAN qualifier against Comoros
Bayern also had the ball in the net in those opening minutes, but the effort was ruled out for offside.
After almost a 45-minute delay, the players came back out, warmed up and the game resumed.
Haaland was quickly in the action again, racing onto a long ball and into the box with defenders chasing behind, but he was denied as he cut back inside of a challenge when he looked about to square to Riyad Mahrez.
And Haaland netted again on 40 minutes, burying a cushioned pass from Bernardo past Manuel Neuer, but the assistant referee’s flag meant it was ruled out – harshly, judging by the TV replays.
That was the last action of the slightly truncated first-half, with a five-minute interlude following during which Julian Alvarez replaced Haaland.
READ ALSO: Koulibaly opens up after joining Chelsea
Alvarez was quickly into the action and fired a low shot across goal and just wide of the right-hand post.
The impressive Josh Esbrand-Wilson and Mahrez also had half-chances as City continued to control proceedings.
Rico Lewis came on for the final couple of minutes and struck the post, but – perhaps because it was written in the stars – Erling Haaland’s goal settled the game in Green Bay.