Chelsea thought they opened the scoring inside six minutes through Ziyech but the goal was ruled out after Timo Werner was in an offside position in the build up.
However, Chelsea were the better team throughout the half but their best chance fell to Ben Chilwell who hit a close range volley wide of the post after 19 minutes.
City suffered a blow minutes after the break when De Bruyne picked up an ankle injury and was replaced by Phil Foden.
Less than 10 minutes after De Bruyne’s departure, Chelsea scored after Werner set up Ziyech to score in an empty net after City goalkeeper Zack Steffen found himself in a poor position.
The American made up for his mistake moments later when he made a good save to deny Ziyech from doubling Chelsea’s lead.
City came close to leveling the score but Ruben Dias was unable to convert his header from inside the box which sailed over the bar.
Substitute Christian Pulisic thought he grabbed a second in stoppage time but it was ruled out for offside but Chelsea held on to reach another FA Cup final.
Chelsea face Leicester City or Southampton, who play their semifinal on Sunday, in the final on May 15.