Andriy Yarmolenko and Roman Yaremchuk scored for Ukraine in the first half as they became the first duo to score in each of their team's first two matches in European Championship history, having both found the net in their 3-2 defeat to the Netherlands.
Leeds United's Ezgjan Alioski pulled a goal back in the second half as he scored the rebound after his initial penalty was saved by Ukraine goalkeeper Georgiy Bushchan following a foul on Goran Pandev.
Both sides came into this match having lost their opening games -- North Macedonia went down 3-1 to Austria -- but, despite facing a fast start from their opponents, Ukraine's greater quality soon showed as they created the majority of the chances.
The opening goal came on 29 minutes as Yarmolenko finished off from close range following a corner from the impressive Ruslan Malinovskyi.
Yarmolenko then turned provider five minutes later as he played Yaremchuk for a cool finish past North Macedonia goalkeeper Stole Dimitrievski.
Pandev produced a lovely dinked finish over Bushchan on 39 minutes, but the goal was ruled out for a clear offside.
North Macedonia started the second half with more purpose and were rewarded for their endeavour on 56 minutes when Argentine referee Fernando Rapallini pointed to the spot following a foul by Oleksandr Karavayev on Pandev. Alioski saw his effort saved, but was first to the rebound to power home.
Malinovskyi missed the chance to wrap up the win for Ukraine when he saw his 83rd-minute penalty awarded for handball saved. It was the fourth spot kick missed of five awarded throughout the tournament so far.
North Macedonia next face Frank de Boer's Dutch side in their final group game on Monday. Ukraine's next task is a clash with Austria on the same day.