Teheran, the first pitcher to make six consecutive Opening Day starts for the Atlanta Braves, became a free agent after the Braves declined a $12 million club option for 2020.
The 28-year-old Teheran joins Dylan Bundy as right-handers who have joined the Angels' staff this winter. Teheran, Bundy, Andrew Heaney, Shohei Ohtani and Griffin Canning are the likeliest five to be in an Opening Day rotation at present, though the Angels still could add pitchers.
The Angels had the second-highest ERA in the major leagues last season at 5.64 ERA and have made pitching a major priority during the offseason. They tried to sign Gerrit Cole, who joined the New York Yankees, and have turned their attention toward Dallas Keuchel and Hyun-Jin Ryu.
Atlanta's move to decline Teheran's option was not unexpected on the heels of him being left off the postseason roster after going 10-11 with a 3.81 ERA, though he was added back to the squad as an injury replacement when Chris Martin went down in Game 1 of the NL Division Series against the St. Louis Cardinals.
Teheran wound up taking the loss coming out of the bullpen in Game 4. That forced a deciding game, in which the Braves gave up a record 10 runs in the first inning and ended the season with a 13-1 loss.
The right-hander has had higher walk rates and no longer has the huge velocity that led to him getting a six-year, $32.4 million deal in 2013. Teheran is one of the only true sinkerballers among MLB starters, which has improved his ground-ball rate after hitters have caught up with his four-seamer.
Teheran had an eight-start stretch in May and June, covering 44 innings, when he didn't allow a home run and posted a 0.81 ERA.
He had been a member of the Braves rotation since 2013, twice winning 14 games and making a pair of All-Star teams. He has a 77-73 career record, with five complete games, three shutouts, 1,184 strikeouts and a 3.67 ERA in 229 major league games, including 226 starts.
ESPN's Keith Law and The Associated Press contributed to this report.