Amazon Elastic Compute Cloud (Amazon EC2) rents virtual servers, billed while they run. The instance is not the whole bill: AWS's own guide tells you to "include incidental costs such as snapshot storage for EBS volumes" when you estimate an environment. This article explains what runs under an instance, how EC2 pricing works (what you pay for, and when), and the ways AWS documents to reduce EC2 costs, priced with the list prices of the Paris Region (eu-west-3). Four architectures show what the levers do to whole monthly bills, and the cost section opens with an index of the levers, in the order to work through them.
Prices in this article are AWS list prices for the EU (Paris) Region, Linux, shared tenancy, in USD before tax, from the AWS Price List. Its offer files and their publication dates are listed in the Sources section, and each table repeats the dates of its own prices. Monthly amounts (730 hours), totals and percentages are computed from these prices.
What Amazon EC2 is
In AWS's words, Amazon EC2 "provides on-demand, scalable computing capacity in the Amazon Web Services (AWS) Cloud". An instance is a virtual server, and its instance type sets the hardware it gets: a balance of compute, memory, network and storage. You start it from an Amazon Machine Image (AMI), a template that packages the operating system and software, and give it storage: Amazon Elastic Block Store (Amazon EBS) volumes, which persist, or instance store volumes, whose data is deleted when the instance stops, hibernates or terminates. A security group acts as its virtual firewall.
The same guide lists the pricing options: the Free Tier, On-Demand Instances, Savings Plans, Reserved Instances, Spot Instances, Dedicated Hosts, On-Demand Capacity Reservations, and per-second billing. This article covers all of them except the Free Tier.
How EC2 works under the hood
The Nitro System
AWS's Nitro whitepaper calls the AWS Nitro System "the underlying platform for all modern EC2 instances": "a combination of purpose-built server designs, data processors, system management components, and specialized firmware". The EC2 documentation lists the instance types built on the Nitro System. A server has a main system board, with the host CPUs (Intel, AMD or Graviton) and memory, and one or more Nitro Cards (the components of the Nitro System). The main card, the Nitro Controller, is "the exclusive gateway between the physical server and the control planes for EC2, Amazon EBS, and Amazon Virtual Private Cloud (Amazon VPC)".
- The Nitro Hypervisor splits the host's CPUs and memory between the instances. By design it has no networking stack, no general-purpose file system and no shell.
- Network and storage traffic goes through the Nitro Cards over PCIe: the Elastic Network Adapter for the network, NVMe for EBS volumes and instance store. The cards "implement data encryption for networking and storage using hardware offload engines".
- The Nitro Controller is the only path between the server and the control planes of Amazon EC2, Amazon EBS and Amazon VPC.
- The Nitro Security Chip moderates every access to the server's firmware and, at boot, keeps the CPUs in reset until the Nitro Controller has verified the firmware.
Beyond the steps under the diagram:
- The Nitro Cards also carry the interfaces EC2 uses to provision and manage the server.
- The Nitro Hypervisor, "deliberately minimized and firmware-like", gives the instances the cards directly: each PCIe function of a card is split into virtual functions (SR-IOV) that the hypervisor assigns to the instances, which AWS says "minimizes the set of software and hardware components involved in the I/O, resulting in lower costs, higher performance, and greater security".
- The Nitro Controller is also the hardware root of trust of the server.
AWS also states that the system has no operator access: no mechanism lets a system or a person log in to a Nitro host or read an instance's memory.
The point of the design is to run "nearly all the functionality of the virtualization system on the Nitro cards rather than on the host's system mainboard CPUs". AWS's Nitro page says this delivers "practically all of the compute and memory resources of the host hardware to your instances", and the EC2 documentation that the hypervisor "delivers performance that is indistinguishable from bare metal for most workloads". The same design offers bare metal instances, for workloads that need low-level hardware features or a non-virtualized environment for licensing or support.
Reading an instance name
An instance type is named after its family and size: the series, the generation, the options, then the size after the dot, such as small, 4xlarge, or metal for bare metal. In m7i.large, m is the general purpose series, 7 the seventh generation, i an Intel processor, and large the size. m7g.large is the same series, generation and size on an AWS Graviton processor.
What the letters of an instance type name mean
| Letter | Meaning |
|---|---|
t (series) |
Burstable performance |
m (series) |
General purpose |
c (series) |
Compute optimized |
r (series) |
Memory optimized |
i (series) |
Storage optimized |
g (option) |
AWS Graviton processor |
i (option) |
Intel processor |
a (option) |
AMD processor |
d (option) |
Instance store volumes |
flex (option) |
Flex instance |
A vCPU is not the same unit on every instance. Many instances run multiple threads on each CPU core (simultaneous multithreading), and "each thread is represented as a virtual CPU (vCPU) on the instance". AWS's table of CPU options gives each type's default: m7i.large (Intel) has two vCPUs on one core, while m7g.large (Graviton) has two vCPUs on two cores, as do the AMD types m7a.large, c7a.large and r7a.large:
m7i.large Intel: 2 vCPUs on 1 core, 2 threads per core
m7g.large AWS Graviton: 2 vCPUs on 2 cores, 1 thread per core
m7a.large AMD: 2 vCPUs on 2 cores, 1 thread per core
Default CPU options. AWS, Supported CPU options for Amazon EC2 instance types
Two instances with the same vCPU count don't have the same number of cores, so measure before comparing them on price. Changing the CPU options doesn't lower the price either: except for license-included Windows and SQL Server, "you're charged the same as instances that are launched with the default CPU options". EC2 dedicates some resources of the host to an instance, "such as CPU, memory, and instance storage", and shares others, "such as the network and the disk subsystem", among instances (Amazon EC2 instance types).
Burstable, Flex and fixed performance
Burstable T instances run at a baseline and earn CPU credits to go above it; "1 CPU credit = 1 vCPU * 100% utilization * 1 minute". A t4g.small earns 24 credits an hour, a baseline of 20% of each of its two vCPUs (key concepts). T8i, T4g, T3a and T3 instances launch in Unlimited mode: when their average CPU over 24 hours is above the baseline, the extra is billed per vCPU-hour (Unlimited mode), $0.04 per vCPU-hour for T4g and $0.05 per vCPU-hour for T3 in Paris. In Standard mode, an instance that has spent its credits comes down to its baseline instead, and no surplus is billed.
Flex instances such as M7i-flex "deliver a baseline CPU performance of 40 percent" and can reach 100 percent for 95 percent of the time over 24 hours. For "consistently high CPU performance", AWS recommends fixed performance instances (Amazon EC2 instance types).
Storage: EBS and instance store
An EBS volume is block storage that persists "independently from the running life of an EC2 instance", in the same Availability Zone as its instance. With EBS, "you pay only for what you provision": a volume is billed on its provisioned size, attached or not, whether its instance runs or not. Instance store is disks attached to the host, for temporary data such as buffers, caches and scratch data; it is "included as part of the usage cost of the instance", and its data is lost when the instance stops, hibernates or terminates.
- Lives
- Independently of the instance, in its Availability Zone
- Billed
- On its provisioned size, attached or not, running or not
- After a stop
- Kept
- Lives
- On disks attached to the host
- Billed
- Included in the instance's usage cost
- After a stop
- Data lost (also on hibernate and terminate)
What differs: whether the data outlives the instance, and whether it is billed apart from it.
Regions and Availability Zones
A Region is a separate geographic area, and Availability Zones are "multiple, isolated locations within each Region". Running instances in several zones protects an application "from the failure of a single location in the Region" (Regions and Zones). Data sent between zones is billed (What else is on the EC2 bill): resilience has a price, and the levers below keep it in check rather than remove it.
What EC2 is used for
AWS matches workloads to instance families across its documentation: the instance types page, the pages of each family, such as M7g instances, M7i instances, C7g instances and R7g instances, and the guides to burstable instances, Spot Instances and Dedicated Hosts linked in this article:
Workloads and the instance families AWS matches to them
| Workload | Family |
|---|---|
| Low average CPU with peaks: web servers, small databases, development and test | T (T4g, T3) |
| General purpose workloads that don't use all their CPU: web and application servers, microservices, databases | M7i-flex |
| Application servers, microservices, gaming servers, mid-size data stores, caching fleets | M7g |
| Batch processing, video encoding, scientific modeling, CPU-based machine learning inference | C7g |
| Memory-intensive workloads: databases, in-memory caches, real-time big data analytics | R7g |
| High-throughput databases, data processing, data streaming | Storage optimized (I, D) |
| Floating point calculations, graphics processing, data pattern matching | Accelerated computing (P, G, Inf, Trn, F) |
| Interruptible work: batch jobs, CI/CD, stateless web servers, rendering | Any family, on Spot |
| Software licensed per socket, per core or per VM | Dedicated Hosts |
A common production setup is a web tier behind a load balancer, over two Availability Zones. In AWS's example of a VPC for production servers, the VPC has a public and a private subnet in each zone, and the public subnets route to the internet through an internet gateway. "Each public subnet contains a NAT gateway and a load balancer node", and the servers "run in the private subnets, are launched and terminated by using an Auto Scaling group, and receive traffic from the load balancer". The diagram leaves the NAT gateways out (their price is in What else is on the EC2 bill). Elastic Load Balancing "supports the following load balancers: Application Load Balancers, Network Load Balancers, Gateway Load Balancers, and Classic Load Balancers", and "Whenever instances are launched or terminated, Amazon EC2 Auto Scaling automatically registers and deregisters the instances from the load balancer":
- Requests enter the VPC through its internet gateway and reach the Application Load Balancer, which has a node in the public subnet of each zone. It sends them to the instances of the Auto Scaling group, in the private subnets, and the group keeps the instances balanced across the two zones.
- With a scaling policy, such as target tracking, the group adds instances when the load rises and removes them when it falls. Each instance is billed per second while it runs: $0.0188 an hour for a t4g.small.
- Each instance has its own EBS volume, which must be in the same Availability Zone as the instance. A volume is billed on its provisioned size, attached or not: $0.0928 per GB-month for gp3.
- Data sent between instances in different zones is billed $0.01 per GB, in each direction.
Amazon EC2 Auto Scaling keeps the group between a minimum and a maximum number of instances, replaces unhealthy ones and balances them across zones. It has no fee of its own: you pay for the instances, volumes and alarms it uses.
How EC2 pricing works
On-Demand: per second, while it runs
"With On-Demand Instances, you pay for compute capacity by the second with no long-term commitments", "with a 60-second minimum" (Purchasing On-Demand Instances). Linux, Windows, RHEL and Ubuntu Pro instances are billed per second; SLES instances are billed by the full hour (EC2 On-Demand pricing).
What a stopped instance still costs
What is billed in each state of an instance (Amazon EC2 instance state changes). "Some AWS resources, such as Amazon EBS volumes and Elastic IP addresses, incur charges regardless of the instance's state":
What is billed in each state of an instance
| State | Instance usage | EBS volumes | Elastic IP address |
|---|---|---|---|
pending | Not billed | Billed | Billed |
running | Billed | Billed | Billed |
stopping | If hibernating | Billed | Billed |
stopped | Not billed | Billed | Billed |
shutting-down | Not billed | Billed | Billed |
terminated | Not billed | Until deleted | Until released |
Running instances are billed per second, with a one-minute minimum. After termination, the root volume is deleted by default and other volumes are kept (DeleteOnTermination); an Elastic IP address stays allocated to the account until it is released. A Reserved Instance that covered a terminated instance is billed until the end of its term.
A stopped instance still pays for its volumes, and for its Elastic IP address if it has one; a public IPv4 address assigned at launch is released when the instance stops, and a new one comes with the next start. AWS charges for every public IPv4 address, in use or idle, $0.005 per hour in Paris (Amazon VPC pricing):
Per public IPv4 address
$3.65 a month:An address billed every hour of the month, 730 hours, in use or idle, in Paris.
Computed from the AWS Price List · eu-west-3 · Sep 17, 2026
A stop and a start also open a new billing period, with its own one-minute minimum.
What else is on the EC2 bill
Other charges that come with EC2 in Paris (eu-west-3)
| Item | List price | Unit |
|---|---|---|
| Storage (EBS) | ||
| gp3 storage | $0.0928 | per GB-month |
| gp3 IOPSAbove 3,000 | $0.0058 | per IOPS-month |
| gp3 throughputAbove 125 MiB/s | $0.0464 | per MiB/s-month |
| gp2 storage | $0.116 | per GB-month |
| Snapshots | ||
| Standard tier | $0.053 | per GB-month |
| Archive tier | $0.01325 | per GB-month |
| Retrieval from the archive tier | $0.0318 | per GB |
| Public IPv4 addresses | ||
| In use | $0.005 | per hour |
| Idle | $0.005 | per hour |
| CPU credits | ||
| T4g surplus creditsUnlimited mode | $0.04 | per vCPU-hour |
| Data transfer | ||
| Between Availability ZonesEach direction | $0.01 | per GB |
| From Paris to Frankfurt | $0.02 | per GB |
| Out to the internetFirst 10 TB a month | $0.09 | per GB |
| In from the internet | $0.00 | per GB |
| NAT gateway | ||
| NAT gateway | $0.05 | per hour |
| Data processed | $0.05 | per GB |
USD, before tax. AWS Price List, eu-west-3, offer files published September 16, 2026, September 17, 2026 and October 12, 2026, fetched October 14, 2026.
Within a Region, "you're charged for both inbound and outbound traffic" of a transfer between zones; between Regions, only the data out of the source Region is billed. The first 100 GB a month of data out to the internet are free, counted across all AWS services and Regions except China and GovCloud (EC2 On-Demand pricing). In Cost Explorer, "Instead of a single group for Amazon EC2 costs, Cost Explorer will group costs into EC2 - Instances and EC2 - Other" (Billing and Cost Explorer data): EC2 - Other holds the "ancillary cost, such as Amazon Elastic Block Store volumes or NAT gateways". Cost Explorer's usage type groups split these charges further, apart from "EC2: Running Hours": among them "EC2: EBS - SSD(gp2)", "EC2: EBS - Snapshots", "EC2: Data Transfer - Inter AZ" and "EC2: NAT Gateway - Data Processed". Public IPv4 addresses, in use or idle, are billed under Amazon VPC, not EC2, with the usage types PublicIPv4:InUseAddress and PublicIPv4:IdleAddress (billing codes for Amazon VPC).
Put together, a single instance's month looks like this, before any data transfer:
One m7g.large running all month in Paris, with a 50 GB gp3 volume and a public IPv4 address Illustrative
| Line | A month |
|---|---|
| Compute | |
| m7g.large, On-Demand730 h × $0.0952 /h | $69.50 |
| Storage | |
| gp3 storage50 GB × $0.0928 /GB-mo | $4.64 |
| Network | |
| Public IPv4 address730 h × $0.005 /h | $3.65 |
| Not counted | |
| Data transfer | — |
| A month, computed | $77.79 |
USD before tax, 730 h a month. AWS Price List, eu-west-3, offer files published September 17, 2026 and October 12, 2026, fetched October 14, 2026. Illustrative configuration, not a client case.
Savings Plans and Reserved Instances
Savings Plans "provide savings beyond On-Demand rates in exchange for a commitment of using a specified amount of compute power (measured per hour) for a one or three year period", up to 72%. EC2 has two kinds, one wider and one deeper:
- Discount
- Up to 66% off On-Demand
- Applies to
- Any instance family, size, Region, operating system or tenancy, and AWS Fargate and AWS Lambda too
- Discount
- Up to 72% off On-Demand
- Applies to
- One instance family in one Region
What differs: a deeper discount against the freedom to change family, Region or service.
The commitment is hourly: "each hour's commitment can only be used within that hour and cannot be carried over", and usage above it is billed On-Demand. The terms can't be changed or cancelled after purchase, with one exception: a plan with an hourly commitment of 100 US dollars or less can be returned within seven days of its purchase, in the same calendar month, up to a return limit (Returning a purchased Savings Plan). Reserved Instances are "a billing discount applied to the use of On-Demand Instances", for one or three years, Standard or Convertible. AWS's advice is short:
We recommend Savings Plans over Reserved Instances.
One instance type, every way to pay for it by the hour, from On-Demand to the deepest discount:
Both are also sold Partial Upfront and All Upfront (What are Savings Plans?), and AWS notes that "you can save more money making a higher upfront payment" for Reserved Instances. This article shows No Upfront rates only.
At one year, the EC2 Instance Savings Plan rate is the Standard Reserved Instance rate, and the Compute Savings Plan rate is the Convertible Reserved Instance rate. AWS describes the pairs the same way: Compute Savings Plans are similar to Convertible Reserved Instances, and EC2 Instance Savings Plans to Standard ones.
In short: For m7i.large and m7g.large in Paris, at one year No Upfront, a Savings Plan costs what the matching Reserved Instance costs: choose on flexibility, not on price.
Spot Instances
"A Spot Instance is an instance that uses spare EC2 capacity that is available for less than the On-Demand price." Its price is set by EC2 for each instance type and zone, and moves with supply and demand (Spot Instances). It is not in the AWS Price List, so this article shows none. The savings reach up to 90%, and EC2 can interrupt the instance "with two minutes of notice" (Spot best practices). Savings Plans do not apply to Spot usage.
Dedicated Hosts and Capacity Reservations
Dedicated Hosts, physical servers for your use alone, serve software licensed per socket, per core or per VM. On-Demand Capacity Reservations reserve capacity in a zone and are "charged at the equivalent On-Demand rate whether you run instances in reserved capacity or not"; Savings Plans and regional Reserved Instances can lower that rate.
Putting the options together
The AWS Well-Architected Framework asks the question for each resource: "Determine if the component and resources will be running for extended periods (for commitment discounts) or dynamic and short-running (for spot or on-demand)". The options of this section, side by side:
The ways to pay for EC2: what each suits and what you pay for
| Option | Suits | You pay for |
|---|---|---|
| On-Demand | Dynamic, short-running use | Each second it runs, with a 60-second minimum (Linux) |
| Savings Plans | Long-running use | An hourly commitment for one or three years, used or not |
| Reserved Instances | Long-running use; AWS recommends Savings Plans instead | Every hour of the term, used or not (No Upfront) |
| Spot Instances | Interruptible work | Spare capacity, at the Spot price EC2 sets |
| Dedicated Hosts | Software licensed per socket, core or VM | A physical server for your use alone |
| On-Demand Capacity Reservations | Capacity held in one zone | The On-Demand rate, whether instances run in it or not |
Architecture patterns around EC2 and what they cost
Four illustrative configurations in Paris, each priced before and after the levers of the next section, line by line from the AWS Price List. They cover the main shapes of an EC2 bill: a steady load that runs all the time, interruptible work that comes in batches through an Amazon Simple Queue Service (Amazon SQS) queue, resources a team uses only part of the week, and a small load that rarely uses its CPU. None is a client case; every amount is computed, and each card lists its assumptions and what it leaves out.
Pattern 1 of 4 · Illustrative configuration
Always-on web tier
An Application Load Balancer in front of an Auto Scaling group of two to four instances, over two Availability Zones in Paris.
Its architecture is the web tier drawn under What EC2 is used for: a load balancer over two zones, an Auto Scaling group in the private subnets.
With the levers: $212.81 a month less (52.5% less), computed.
The bills line by line, the assumptions and the sources
Always-on web tier, before: Sized for the peak Illustrative
Four m7i.large On-Demand instances running all month, with gp2 volumes.
| Line | A month |
|---|---|
| Compute | |
| m7i.large, On-Demand4 instances × 730 h × $0.1176 /h | $343.39 |
| Storage | |
| gp2 volumes, 50 GB each200 GB × $0.116 /GB-mo | $23.20 |
| Network | $38.88 |
| Application Load Balancer1 load balancer × 730 h × $0.02646 /h | $19.32 |
| Load balancer capacity units (2 on average)2 LCU × 730 h × $0.0084 /LCU-h | $12.26 |
| Public IPv4 addresses of the load balancer2 addresses × 730 h × $0.005 /h | $7.30 |
| A month, computed | $405.47 |
Always-on web tier, with the levers: Graviton, baseline committed, peak scaled Illustrative
Two m7g.large on a one-year No Upfront EC2 Instance Savings Plan run all month; the group adds two On-Demand m7g.large for the peak hours; gp3 volumes.
| Line | A month |
|---|---|
| Compute | $141.19 |
| m7g.large, EC2 Instance Savings Plan (1 year, No Upfront)2 instances × 730 h × $0.0628 /h | $91.69 |
| m7g.large, On-Demand, peak hours only2 instances × 260 h × $0.0952 /h | $49.50 |
| Storage | $12.59 |
| gp3 volumes of the baseline instances, 50 GB each100 GB × $0.0928 /GB-mo | $9.28 |
| gp3 volumes of the peak instances, 50 GB each100 GB × 260 h / 730 h × $0.0928 /GB-mo | $3.31 |
| Network | $38.88 |
| Application Load Balancer1 load balancer × 730 h × $0.02646 /h | $19.32 |
| Load balancer capacity units (2 on average)2 LCU × 730 h × $0.0084 /LCU-h | $12.26 |
| Public IPv4 addresses of the load balancer2 addresses × 730 h × $0.005 /h | $7.30 |
| A month, computed | $192.66 |
Same, with a one-year No Upfront Compute Savings Plan: $206.38 a month, 49.1% less than before, computed.
Assumptions
- Illustrative configuration in Paris (eu-west-3), not a client case.
- Peak: 12 hours a day, 5 days a week: 12 × 5 × 52 / 12 = 260 hours a month. The load needs four instances at the peak and two the rest of the time.
- The same number of m7g.large instances carries the load as of m7i.large instances (to verify with a load test before the move).
- Each instance has one 50 GB root volume, which the group deletes with the instance when it scales in (DeleteOnTermination), so a peak instance's volume is billed only while it exists.
- The instances run in private subnets, with no public IPv4 address of their own.
- The load balancer uses 2 load balancer capacity units (LCU) on average every hour, the same in every step.
- The load balancer has one public IPv4 address per enabled Availability Zone: 2 addresses, billed as in-use public IPv4 addresses. A load balancer that scales out can use more.
- The Savings Plan is sized to the two baseline instances: a commitment of 0.1256 USD an hour (2 × the plan's m7g.large rate), billed every hour of the one-year term whether used or not. Usage above it is billed On-Demand.
- m7g (AWS Graviton) runs Linux only and needs an arm64 build of the application.
Not counted
- Data transfer out to the internet and between Availability Zones.
- CloudWatch, snapshots and DNS.
- Two NAT gateways, one in each public subnet as in AWS's example, for the instances' way out to the internet: + $73.00 a month on both sides (2 NAT gateways × 730 h × $0.05 /h, computed), so $478.47 before and $265.66 with the levers, 44.5% less. Their data processing charge is not counted either.
Sources
- Example: VPC with servers in private subnets and NAT
- Application Load Balancers (one IP address per enabled Availability Zone)
- Elastic Load Balancing pricing (LCU dimensions, public IPv4 charges)
- Target tracking scaling policies
- Understanding how Savings Plans apply to your usage
- Amazon EBS General Purpose SSD volumes
USD before tax, 730 h a month. AWS Price List, eu-west-3, offer files published September 11, 2026, September 17, 2026, October 12, 2026 and October 13, 2026, fetched October 14, 2026. Illustrative configuration, not a client case.
Pattern 2 of 4 · Illustrative configuration
Queue-driven batch workers
Producers put jobs in an Amazon SQS queue; an Auto Scaling group of workers scales on the backlog per instance, out to ten instances while there is work and back to zero once the queue is drained.
- Producers send jobs to the queue. Every Amazon SQS action is a billed request, and each 64 KB of a message counts as one request.
- The group scales on the backlog per instance (the messages waiting, divided by the instances in service): out to ten instances while there is work, back to zero once the queue is drained.
- One On-Demand instance is the group's base capacity, so work goes on when Spot capacity is short: $0.0859 an hour for a c7g.large.
- Above the base, the group's mixed instances policy launches Spot Instances, from several instance types and both zones, with the price-capacity-optimized allocation strategy. Spot prices are not in the AWS Price List: AWS states savings of up to 90% compared to On-Demand prices. A job left unfinished by an interrupted instance returns to the queue.
No difference is computed: the Spot hours have no list price (AWS: up to 90% less than On-Demand).
The bills line by line, the assumptions and the sources
Queue-driven batch workers, before: On-Demand only Illustrative
The same Auto Scaling group with one instance type, c7g.large, all On-Demand.
| Line | A month |
|---|---|
| Compute | |
| c7g.large, On-Demand10 instances × 243⅓ h × $0.0859 /h | $209.02 |
| Storage | |
| gp3 root volumes, 20 GB each, while the workers run200 GB × 243⅓ h / 730 h × $0.0928 /GB-mo | $6.19 |
| Other | |
| Amazon SQS standard requests6 million requests × $0.40 /M req | $2.40 |
| A month, computed | $217.61 |
Queue-driven batch workers, with the levers: Spot above an On-Demand base Illustrative
A mixed instances policy: one On-Demand c7g.large as base capacity, the nine others on Spot, across many instance types (AWS recommends at least 10) and both zones, with the price-capacity-optimized allocation strategy and no Spot maximum price.
| Line | A month |
|---|---|
| Compute | $20.90 |
| c7g.large, On-Demand base capacity1 instance × 243⅓ h × $0.0859 /h | $20.90 |
| Spot Instances (c7g.large and similar types)2,190 instance-hours · On-Demand equivalent, as c7g.large: $188.12, computed | Not priced |
| Storage | |
| gp3 root volumes, 20 GB each, while the workers run200 GB × 243⅓ h / 730 h × $0.0928 /GB-mo | $6.19 |
| Other | |
| Amazon SQS standard requests6 million requests × $0.40 /M req | $2.40 |
| Priced lines, a month, computed | $29.49 |
| + 2,190 Spot instance-hours, not priced (AWS: up to 90% less than On-Demand) | |
Assumptions
- Illustrative configuration in Paris (eu-west-3), not a client case.
- The backlog arrives every night: the group runs 10 instances for 8 hours, then scales in to zero. 8 × 730 / 24 = 243.33 hours per instance a month.
- 2,000,000 jobs a month; each job is three Amazon SQS requests (send, receive, delete), each with one message under 64 KB: 6,000,000 requests.
- Each worker has one 20 GB gp3 root volume, deleted with the instance.
- The jobs can be interrupted: a message a worker has not finished processing returns to the queue for another worker.
- Spot prices are not in the AWS Price List, so the Spot hours are not priced and no saving is computed for them. Their On-Demand equivalent is computed as c7g.large hours; a mixed instances group also launches other types, each against its own On-Demand price.
- The SQS free tier (1 million requests a month, counted per account across Regions) is not deducted.
Not counted
- Empty receives: a worker that polls an empty queue makes billed SQS requests too.
- How the workers reach Amazon SQS from private subnets (NAT gateways or an interface VPC endpoint, both billed).
- CloudWatch metrics and alarms of the scaling policy.
- Data transfer and where the jobs' results are stored.
Sources
- Scaling policy based on Amazon SQS
- Auto Scaling groups with multiple instance types and purchase options
- Allocation strategies for multiple instance types
- Spot Instances
- Best practices for Amazon EC2 Spot
- Amazon SQS pricing
USD before tax, 730 h a month. AWS Price List, eu-west-3, offer files published September 11, 2026 and October 12, 2026, fetched October 14, 2026. Illustrative configuration, not a client case.
Pattern 3 of 4 · Illustrative configuration
Development and test environment
Four instances that a team uses during working hours, with one Elastic IP address to reach the environment.
Instance Scheduler on AWS runs on an Amazon EventBridge rule, AWS Lambda functions and Amazon DynamoDB tables, which start and stop the instances by tag.
- Every five minutes by default, an Amazon EventBridge rule invokes the scheduler's AWS Lambda functions, which read the schedules from Amazon DynamoDB and start or stop the instances tagged for a schedule.
- The instances run 8 hours a day, five days a week, and are billed per second only while they run: $0.1176 an hour each for an m7i.large.
- Volumes are billed on their size whether the instance runs or not: $0.0928 per GB-month for gp3.
- The Elastic IP address stays allocated while its instance is stopped, billed as idle: $0.005 an hour, as when in use. The other instances have no public IPv4 address.
With the levers: $261.85 a month less (68.2% less), computed.
The bills line by line, the assumptions and the sources
Development and test environment, before: Always on Illustrative
Four m7i.large running all month.
| Line | A month |
|---|---|
| Compute | |
| m7i.large, On-Demand4 instances × 730 h × $0.1176 /h | $343.39 |
| Storage | |
| gp3 volumes, 100 GB each, billed while stopped too400 GB × $0.0928 /GB-mo | $37.12 |
| Network | |
| Elastic IP address, in use1 address × 730 h × $0.005 /h | $3.65 |
| A month, computed | $384.16 |
Development and test environment, with the levers: Working hours only Illustrative
The same instances, started in the morning and stopped 8 hours later, five days a week, by Instance Scheduler on AWS.
| Line | A month |
|---|---|
| Compute | |
| m7i.large, On-Demand, working hours4 instances × 173⅓ h × $0.1176 /h | $81.54 |
| Storage | |
| gp3 volumes, 100 GB each, billed while stopped too400 GB × $0.0928 /GB-mo | $37.12 |
| Network | $3.65 |
| Elastic IP address, in use (instance running)1 address × 173⅓ h × $0.005 /h | $0.87 |
| Elastic IP address, idle (instance stopped)1 address × 556⅔ h × $0.005 /h | $2.78 |
| A month, computed | $122.31 |
Assumptions
- Illustrative configuration in Paris (eu-west-3), not a client case.
- Working hours: 8 hours a day, 5 days a week, as AWS's Well-Architected Framework describes development and test environments: 8 × 5 × 52 / 12 = 173.33 hours a month.
- Each instance has a 100 GB gp3 volume. A stopped instance still pays for its EBS volumes.
- One Elastic IP address, associated with one of the instances: billed as in use while that instance runs and as idle while it is stopped, at the same rate in Paris.
- The other instances have no public IPv4 address (one assigned at launch is released when the instance stops).
- No commitment covers these instances: a Savings Plan bills every hour of its term, and a stopped instance does not use it.
Not counted
- The scheduler's own resources (Instance Scheduler on AWS deploys AWS Lambda functions, Amazon DynamoDB tables and an Amazon EventBridge rule; its implementation guide gives AWS's own cost estimate).
- Data transfer and snapshots.
Sources
- Instance Scheduler on AWS
- Amazon EC2 instance state changes
- Elastic IP addresses
- Amazon EC2 instance IP addressing
- Amazon VPC pricing
- Cost Optimization Pillar, design principles
USD before tax, 730 h a month. AWS Price List, eu-west-3, offer files published September 17, 2026 and October 12, 2026, fetched October 14, 2026. Illustrative configuration, not a client case.
Pattern 4 of 4 · Illustrative configuration
Small service: burstable or fixed performance
One instance with 2 vCPUs and 8 GiB that serves a light load, with a 50 GB gp3 volume and a public IPv4 address.
Fixed or burstable performance, for the same 2 vCPUs and 8 GiB: which one costs less depends on the average CPU use.
With the levers: $14.60 a month less (18.8% less), computed.
The chart at five points: the instance and its surplus credits a month, computed
| Average CPU | t4g. | m7g. | t4g.large against m7g.large |
|---|---|---|---|
| 0% | $54.90 | $69.50 | 21.0% less |
| 10%This pattern | $54.90 | $69.50 | 21.0% less |
| 30%Baseline | $54.90 | $69.50 | 21.0% less |
| 55%Break-even | $69.50 | $69.50 | The same |
| 100% | $95.78 | $69.50 | 37.8% more |
Every point of the chart, 5% apart
The monthly cost of each instance by average CPU use, computed, every point
| Average CPU | t4g.large | m7g.large |
|---|---|---|
| 0% | $54.90 | $69.50 |
| 5% | $54.90 | $69.50 |
| 10% | $54.90 | $69.50 |
| 15% | $54.90 | $69.50 |
| 20% | $54.90 | $69.50 |
| 25% | $54.90 | $69.50 |
| 30% | $54.90 | $69.50 |
| 35% | $57.82 | $69.50 |
| 40% | $60.74 | $69.50 |
| 45% | $63.66 | $69.50 |
| 50% | $66.58 | $69.50 |
| 55% | $69.50 | $69.50 |
| 60% | $72.42 | $69.50 |
| 65% | $75.34 | $69.50 |
| 70% | $78.26 | $69.50 |
| 75% | $81.18 | $69.50 |
| 80% | $84.10 | $69.50 |
| 85% | $87.02 | $69.50 |
| 90% | $89.94 | $69.50 |
| 95% | $92.86 | $69.50 |
| 100% | $95.78 | $69.50 |
USD before tax, 730 h a month; the volume and the address are left out (the same in both). AWS Price List, eu-west-3, offer files published September 17, 2026 and October 12, 2026, fetched October 14, 2026.
The bills line by line, the assumptions and the sources
Before: the worked month of What else is on the EC2 bill, $77.79 a month.
Small service: burstable or fixed performance, with the levers: Burstable Illustrative
A t4g.large in unlimited mode: billed for surplus CPU credits only when its average use exceeds its baseline.
| Line | A month |
|---|---|
| Compute | $54.90 |
| t4g.large, On-Demand1 instance × 730 h × $0.0752 /h | $54.90 |
| Surplus CPU credits (unlimited mode)0 vCPU-hours × $0.04 /vCPU-h | $0.00 |
| Storage | |
| gp3 volume, 50 GB50 GB × $0.0928 /GB-mo | $4.64 |
| Network | |
| Public IPv4 address1 address × 730 h × $0.005 /h | $3.65 |
| A month, computed | $63.19 |
Assumptions
- Illustrative configuration in Paris (eu-west-3), not a client case.
- Average CPU use: 10% of both vCPUs, steady through the day.
- The service needs 8 GiB of memory, so a smaller size is not an option (rightsizing comes first).
- t4g.large: 2 vCPUs and 8 GiB, like m7g.large. It earns 36 CPU credits an hour, a baseline of 30% per vCPU (one CPU credit is one vCPU at 100% for one minute).
- The CPU use is measured on the t4g.large: its vCPUs are AWS Graviton2 cores, the m7g.large's Graviton3 cores, so the same work may not use the same percentage on both.
- Unlimited mode, the default for T4g: when the average CPU use over 24 hours exceeds the baseline, the instance is billed for the surplus at a flat rate per vCPU-hour. For a steady load, the surplus is (average − 30%) × 2 vCPUs × 730 hours.
- The break-even point is the average CPU use at which the t4g.large's hourly price plus its surplus credits equals the m7g.large's hourly price. The volume and the address are the same in both variants and leave it unchanged.
Not counted
- Data transfer, snapshots and CloudWatch.
Sources
- Key concepts for burstable performance instances
- Unlimited mode concepts for burstable instances
- Burstable performance instances
USD before tax, 730 h a month. AWS Price List, eu-west-3, offer files published September 17, 2026 and October 12, 2026, fetched October 14, 2026. Illustrative configuration, not a client case.
Want the same levers on your own bill?
Get a free auditHow to reduce EC2 costs
Each lever below comes from AWS documentation; their order is this article's. A Savings Plan's hourly commitment "cannot be carried over" to another hour, and a No Upfront Reserved Instance is billed "for every hour within the term, regardless of whether the Reserved Instance is being used". So a commitment comes last, once the usage it covers is as small as it will get: see the bill first, remove what is billed but used by nothing, then lower and reshape the instance hours, and commit to what remains, so that the commitment doesn't lock in waste. The levers, in that order:
- Lever 01,SeeSee the bill as AWS splits itAlways, and first
- Lever 02,TrimDelete unattached volumes and old snapshotsAccounts that have run instances for a while
- Lever 03,TrimRelease idle public IPv4 addressesAddresses that nothing needs
- Lever 04,TrimMove gp2 volumes to gp3Every gp2 volume
- Lever 05,ReshapeStop what nobody usesDevelopment and test, idle hours
- Lever 06,ReshapeRightsize with dataEvery running instance, before a commitment
- Lever 07,ReshapeMove to GravitonLinux software that runs on 64-bit Arm
- Lever 08,ReshapeCompare generations on price-performance, not on priceBefore an upgrade
- Lever 09,ReshapePick burstable, Flex or fixed performanceLow average CPU, with peaks
- Lever 10,ReshapeScale with demandStateless tiers and workers
- Lever 11,ReshapeRun interruptible work on SpotStateless, fault-tolerant, flexible work
- Lever 12,RouteKeep traffic within a zone where the design allows itChatty services over several zones
- Lever 13,CommitCommit to the steady baselineUsage present every hour, once the rest is done
- Lever 14,ReviewReview on a cadenceEvery workload
Lever 01 · See
See the bill as AWS splits it
Separate the instance hours from the rest with Cost Explorer's usage type groups: "EC2: Running Hours" on one side; volumes, snapshots, data transfer and NAT gateways in groups of their own; public IPv4 addresses under the Amazon VPC service. Cost Optimization Hub gathers AWS's recommendations ("resource rightsizing, idle resource deletion, Savings Plans, and Reserved Instances") and accounts for the discounts you already have. With a Business Support+, Enterprise Support or Unified Operations plan, Trusted Advisor's cost checks include Amazon EC2 cost optimization recommendations for instances (which replaces the legacy low-utilization check), unassociated Elastic IP addresses and underutilized EBS volumes. On Basic Support, Trusted Advisor offers only the service limit checks and selected security and fault tolerance checks.
Lever 02 · Trim
Delete unattached volumes and old snapshots
AWS's checklist of unexpected charges says: "Check the Volumes pane in the Amazon EC2 console for volumes that you don't need anymore." Volumes outlive their instances and snapshots outlive their volumes, so a deletion can leave billed storage behind:
What a deletion leaves behind, still billed
| You delete | Still billed after it |
|---|---|
| An instance (terminated) | Its volumes other than the root volume, which termination keeps by default |
| A volume | Its snapshots: "Deleting a volume doesn't automatically delete the associated snapshots" |
| An AMI (deregistered) | Its snapshots, unless you delete them with it |
| A snapshot | The data other snapshots still use: snapshots are incremental, so deleting one "might not reduce your data storage costs" |
| A volume or snapshot that a Recycle Bin rule retains | The volume or snapshot itself, "billed at the same rate" as the others until its retention period ends |
Amazon Data Lifecycle Manager creates, keeps and deletes snapshots and EBS-backed AMIs for you. Recycle Bin can restore volumes, snapshots and EBS-backed AMIs deleted by mistake, if a retention rule protected them when they were deleted; their saving starts only when that retention period ends.
For the snapshots you keep 90 days or more and rarely read, the archive tier is cheaper per GB, with a retrieval fee and a 90-day minimum, and an archived snapshot is stored in full, not as an increment:
Archive tier against standard tier
75.0% lessper GB-month of snapshot storage in Paris.
Computed from the AWS Price List · eu-west-3 · Oct 12, 2026
Lever 03 · Trim
Release idle public IPv4 addresses
Each public IPv4 address costs $3.65 a month in Paris, and AWS charges for "all public IPv4 addresses, including public IPv4 addresses associated with running instances and Elastic IP addresses". For an Elastic IP address you no longer use, AWS's advice is short: "If you don't need that IP address anymore, release it to avoid additional charges". For the addresses of running instances, AWS's list of public IPv4 optimizations suggests serving traffic through a load balancer and turning off "Auto-assign public IP" on the instances and on their subnets, and reaching instances for maintenance through EC2 Instance Connect Endpoint, which connects to an instance "without requiring the instance to have a public IPv4 address".
Lever 04 · Trim
Move gp2 volumes to gp3
gp3 volumes "offer a 20 percent lower price per GiB than General Purpose SSD (gp2) volumes", include 3,000 IOPS and 125 MiB/s at any size, and the change is made in place "without interrupting your Amazon EC2 instances". The console picks gp3 by default only in some cases (the EBS guide: "In other cases, gp2 is the default selection"), so check new volumes too. A gp2 volume's performance grows with its size: 3 IOPS per GiB, and a throughput of at most 128 MiB/s up to 170 GiB, bursts to 250 MiB/s above, and a steady 250 MiB/s from 334 GiB. So a volume under 1,000 GiB gets more baseline IOPS on gp3, for less, but one above 170 GiB can lose throughput: check its throughput before moving it as is, and buy throughput on gp3 where it needs it. A volume of 1,000 GiB or more needs extra IOPS too, which narrows the gap:
The volume on gp2 Illustrative
| Line | A month |
|---|---|
| Storage | |
| gp2 storage2,000 GiB × $0.116 /GB-mo | $232.00 |
| A month, computed | $232.00 |
The volume on gp3, with the same performance Illustrative
| Line | A month |
|---|---|
| Storage | $208.80 |
| gp3 storage2,000 GiB × $0.0928 /GB-mo | $185.60 |
| IOPS above 3,0003,000 IOPS × $0.0058 /IOPS-mo | $17.40 |
| Throughput above 125 MiB/s125 MiB/s × $0.0464 /MiB/s-mo | $5.80 |
| A month, computed | $208.80 |
gp3 with the same performance costs $23.20 a month less than gp2 (10.0% less), computed.
USD before tax, 730 h a month. AWS Price List, eu-west-3, offer file published October 12, 2026, fetched October 14, 2026. Illustrative configuration, not a client case.
Lever 05 · Reshape
Stop what nobody uses
The Well-Architected Framework notes that development and test environments "are typically only used for eight hours a day during the work week", and can be stopped the rest of the time. The Instance Scheduler on AWS starts and stops instances on a schedule, by tag. A stopped instance still pays for its EBS volumes, and for its Elastic IP address if it has one (a public IPv4 address assigned at launch is released when the instance stops); each start has a one-minute minimum.
The development and test environment above prices this schedule for four instances, with their volumes and an Elastic IP address that keep billing while the instances are stopped. An instance stopped most of the week is a poor candidate for a commitment.
Lever 06 · Reshape
Rightsize with data
AWS Compute Optimizer analyzes the configuration and utilization of your resources and recommends sizes, flagging each instance as under-provisioned, over-provisioned or optimized. You opt in; it reads 14 days of metrics by default, 32 at no extra cost and 93 with the paid enhanced metrics (preferences), and it only sees memory if the CloudWatch agent, or one of the observability products it can read (Datadog, Dynatrace, Instana, New Relic), sends it (EC2 metrics): without memory, a recommendation ignores it. "There is no additional charge for AWS Compute Optimizer" beyond the CloudWatch fees.
In the M7i family in Paris, each size up doubles the hourly price, so one size down halves the cost of an M7i instance:
Check your own family's prices before counting on the same ratio.
Lever 07 · Reshape
Move to Graviton
AWS states that Graviton-based instances "cost up to 20% less than comparable x86-based Amazon EC2 instances". At the same size in Paris, On-Demand, m7g.large costs 19.0% less than m7i.large, c7g.large 19.0% less than c7i.large, r7g.large 19.0% less than r7i.large, and t4g.small 20.3% less than t3.small:
The same size means the same vCPU count and memory, not the same cores: m7g.large has two cores where m7i.large has one (Reading an instance name).
Graviton runs Linux only and needs an arm64 AMI (Nitro instances); Compute Optimizer rates the migration effort of each Graviton recommendation. Plan the move before a commitment: an EC2 Instance Savings Plan is tied to one family, so a plan bought for m7i does not follow the instances to m7g, while a Compute Savings Plan does.
Lever 08 · Reshape
Compare generations on price-performance, not on price
AWS recommends current-generation types over previous-generation ones "for the best performance"; among current generations, compare price-performance. Newer is not cheaper per hour: in Paris, m7i.large costs 5.0% more than m6i.large, and m8g.large 10.0% more than m7g.large.
AWS's claim for M7i instances is "up to 15% better price performance compared to M6i", and for M8g instances "up to 30% better performance ... than the seventh-generation AWS Graviton3-based M7g instances". The saving comes only if the workload then needs fewer or smaller instances: measure it before and after.
Lever 09 · Reshape
Pick burstable, Flex or fixed performance
T instances "can save you up to 15% in costs when compared to M instances" for that profile. They stop being cheap when they burst all the time, in AWS's own example:
If a T3 instance continuously bursts at 100% CPU, you end up paying approximately 1.5 times the price of an equivalently-sized M5 instance
The CloudWatch metric CPUSurplusCreditsCharged shows it, and the small service above finds the break-even point of a t4g.large against an m7g.large. For a steady load that doesn't use all its CPU, m7i-flex.large costs 5.0% less than m7i.large in Paris.
Lever 10 · Reshape
Scale with demand
EC2 Auto Scaling can "reduce costs by adding capacity to handle peak loads and removing capacity when demand is lower". With a target tracking policy, AWS advises: "set the target value as high as possible with a reasonable buffer for unexpected traffic increases".
Lever 11 · Reshape
Run interruptible work on Spot
AWS's Spot best practices: be flexible across at least 10 instance types and every zone, launch through Auto Scaling groups or EC2 Fleet with the price-capacity-optimized allocation strategy, and act on the two-minute notice. Spot is "not suitable for workloads that are inflexible, stateful, fault-intolerant, or tightly coupled between instance nodes". What an interrupted instance costs depends on who ends it, and when (Billing for interrupted Spot Instances):
How an interrupted Spot Instance's usage is billed, Linux and Windows
| Who ends it | In its first hour | After its first hour |
|---|---|---|
| Amazon EC2 interrupts it | Not billed | Billed |
| You stop or terminate it | Billed | Billed |
Billed: for the seconds used. SUSE Linux instances follow hourly rules instead. While an interrupted Spot Instance is stopped, only its EBS volumes are billed.
Lever 12 · Route
Keep traffic within a zone where the design allows it
Data between instances in one zone is free: "Data transferred between Amazon EC2, Amazon RDS, Amazon Redshift, Amazon ElastiCache instances, and Elastic Network Interfaces in the same Availability Zone is free". Between zones, it costs $0.01 per GB in each direction in Paris. Several zones are how an application survives the loss of one, so the lever is to avoid needless traffic across zones, not to give up on them.
- Data between the instances
- Free
- If the zone fails
- Both instances go with it
- Data between the instances
- $0.01 per GB, billed out of one zone and into the other
- If a zone fails
- The other keeps serving
The trade: resilience against a price per GB. Keep the zones, cut the traffic between them that the design does not need.
For tightly coupled jobs, a cluster placement group keeps the instances in one zone, with the low-latency network they need.
Lever 13 · Commit
Commit to the steady baseline
Cover the usage present every hour, once rightsized (see the start of this section). Cost Explorer gives Savings Plans and Reserved Instance purchase recommendations (COST07-BP01), and Purchase Analyzer shows what a given amount does to "savings, coverage, and utilization" before you buy. Once bought, follow the plan with the utilization and coverage reports, and set budgets on its utilization and coverage.
Discounts are not the same for every family: in Paris, a one-year No Upfront Compute Savings Plan costs 18.6% less than On-Demand for a t4g.small, but 27.7% less for an r7g.large:
A three-year term goes further: an m7g.large on a three-year No Upfront EC2 Instance Savings Plan costs 54.4% less than On-Demand. And the levers add up:
Two levers together: Graviton and a commitment
46.6% lessper hour: an m7g.large on a one-year No Upfront EC2 Instance Savings Plan against an m7i.large On-Demand, in Paris.
Computed from the AWS Price List · eu-west-3 · Oct 12 and Oct 13, 2026
Between the two plans, the trade is depth against freedom: an EC2 Instance Savings Plan gives the larger discount but stays with one family in one Region, while a Compute Savings Plan follows a move to Graviton, to another Region, or to AWS Fargate and AWS Lambda.
Lever 14 · Review
Review on a cadence
"The review effort should reflect potential benefit", in AWS's words, and its example sets the cadence by each workload's share of the bill (COST10-BP01, workload review process):
How often AWS suggests reviewing a workload
| Workload | Reviewed |
|---|---|
| Core workloads, or workloads over ten percent of the bill | Quarterly or every six months |
| Workloads below ten percent of the bill | Annually |
The same page adjusts the cadence: more often for a workload whose market is expected to change, less often for one whose changes cost a lot to test and validate.
In short: Commit last: see the bill, delete what nothing uses, reshape the instance hours, and only then cover with a commitment the usage that is left every hour.
FAQ
Is EC2 billed per second?
On-Demand Linux, Windows, RHEL and Ubuntu Pro instances are, with a 60-second minimum; SLES instances are billed by the full hour (On-Demand: per second, while it runs).
Does a stopped instance cost money?
Its compute is not billed, but its EBS volumes are, and so is its Elastic IP address if it has one (What a stopped instance still costs).
How much does an Elastic IP address cost?
Every public IPv4 address, Elastic IP addresses included, costs $0.005 per hour in Paris, in use or idle (What a stopped instance still costs).
What is EC2-Other in Cost Explorer?
It is the group where Cost Explorer puts the costs that come with EC2 instances, "such as Amazon Elastic Block Store volumes or NAT gateways", apart from EC2 - Instances (What else is on the EC2 bill).
Savings Plans or Reserved Instances?
AWS recommends Savings Plans. For m7i.large and m7g.large in Paris, at one year No Upfront, a plan and the matching reservation cost the same per hour, so the choice is about flexibility (Savings Plans and Reserved Instances).