Joao Miranda's headed goal had given the hosts the lead towards the end of the first half, but a stunning effort from Hulk drew the Russian side level.
Arda Turan restored Atletico's lead not long after the equaliser, and then substitute Leo Baptistao scored his first competitive goal for Los Rojiblancos to seal the win.
The most high-profile absentee from Atletico's starting line-up was Diego Costa, who was suspended after being sent off against Viktoria Plzen in last season's Europa League, and Adrian Lopez started in his place in attack, alongside David Villa.
Mario Suarez returned after missing the match with Almeria at the weekend, replacing Tiago Mendes, and Joao Miranda was back in the team after recovering from a fever.
Aside from long-range efforts from Arda Turan and Villa, both of which were saved comfortably by Zenit goalkeeper Yuri Lodygin, neither side created a clear opening until 26 minutes had gone.
It was the hosts who created the danger. Mario Suarez entered the box, chasing the ball after Juanfran's cross had been blocked, and then teed up Koke, who miscued, sending the ball well wide of the far post.
Filipe Luis came closer with a more difficult effort, driving his shot from the edge of the area just a few inches beyond the post in another attack that originated from the right hand side, while Villa later fired a distance shot over the bar.
Atleti continued to prod Zenit, and eventually got the goal their pressure warranted, Miranda heading a whipped corner from Koke in at the near post. Koke then shot just wide of the far post from the edge of the area, and later sent a free-kick towards Diego Godin, who headed high over the bar.
Zenit had offered little in the opening 45 minutes, managing just two efforts on goal, neither of which hit the target.
Luciano Spalletti's Zenit coach Luciano Spalletti made an attacking change at the break, withdrawing defender Luis Neto and replacing him with midfielder Oleg Shatov, and as a result his side had renewed energy and ambition in the second half.
Twelve minutes after the re-start, Atletico goalkeeper Thibaut Courtois was forced to make a stunning save from Aleksandr Kerzhakov.
There was nothing the Belgian stopper could do about Hulk's equaliser three minutes later, however, the Brazil international smashing the ball into the far top corner from 25 yards out. Kerzhakov then saw a free-kick hit the top of the bar, as Atleti looked rattled.
Diego Simeone's men responded, however, and levelled with their next attack.
Koke put in a dangerous free-kick which was pushed out by Lodygin towards Miranda, whose shot was blocked. The ball then fell to Arda, who went for goal, his shot hit a defender but then bounced off the Turkish midfielder again and into the net.
The visitors could not respond to going behind again, and Atleti went for a third.
Gabi saw a free-kick turned wide by Lodygin, Godin later headed over the bar for the third time, and Koke had too much power on his angled shot, which went over.
The match-clinching goal in the end came from an unlikely source, substitute Baptistao. The 21-year-old replaced Adrian in the 79th minute and had the ball in the net in the 80th, curling in a shot from the right-hand side, following excellent work by Arda.