Hamilton, who started only ninth, completed the podium places after Kimi Raikkonen retired following a nasty collision with one of his own mechanics during a pit stop.
The mechanic was knocked down and taken to the medical centre to be assessed in an incident which was not out of place during a chaotic race under the floodlights of the Sakhir circuit.
Vettel was on a different strategy to both the Mercedes cars but he masterfully managed his less durable tyres over the line to finish half a second clear of Bottas.
Pole-sitter Vettel was the fastest out of the blocks to retain his lead but Bottas got the jump on Raikkonen to split the Ferraris.
Hamilton, out of position on the grid following an unscheduled gearbox change, failed to make any ground on the opening lap before losing a place to a fast-starting Fernando Alonso.
It looked as though it could get even worse for Hamilton after Max Verstappen’s less than idyllic start to the season took another troubled turn following a collision with Hamilton on lap two.
Hamilton avoided damage, but the same could not be said for Verstappen as he sustained an ultimately terminal left-rear puncture.
On lap four the race resumed, and it was Hamilton who would take centre stage as he started his comeback. His moment of magic arrived seconds later when he picked off three cars.
In a flurry of sparks, Hamilton swooped to the right at 220mph to take the inside line and overtake Alonso, Nico Hulkenberg, and Esteban Ocon in an utterly audacious move at turn one.
By lap six, he was running in fifth after sailing by Kevin Magnussen before repeating the same move on Toro Rosso’s Pierre Gasly two laps later. The race was on.
Vettel, Bottas, Raikkonen, and Hamilton ran line astern before a strategic chess game ensued.
Vettel stopped for the soft rubber on lap 19 with Raikkonen in a lap later for the same tyres.
Bottas was the next in, but in a surprise move he took on the medium compound — the slower but more durable of the three tyres available this weekend. It was a ploy by Mercedes to get their man to the end of the race without having to stop again.
Hamilton now led but Vettel, on the fresher tyres, sailed past his rival on lap 26 with Hamilton immediately called into the pits. Like Bottas, Hamilton was put onto the more durable medium tyres.
With both Mercedes cars going until the end of the race, the question was whether both Vettel and Raikkonen would be able to make their tyres last. Had Mercedes pulled off a masterstroke?
The answer arrived with 21 laps to go when Raikkonen was called in for his second stop, but it would be the concluding action of his night.
Raikkonen was given the nod to leave his marks, but the Finn’s rear-left tyre was still being fitted and as he left his pit box he took one of his mechanics with him.
The mechanic was knocked flat on his back with Raikkonen stopping yards down the road. As the injured Ferrari man was taken to hospital, attention turned back to the track.
Bottas slowly started reeling Vettel in but despite a late lunge on the opening bend of the last lap, the Ferrari driver made his tyres last to hang on for yet another victory.
Hamilton, who had trouble with his radio, crossed the line six seconds further back.