His deal, the first for a starting free-agent pitcher this offseason, includes an $8.5 million mutual option for 2013.
The 33-year-old was acquired from Cleveland on July 31 and was 4-4 with a 3.48 ERA in 12 starts for the Cardinals. Overall, he was 10-11 with a 4.22 ERA for the Cardinals and Indians.
A 2004 AL All-Star, Westbrook has a 73-75 career record with a 4.29 ERA in 10 major league seasons. He pitched three games for the New York Yankees as a rookie in 2000, then spent his entire career with Cleveland before this year's trade.
"Having Jake signed is a great start to our offseason," general manager John Mozeliak said. "We witnessed firsthand last season what a terrific competitor he is and how well he fits in with our pitching staff."
Westbrook gives the Cardinals depth in a rotation headed by 21-game winner Adam Wainwright and 2005 NL Cy Young winner Chris Carpenter and lefty Jaime Garcia, who won 13 games and was third in the NL rookie of the year balloting. Kyle Lohse has been dogged by injuries most of the last two seasons but was a 15-game winner in 2008.
Westbrook was 3-1 with a 2.92 ERA the final month of last season. He won 14 or more games three consecutive seasons from 2004-06, topping 200 innings each time, but missed all but five starts in 2008 and '09 after undergoing reconstructive elbow surgery.
The Cardinals sent outfielder Ryan Ludwick to the Padres as part of a three-team deal that brought Westbrook to St. Louis.