Three players remained from City's triumph over Borussia Dortmund in Ruben Dias, Rodri and Kevin De Bruyne, whereas Chelsea started Kepa Arrizabalaga, Timo Werner and Hakim Ziyech.
Chelsea should've taken the lead from a first-time volley at the back-post by Ben Chilwell before 20 minutes following a cross from Reece James, but the fullback dragged wide.
James took matters upon himself following the last 12 minutes of the half, as he curled a cutback from the area following a corner-kick narrowly past target.
The Citizens began to come alive after a quiet spell and watched Fernandinho nod a floating ball into the centre of the area from De Bruyne a minute to the break beyond reach.
An injury concern to Pep Guardiola's City had De Bruyne limping off two minutes after halftime, which saw the arrival Wednesday's match-winner Phil Foden thrown in for the Belgian.
Chelsea put the brakes on the Premier League leaders ten minutes from halftime and hit the front through a close-range finish from Ziyech after being released by Werner.
Ziyech was in for a brace from a looping ball over the defence towards the midway point of the second half, but Zack Steffen parried from point-blank range.
The Blues were put under pressure in the closing minutes with promising attempts from Rodri and Raheem Sterling amongst others, however neither troubled Arrizabalaga.
Chelsea had the ball in the net again in the dying minutes through Christian Pulisic, but he was flagged for offside however it didn't matter as they went on to win for a spot in the final.