Vettel led every lap of the race, quickly building a comfortable lead over Valtteri Bottas and controlling the gap from there.
The most eventful part of Vettel's race after that came at the start of the final lap, when the chequered flag was shown more than one lap early.
Vettel was aware enough of the error to complete the full distance at racing speed, although after he crossed the line at the end of the 70th and final lap, the race result was then based on positions at the end of lap 68.
Bottas's main challenge from behind came at the start when a fast-starting Max Verstappen pulled alongside into Turn 1, but Bottas held onto the inside line for Turn 2 and forced the Red Bull driver to back out.
After that moment, which Verstappen was praised for by his team as he avoided getting caught up in an incident, the Dutchman was never able to mount another attack.
Bottas did have a minor scare with 15 laps to go, when he went wide at Turn 1 after lapping Carlos Sainz's Renault, and clipped the grass at Turn 2, briefly falling back behind the Renault.
The second Red Bull of Daniel Ricciardo claimed fourth place, taking advantage of difficulties for Hamilton early in the race to jump the Mercedes during the pitstops.
While the Red Bulls pitted earlier than the other leading cars were scheduled to due to starting the race on the hypersoft tyre, Hamilton also came in around the same time despite being on ultrasofts that should have been able to last much longer.
But he was forced into an early stop so Mercedes could attempt to rectify an engine problem, with the reigning world champion having reported "drop outs of power" early in the race.
After falling behind Ricciardo during those stops, Hamilton was then vulnerable to Kimi Raikkonen's Ferrari also getting ahead of him when the Finn stopped much later in the race, but he hung on to fifth place as Raikkonen emerged from the pits just behind him at Turn 2.
Despite having tyres that were 16 laps fresher than Hamilton's, Raikkonen couldn't mount a challenge, gradually falling back from the Mercedes.
Mercedes offered Hamilton the option of turning down his engine in the closing laps, but he declined, pressuring Ricciardo and getting to within a second of the Red Bull.
Hamilton got close at the hairpin with four laps to go, but was unable to attempt a pass down the following straight after having a big slide in the middle of the corner, and he then lost further time on the following lap stuck behind Sergey Sirotkin's Williams.
Behind the leading cars, Renault took a one-two finish in the 'Class B' race, with Nico Hulkenberg leading home Sainz to claim seventh and eighth for the team.
Esteban Ocon, who was ahead of both Renaults early in the race, was the first car to make a scheduled pitstop, and he lost out to Hulkenberg and Sainz having been holding them up before he suffered a slow pitstop, which relegated him to ninth.
Ocon came back at the Renaults in the closing stages of the race, prompting Renault to ask Hulkenberg to pick up the pace to prevent Sainz coming under attack.
The final point went to Charles Leclerc, who inherited 10th when Fernando Alonso retired after reporting a loss of drive.
The Sauber driver headed the Spaniard early in the race, but he lost out to the McLaren during the pitstops, only to reclaim the position when Alonso came into the pits again to retire.
The only other drivers not to finish were Brendon Hartley and home driver Lance Stroll, who crashed in spectacular fashion at Turn 5 on the opening lap.
Stroll got out of shape through the fast right-hand kink, squeezing Hartley, who was on his left, between the Williams and the tyre barrier, briefly launching the Toro Rosso into the air.
After being checked at the medical centre, Hartley was then sent to hospital for further checks.
|3||33||Max Verstappen||RED BULL RACING TAG HEUER||68||+8.360s||15|
|4||3||Daniel Ricciardo||RED BULL RACING TAG HEUER||68||+20.892s||12|
|7||27||Nico Hulkenberg||RENAULT||67||+1 lap||6|
|8||55||Carlos Sainz||RENAULT||67||+1 lap||4|
|9||31||Esteban Ocon||FORCE INDIA MERCEDES||67||+1 lap||2|
|10||16||Charles Leclerc||SAUBER FERRARI||67||+1 lap||1|
|11||10||Pierre Gasly||SCUDERIA TORO ROSSO HONDA||67||+1 lap||0|
|12||8||Romain Grosjean||HAAS FERRARI||67||+1 lap||0|
|13||20||Kevin Magnussen||HAAS FERRARI||67||+1 lap||0|
|14||11||Sergio Perez||FORCE INDIA MERCEDES||67||+1 lap||0|
|15||9||Marcus Ericsson||SAUBER FERRARI||66||+2 laps||0|
|16||2||Stoffel Vandoorne||MCLAREN RENAULT||66||+2 laps||0|
|17||35||Sergey Sirotkin||WILLIAMS MERCEDES||66||+2 laps||0|
|NC||14||Fernando Alonso||MCLAREN RENAULT||40||DNF||0|
|NC||28||Brendon Hartley||SCUDERIA TORO ROSSO HONDA||0||DNF||0|
|NC||18||Lance Stroll||WILLIAMS MERCEDES||0||DNF||0|
|4||Daniel Ricciardo||AUS||RED BULL RACING TAG HEUER||84|
|6||Max Verstappen||NED||RED BULL RACING TAG HEUER||50|
|7||Fernando Alonso||ESP||MCLAREN RENAULT||32|
|10||Kevin Magnussen||DEN||HAAS FERRARI||19|
|11||Pierre Gasly||FRA||SCUDERIA TORO ROSSO HONDA||18|
|12||Sergio Perez||MEX||FORCE INDIA MERCEDES||17|
|13||Esteban Ocon||FRA||FORCE INDIA MERCEDES||11|
|14||Charles Leclerc||MON||SAUBER FERRARI||10|
|15||Stoffel Vandoorne||BEL||MCLAREN RENAULT||8|
|16||Lance Stroll||CAN||WILLIAMS MERCEDES||4|
|17||Marcus Ericsson||SWE||SAUBER FERRARI||2|
|18||Brendon Hartley||NZL||SCUDERIA TORO ROSSO HONDA||1|
|19||Romain Grosjean||FRA||HAAS FERRARI||0|
|20||Sergey Sirotkin||RUS||WILLIAMS MERCEDES||0|
|3||RED BULL RACING TAG HEUER||134|
|6||FORCE INDIA MERCEDES||28|
|7||SCUDERIA TORO ROSSO HONDA||19|