Edinburgh started well and took an early lead, battering at the Vannes line before a lovely long pass from Price put Goosen over.
Price was then the beneficiary when Darcy Graham broke through and drew the cover defence before feeding the scrum-half to score.
The French side had to respond and they did, Edwards powering over from close range.
Edinburgh produced a fabulous try to regain the initiative. James Lang made the break, exchanged passes with Graham and found Price arriving on a great support line to finish a terrific move.
The momentum was swinging one way and then the other and Vannes were soon back in it. Salesi Rayasi blasted through several weak tackles to take the hosts into the red zone, the ball was recycled and spun wide to Taccola to stroll over untouched.
Jules Le Bail knocked over a penalty early in the second half to edge Vannes in front for the first time.
But substitute Thomson picked out Van der Merwe with a pinpoint crossfield kick and the big winger crossed for the try to wrestle the lead back for Edinburgh.
Their good work was undone by more soft defending as substitute Vili blasted through several tackles to score and slash Edinburgh’s lead to one.
Thomson eased the nerves with a penalty and while Edinburgh had to endure some nervy moments in the closing stages, they held on for an important win.
Vannes: Duplenne, Rayasi, Taccola, Saili, Nakosi, Cotarmanac’h, Le Bail, Moukoro, Beziat, Tafili, Van der Merwe, Mezou, Boulier, Uhila, Edwards.
Replacements: Leafa, Djehi, Bourgeois, Desjeux, Parete, Varney, Vili, Ayarza.
Edinburgh: Goosen, Graham, Currie, Lang, Van Der Merwe, Healy, Price, Schoeman, Cherry, Sebastian, Sykes, Skinner, Ritchie, Crosbie, Muncaster.
Replacements: Harrison, Venter, Rae, Young, Watson, Shiel, Thompson, Tuipulotu.