Bottas started from pole position and kept Hamilton at bay as the Mercedes duo went wheel-to-wheel through the opening three bends.
Hamilton attempted a late charge for victory, but Bottas had enough in his pocket to take the chequered flag and move one point clear of the Brit in the title standings.
— Formula 1 (@F1) April 28, 2019
Sebastian Vettel finished third for Ferrari. Charles Leclerc started eighth after he crashed out of qualifying and the Ferrari junior, on a different strategy to the front runners, fought his way back through the field following a fast start, and actually led a large chunk of the race.
But on ageing rubber he began to slow, and by the time he was hauled in for a change of tyres, he had fallen to sixth.
The young Monegasque claimed one position back to take fifth, but he will depart Baku wondering what might have been had it not been for his qualifying blunder.
Red Bull’s Max Verstappen crossed the line in fourth.
The race on the streets of Azerbaijan’s capital city has been one of the sport’s highlights in recent seasons but Sunday’s event failed to live up to its pre-race hype.
Bottas will not mind, though. The Finn failed to win once last year but now has two victories from the opening four rounds.
Mercedes will care little that the race was a dud, too. The Silver Arrows secured their fourth one-two from as many races. So much for a Ferrari revival.
“It was a tough race,” said Bottas. “Lewis was putting pressure on me all the time, so I couldn’t make any mistakes. It was under control and I was happy to see the chequered flag.
“It means a lot. It is incredible as a team what level we are performing to, and I am proud to be part of that. It is only my fifth win, so of course it feels good.”
Hamilton said: “Valtteri made no mistakes and truly deserved the win. For me, it was all lost in qualifying.
“This is the best start to a season we have had.”
There will have been hearts in mouths on the Mercedes pit wall after Hamilton secured the better start. The pair were within centimetres of touching, but the brilliance of both drivers ensured they avoided contact.
Vettel would have been watching on hoping for a collision, but it failed to materialise. He is now 35 points adrift of Bottas and 34 behind Hamilton.
Leclerc roared his way up to fourth after 10 laps. On the quicker rubber, he was, at one stage, three seconds faster than the leaders.
He led after 14 laps as the leading three stopped. On lap 34, he had to come in, and that was where his challenge ended.
There was some joy for Leclerc as he stopped for a second time in the closing stages to take on fresh tyres and post the fastest lap, claiming a bonus point.
He is now 40 points off the championship summit.
McLaren secured a double points finish, with Carlos Sainz seventh, finishing one spot ahead of British rookie Lando Norris.
Daniel Ricciardo provided some unintended amusement when he ran off the track while duelling with Daniil Kvyat and then accidentally reversed into the Russian’s Toro Rosso, ending both of their races.