India reached its winning target at 203-9 with two balls to spare.
Captain Mahendra Singh Dhoni celebrates after hitting a six sealing India's victory during the Tri-Nation series final between India and Sri Lanka in Port of Spain. (AFP Photo)
Opener Rohit Sharma anchored the run chase with 58 off 89 deliveries while Suresh Raina (32) and Dinesh Karthik (23) scored crucial middle order runs.
Left-arm spinner Rangana Herath was Sri Lanka's trump card with a career-best 4-20. Fast bowler Shaminda Eranga claimed 2-50 but was pounded for two sixes and a four by Dhoni, who scored 16 in the decisive final over.
Earlier, Kumar Sangakkara's top-score of 71 led Sri Lanka but its last eight wickets subsided for 30 runs and it was bowled out for 201 off 48.5 overs.
Dhoni said he was always confident of getting his side over the line despite the tense finish.
"I think I'm blessed with good cricketing sense," he said. "I thought 15 runs was something I can look for, the reason being the opposition bowler was not someone who was very experienced like (Lasith) Malinga or some of the other bowlers. I thought rather than taking chances against a Malinga or a (Angelo) Mathews, I would take it to the end and take a chance against someone who is not so experienced. It worked and I'm happy it worked."
Dhoni changed his bat for the final flourish. "It was a very heavy bat that was needed at that point of time. The weight of the bat was perfect for slogging," he said.
India's run chase was set back early by Eranga, who claimed two early wickets with the new ball.
Shikhar Dhawan and Virat Kohli both fell to outside edges to wicketkeeper Kumar Sangakkara. Left-hander Dhawan (16) got a big nick while Kohli (2) feathered a drive to leave India on 27-2 in the 11th over.
Rohit Sharma and Karthik rebuilt in a 50-run third wicket stand. Karthik edged a cut hard to slip but India consolidated with Rohit finding another solid ally in Raina, the pair adding 62 for the fourth wicket before Herath turned the match on its head by ripping through the middle order.
Sharma hit five fours and a six before he was bowled playing back to a Herath delivery which crept along the ground.
Suranga Lakmal also chipped in with the wicket of Raina, who edged a big drive, and the innings was in crisis. India was 152-7 in the 38th over.
India fell further behind when Bhuvneshwar Kumar (0) and Vinay Kumar fell to Malinga and Mathews respectively. India needed 20 off 22 deliveries.
Dhoni, who turned 32 four days ago, had been ruled out of the series when he strained a hamstring just over a week ago in Jamaica. But he batted with typical calm to see his side through.
Earlier, the Sri Lankan innings was in good shape at 171-2 in the 38th over before Ashwin, Jadeja and Ishant Sharma inspired the decline.
Bhuvneshwar Kumar had made two early strikes after Dhoni won the toss and chose to bowl.
The seamer claimed both openers in a lengthy opening spell. Upul Tharanga (11) was first to go, at 29-1 in the seventh over, advancing down the pitch but only inside edging his aggressive stroke through to wicketkeeper Dhoni.
Jayawardene followed at 49-2 when he chased a wide outswinger and provided an easy catch for Ashwin at slip.
Sangakkara and Thirimanne had a bit of luck early as they forged a third-wicket stand of 122 to tilt the balance towards Sri Lanka.
Thirimanne was just on 2 when he was dropped by Ashwin at slip off Ishant Sharma, while Sangakkara was 23 when Suresh Raina grassed a difficult return catch.
Veteran Sangakkara went past Sourav Ganguly into sixth place in the leading run-scorers in one-dayers when he reached 9 and played a masterful knock to anchor the innings.
Thirimanne was less fluent but they put their team in a fine position before the dramatic late collapse. Dhoni claimed three stumpings as Jadeja ran through the lower order.