City got a big scare in the 12th minute when Lewandowski, Mario Gotze and Marco Reus combined, with Gotze eventually taking a shot at goal that Joe Hart pushed on to his post and out for a corner.
The next clear-cut chance of the contest fell to City in the 28th minute with Silva feeding Aguero, but Weidenfeller made a good save in keeping out the Argentine striker's shot.
The City duo once again combined in the 35th minute, with Aguero forcing Weidenfeller into conceding a corner with a fierce shot from outside the penalty area.
Hart was then called into action as he made two important saves inside a minute, first denying Gotze from just yards out before pushing the German playmaker's ferocious shot onto the bar and out for a corner.
Silva could have then given the Citizens the lead on the stroke of half-time, but he failed to find the target from just yards out, before Hart made another important save in injury time from an Ilkay Gundogan attempt.
The second half started on a frenetic pace, with both sides going on the attack.
Hart was forced into action in the 54th minute when he made a diving save to keep out Gotze's curling shot towards the far post.
However, the England international failed to stop Dortmund from taking the lead in the 61st minute.
Jack Rodwell's intended backpass for Matija Nastasic went awry and was intercepted by Reus, who marched towards the City goal and released an unstoppable shot.
Six minutes later Jurgen Klopp's side almost made it 2-0, as Hart denied Gundogan with another brilliant save.
The visitors crafted another golden opportunity to take a two-goal lead in the 76th minute.
Gundogan stole the ball from Yaya Toure and after getting the better of Gael Clichy played a brilliant pass across the City goal for Lewandowski, but the Polish forward missed the target from yards out.
That miss came to haunt the German club in the 89th minute as Balotelli converted the penalty that was conceded by Subotic, who was adjudged to have handled inside his area.