The Windows licensing premium: what it actually costs
“Windows costs more” is true and useless. It doesn’t tell you whether the premium is a rounding error or a second instance’s worth of spend, whether it grows with instance size, or whether picking a cheaper family dodges any of it. This guide pulls the actual Windows and Linux prices for the same instance types from our dataset and works out what the premium really is, using the instance explorer and comparison tool to check your own fleet against it.
The premium is a flat fee per vCPU, not a percentage
Every EC2 instance detail page (e.g. m7i.xlarge) shows Linux pricing. Switch the operating system and AWS adds a license charge on top. Line up that charge across families in us-east-1, on-demand, same size (4 vCPU):
| Instance | vCPU | Linux | Windows | Premium ($) | Premium (%) |
|---|---|---|---|---|---|
| m5.xlarge | 4 | $0.1920 | $0.3760 | $0.1840 | 95.8% |
| c5.xlarge | 4 | $0.1700 | $0.3540 | $0.1840 | 108.2% |
| m7i.xlarge | 4 | $0.2016 | $0.3856 | $0.1840 | 91.3% |
| c7i.xlarge | 4 | $0.1785 | $0.3625 | $0.1840 | 103.1% |
| r7i.xlarge | 4 | $0.2646 | $0.4486 | $0.1840 | 69.5% |
| m8i.xlarge | 4 | $0.2117 | $0.3957 | $0.1840 | 86.9% |
| c8i.xlarge | 4 | $0.1874 | $0.3714 | $0.1840 | 98.2% |
| r8i.xlarge | 4 | $0.2778 | $0.4618 | $0.1840 | 66.2% |
Every one of these is a 4-vCPU instance, and every one carries the exact same $0.1840/hr Windows charge ($0.046 per vCPU-hr), regardless of generation (5th through 8th) or family (general purpose, compute, memory). The percentage swings from 66% to 108% across the same table, but that’s an artifact of the Linux base price, not a different license fee. Compute-optimized c-family instances show the worst percentage because they have the cheapest Linux price to divide into; memory-optimized r-family looks “better” only because its Linux price is already higher. The dollar figure is the real number. The percentage just tells you how good your Linux instance choice was.
This matches how real-world Windows Server licensing works: AWS is passing through a per-core charge, and EC2’s vCPU is the unit it’s metered against.
Does it scale with instance size?
If the premium is really per-vCPU, it should scale linearly with size the same way Linux pricing does. The m7i family, us-east-1, on-demand:
| Size | vCPU | Linux | Windows | Premium | Per-vCPU |
|---|---|---|---|---|---|
| m7i.large | 2 | $0.1008 | $0.1928 | $0.0920 | $0.0460 |
| m7i.xlarge | 4 | $0.2016 | $0.3856 | $0.1840 | $0.0460 |
| m7i.2xlarge | 8 | $0.4032 | $0.7712 | $0.3680 | $0.0460 |
| m7i.4xlarge | 16 | $0.8064 | $1.5424 | $0.7360 | $0.0460 |
| m7i.8xlarge | 32 | $1.6128 | $3.0848 | $1.4720 | $0.0460 |
| m7i.16xlarge | 64 | $3.2256 | $6.1696 | $2.9440 | $0.0460 |
| m7i.24xlarge | 96 | $4.8384 | $9.2544 | $4.4160 | $0.0460 |
| m7i.48xlarge | 192 | $9.6768 | $18.5088 | $8.8320 | $0.0460 |
Exactly linear, from a 2-vCPU large to a 192-vCPU 48xlarge, a 96x range in size, and the per-vCPU rate never moves. There’s no volume discount and no volume penalty on the license fee, same as the Linux price itself (see right-sizing with $/vCPU-hr for why that’s true on the Linux side too). Consolidating ten Windows xlarges into one Windows 8xlarge doesn’t touch the license bill; it stays $0.046/vCPU-hr no matter how you slice the fleet.
Regions: the dollar holds, the percentage moves
Same instance, different regions, us-east-1 as baseline:
| Instance | Region | Linux | Windows | Premium | Premium % |
|---|---|---|---|---|---|
| m7i.xlarge | us-east-1 | $0.2016 | $0.3856 | $0.1840 | 91.3% |
| m7i.xlarge | us-west-2 | $0.2016 | $0.3856 | $0.1840 | 91.3% |
| m7i.xlarge | eu-west-1 | $0.2247 | $0.4087 | $0.1840 | 81.9% |
| m7i.xlarge | ap-southeast-1 | $0.2520 | $0.4360 | $0.1840 | 73.0% |
Same pattern as across families: the $0.1840/hr license charge is identical in every region we checked, while the percentage drops as the regional Linux price rises. Don’t budget a Windows migration off a percentage you saw in one region; pull the dollar figure for your actual region on the instance detail pages and multiply by vCPU count.
Windows forecloses Graviton, not just the discount
The Graviton vs. x86 guide already notes that Windows Server isn’t offered on Arm. Worth confirming directly: we checked every Graviton family in the dataset (m6g, c6g, r6g, t4g, m7g, c7g, r7g) and none of them has a single Windows pricing row. Every row for every Graviton instance type is Linux. If your workload needs Windows, arm64 isn’t a smaller discount. It’s not on the table at all.
The real cost of choosing Windows for a workload that could otherwise run arm64 is the license fee stacked on top of the Graviton discount you’re also giving up:
| Would-be Graviton instance (Linux) | Actual x86 instance (Windows) | Multiplier |
|---|---|---|
| m7g.xlarge: $0.1632 | m7i.xlarge: $0.3856 | 2.36x |
| c7g.xlarge: $0.1450 | c7i.xlarge: $0.3625 | 2.50x |
| r7g.xlarge: $0.2142 | r7i.xlarge: $0.4486 | 2.09x |
For a stateless, containerized workload with no Windows-specific dependency, running it on Windows x86 instead of Linux arm64 costs 2 to 2.5 times as much per hour. You’re not just choosing an OS. You’re giving up the cheapest instances in the catalog.
Burstable instances don’t follow the same pattern
The flat-per-vCPU rule holds cleanly across the m/c/r families above, but not on t3, us-east-1:
| Instance | vCPU | Linux | Windows | Premium | Premium % |
|---|---|---|---|---|---|
| t3.nano | 2 | $0.0052 | $0.0098 | $0.0046 | 88.5% |
| t3.micro | 2 | $0.0104 | $0.0196 | $0.0092 | 88.5% |
| t3.small | 2 | $0.0208 | $0.0392 | $0.0184 | 88.5% |
| t3.medium | 2 | $0.0416 | $0.0600 | $0.0184 | 44.2% |
| t3.large | 2 | $0.0832 | $0.1108 | $0.0276 | 33.2% |
| t3.xlarge | 4 | $0.1664 | $0.2400 | $0.0736 | 44.2% |
| t3.2xlarge | 8 | $0.3328 | $0.4800 | $0.1472 | 44.2% |
Nano through small hold a flat 88.5% premium, then it drops and stays inconsistent through medium and large before the percentage recovers at xlarge and 2xlarge, even though every size here is nominally 2 vCPU except the last two. Whatever AWS’s Windows pricing model is doing on burstable instances, it isn’t the clean per-vCPU adder the standard families show. If you’re running Windows on t3, don’t extrapolate the $0.046/vCPU-hr figure from the tables above; check the exact size on its instance detail page instead. In absolute dollars the burstable premium is small regardless (a few cents an hour), so it rarely matters for cost decisions the way it does at m- and c-family scale.
When Windows is actually required
The license fee is a fixed cost of a real decision, not a tax to always dodge. It’s worth paying when:
- Active Directory is load-bearing. Domain-joined infrastructure, Group Policy, or anything authenticating against AD as the system of record. This is usually the strongest real reason, not a preference.
- The application is .NET Framework, not .NET (Core/5+). Framework apps built before the 2016-era rewrite are frequently Windows-only in practice, even when nothing in the code looks OS-specific. Modern .NET runs natively on Linux containers and gets none of the premium. If the app has already been ported, or could be with reasonable effort, that’s the biggest single lever here.
- SQL Server licensing already assumes Windows. SQL Server-on-Windows deployments carry their own licensing model layered on top of the EC2 OS charge, with quirks around core-based licensing and Software Assurance that are worth understanding on their own terms before you size the instance. That’s a separate, deeper topic than this guide covers; treat any specific claim about it as something to verify against your licensing agreement, not this page.
- A commercial dependency is Windows-only. Some vendor software, drivers, or legacy tooling genuinely doesn’t ship for Linux. Confirm this per dependency; “we’ve always run it on Windows” isn’t the same claim as “it doesn’t run on Linux.”
Windows is usually the wrong default, rather than usually the wrong choice, when:
- The workload is a stateless web service, API, or worker with no AD or Framework dependency.
- It’s already containerized, or could be, and the base images in use have Linux variants.
- It was set on Windows years ago because that’s what the team knew at the time, and nobody has revisited it since.
Auditing your own fleet
- Pull your current Windows instance types and count by type and region in the instance explorer.
- Look up each type’s Linux and Windows price on its detail page and compute the per-vCPU premium; if it’s near $0.046/vCPU-hr (standard families) or matches the table above for burstable, you’re seeing the standard license fee, not something regional or family-specific.
- Multiply the dollar premium (not the percentage) by hours in a month (730) to see the real monthly cost. A m7i.4xlarge running Windows pays a $0.7360/hr premium: about $537/month, roughly $6,440/year, for that one instance alone. Multiply by fleet size before deciding whether a migration is worth scoping.
- For each Windows instance, ask which bucket below it’s actually in, required or default-by-habit, and use the comparison tool to check what the Linux equivalent, and the Graviton equivalent if arm64 is viable, would cost instead.
Making the call
Clear yes on Windows. AD-dependent infrastructure. .NET Framework apps not worth porting. Vendor software confirmed Windows-only. Pay the fee; it’s the cost of the dependency, not a mistake.
Worth a porting test. .NET Framework apps with a realistic Core/5+ migration path. SQL Server workloads where the licensing math and a Linux-hosted alternative haven’t been compared side by side. The savings are the license fee at minimum, and the Graviton discount on top of that if arm64 becomes viable once you’re off Windows.
Stay on Windows for now, but stop adding to it. Fleets that are Windows because they’ve always been Windows, with no active migration bandwidth. Don’t move what’s stable, but default new services to Linux so the fleet doesn’t grow.
Default to Linux. New workloads with no Windows-specific dependency. Anything stateless and containerized. Anything where “Windows” was never really a decision, just what the last engineer used.
Bottom line: the Windows premium on EC2 is a flat ~$0.046/vCPU-hr license fee on standard families that scales exactly linearly with size and holds constant across regions. The percentage you see just reflects how cheap the underlying Linux instance was. It also closes off Graviton entirely, since no Arm family in our dataset carries a single Windows pricing row. Check whether your Windows fleet is there because it has to be, or because nobody’s asked the question since it was provisioned.