Terms were not disclosed, but the deal is worth $13 million, MLB.com is reporting.
Estrada, 34, is 9-8 with a 4.84 ERA in 31 starts this season, striking out a career-best 170 batters. He was an All-Star for the Blue Jays in 2016 when he went 9-9 with a 3.48 ERA in 29 starts.
He then re-signed with the team after the 2015 season, getting a two-year, $26 million contract. He is making $14.5 million this season.
Estrada made six postseason starts in 2015 and 2016 for the Blue Jays, going 3-3 with a 2.64 ERA.