Ulster beat brave Edinburgh to set up a Heineken Cup final against Leinster or Clermont-Auvergne on 19 May.
Ruan Pienaar kicked the first of his five penalties to put Ulster ahead although Greig Laidlaw replied to give Edinburgh a 6-3 advantage.
Pedrie Wannenburg's try restored Ulster's lead as Edinburgh wasted three try-scoring chances before half-time.
Two more Laidlaw penalties cut Ulster's lead but three Pienaar kicks made the game safe despite Jim Thompson's try.
Edinburgh, the first Scottish team to qualify for a European Cup semi-final, burst into the Ulster 22 in the opening minute with Tim Visser claiming that he had been impeded by Stephen Ferris after his chip behind the defence.
However, referee Romain Poite waved aside the Dutchman's protests and the French whistler penalised Allan Jacobsen for a collapsed scrum in the fourth minute, which allowed Pienaar to kick the opening points from halfway.
But Edinburgh were on terms within four minutes as Laidlaw, in near silence, levelled from 35m and the fly-half repeated the dose to put the Scots ahead four minutes later.
However, Edinburgh's lead was shortlived as Ulster pressure yielded a scrum just short and as the Scottish club's front five were pushed back alarmingly, Wannenburg reached over for the try.
Mike Blair claimed that the ball had come out of the scrum but Poite disagreed and Pienaar slotted the conversion.
Edinburgh, playing an attractive off-loading game, fought back to dominate possession in the remainder of the first half but they wasted three glorious try-scoring changes.
The Scots charged to within two yards of the Ulster line in the 25th minute but the ball squirted out of a ruck which allowed Pienaar to clear.
Ulster were then temporarily reduced to 14 when Stefan Terblanche was sin-binned for throwing a punch at Ross Ford at a ruck.
Edinburgh sensed their opportunity but Netani Talei spilled possession once again two yards from the Ulster line and a forward pass from Visser saw another chance wasted after a brilliant Blair break.
Pienaar increased Edinburgh frustration as he slotted another three points after Lee Jones had run in front of his kicker but Laidlaw steadied the Scots with a penalty in injury-time.
Ulster's lead was down to the minimum four minutes after the restart as Laidlaw slotted his fourth penalty after a break from Matt Scott.
But a Pienaar break started a period of intense Ulster pressure, though the Edinburgh defence somehow held out with Laidlaw ripping the ball away after Dan Tuohy and then Wannenburg were both held inches short of the line.
Pienaar had turned down two certain penalties as Ulster threatened after the resumption but he took the three points on offer in the 57th minute and then extended the lead to 19-12 in the 63rd minute.
By that stage, Ulster were relying on their set-piece to strangle Edinburgh's running game and when the Scots did have possession, they were invariably undone by handling errors.
Pienaar's 76th-minute penalty put more than a score between the teams and Thompson's injury-time try - converted by Laidlaw - was too late for the battling Scottish side.
Ulster: Stefan Terblanche; Andrew Trimble, Darren Cave, Paddy Wallace, Craig Gilroy; Paddy Jackson, Ruan Pienaar; Tom Court, Rory Best, Declan Fitzpatrick; Johann Muller (captain), Dan Tuohy; Stephen Ferris, Willie Faloon, Pedrie Wannenburg.
Replacements: Paddy McAllister for Court 77, Adam Macklin for Fitzpatrick 65, Lewis Stevenson for Ferris 77, Robbie Diack for Faloon 73.
Not used: Nigel Brady, Paul Marshall, Ian Humphreys, Adam D'Arcy
Edinburgh: Tom Brown; Lee Jones, Nick De Luca, Matt Scott, Tim Visser; Greig Laidlaw (captain), Mike Blair; Allan Jacobsen, Ross Ford, Geoff Cross, Grant Gilchrist, Sean Cox, David Denton, Ross Rennie, Netani Talei.
Replacements: Jim Thompson for Jones 70, Kyle Traynor for Jacobsen 77, Jack Gilding for Cross 73, Roddy Grant for Rennie 56.
Not used: Andrew Kelly, Chris Leck, Phil Godman
Referee: Romain Poite (France)