Inter reste till Rom under söndagskvällen för att säkra greppet om andraplatsen, då Atalanta bara fick med sig 1-1 borta mot Verona under lördagen.
Roma var nära att få en drömöppning efter tio minuter. Inter-målvakten Samir Handanovic kom ut fel på Lorenzo Pellegrinis hörna, som letade sig fram till Gianluca Mancini vid bortre stolpen - men Mancini nickade precis utanför.
Istället gjorde Inter 1-0 på hörna fem minuter senare. Inter-backen Stefan de Vrij nådde högst på en hörna från höger och nickade in 1-0 bakom Pau Lopez i Roma-målet.
På tilläggstid till den första halvleken kvitterade Roma. Efter att ha vunnit bollen vid mittplan kontrade Roma snabbt. Till slut nådde bollen Edin Dzeko som friställde Leonardo Spinazzola, som kyligt placerade in 1-1 via de Vrij.
Tio minuter in i den andra halvleken gav Henrich Mchitarjan Roma ledningen. Efter att själv ha drivit bollen från egen planhalva in i Inters straffområde, kombinerade han sig förbi Inter-försvaret med Edin Dzeko för att sedan från nära håll dunka in 2-1 bakom Handanovic.
Men Inter skulle få det sista ordet. Romelu Lukaku fastställde slutresultatet på straff i den 88:e minuten efter att Spinazzola klumpigt sparkat ner Victor Moses i eget straffområde.
Resultatet innebär att Roma nu har två poäng ner till Milan och Napoli på 56 poäng, medan Inter tar sig en poäng framför Atalanta och intar andraplatsen med 72 poäng.
Startelvor:
Roma: Pau Lopez - Mancini, Ibanez, Kolarov - Bruno Peres, Diawara, Veretout, Spinazzola - Mkhitaryan, Pellegrini - Dzeko.
Inter: Handanovic - Skriniar, De Vrij, Bastoni - Candreva, Barella, Gagliardini, Young; Brozovic - Lautaro Martinez, Alexis Sanchez.