The deal, whose terms were not disclosed by the National League club, is reportedly worth $7.5 million with incentive clauses that pay Penny as high as $9 million.
"Brad Penny has long been a pitcher of interest to us and we are thrilled to have him," Cardinals General Manager John Mozeliak said. "By teaming Brad with our Cy Young finalists, Chris Carpenter and Adam Wainwright, in addition to Kyle Lohse, we feel that our pitching staff will continue to be a key cornerstone for the ball club."
Penny, 31, bombed as a free agent for the Boston Red Sox last year. After signing a one-year, $5 million deal, he posted a disappointing 7-8 record, with a 5.61 earned-run average in 24 starts and only one win in his final 11 outings.
He was released by the Red Sox in late August, then finished the season with the San Francisco Giants, ending with 4-1 run and a 2.59 ERA in his final six starts.
For his career, Penny is 105-84 with a 4.14 ERA over 279 games.