John Stones was sent off in the 44th minute for a cynical tackle on Jacob Ramsey, giving the Villans a numerical advantage.
However, the advantage lasted just a few minutes as Aston Villa right-back Matty Cash was also shown a red card after a second bookable offense.
Despite both sides mustering plenty of shots on target, the match was largely cagey, with Manchester City below their sparkling best. Nonetheless, Pep Guardiola's men held on to secure victory and now need just eight more points to seal a fifth league title.
Here are the player ratings for Manchester City:
Manchester City player ratings against Aston Villa
Ederson Moraes - 6/10
Ederson Moraes probably conceded the earliest goal of his career on Wednesday. He also slipped while taking a goal-kick and almost gifted Aston Villa another goal.
Kyle Walker - 7/10
Kyle Walker put in a decent performance for Manchester City on Wednesday. He made some crucial blocks and even drove forward with purpose, linking up with the attackers.
John Stones - 5/10
It was a miserable day for John Stones, who failed to clear his line in the build-up to Aston Villa's opening goal. He then got sent off for a studs-up challenge on Ramsey even before the first-half drew to a close.
Ruben Dias - 6.5/10
Ruben Dias recovered from a rocky start and showed composure in Manchester City's defense. He timed his tackles to perfection and made four clearances on the night.
Oleksandr Zinchenko - 6/10
Oleksandr Zinchenko was beaten in the build-up to Aston Villa's goal and never quite recovered. His accurate passing (he completed 95% of them) was the only highlight of an otherwise mediocre performance.
Bernardo Silva - 7/10
The amount of space that Aston Villa left for Bernardo Silva to exploit was incredible. The Portuguese midfielder made the most of it and registered two beautiful assists.
Rodrigo - 7/10
Rodrigo scored a rare goal, which turned the screw on Aston Villa. He always kept Manchester City ticking with his accurate passes.
Ilkay Gundogan - 7/10
Ilkay Gundogan donned the captain's armband but never let the added responsibility affect him. His first touch was sharp, and he helped control the game's tempo throughout the night.
Riyad Mahrez - 7/10
Riyad Mahrez was in inspired form and troubled Aston Villa by constantly driving into pockets of space in their final third.
Gabriel Jesus - 6/10
Pep Guardiola deployed Gabriel Jesus at the break in a bid to shore up the backline after John Stones' sending-off. However, the Brazilian's impact in the opening stanza was minimal.
Phil Foden - 8/10
Phil Foden was Manchester City's best player on Wednesday. He always looked to make something happen. His lightning-quick movements and passing range caused plenty of headaches for Aston Villa, who tried every trick in the book to stop him.
To top it all off, the 20-year old even sparked the comeback with a composed finish in the 20th minute.
Aymeric Laporte - 7/10
Aymeric Laporte ensured there were no problems at the back in the second half and kept everything tight in defense.
Fernandinho - N/A
The Brazilian had too little time to impact the game.