Cutting the AWS Bill

Part 11: How Every AWS Component Is Billed

Part 11 of 11 · intermediate

Oct 21, 2026 · devops · 30 min read · 5869 words intermediate

How Every AWS Component Is Billed: Per Hour, Per GB, Per Request.

devops aws finops billing

Summary: every AWS line item uses one of seven meters: per hour, per GB moved, per GB-month stored, per request, per unit per month, a commitment, or a pass-through tax. Once you know which meters a component uses, you know what drives its cost and which lever to pull. This guide walks through every common component with Mumbai (ap-south-1) list prices, the usage type you will see in Cost Explorer, a formula, the traps, and the fix. The biggest lesson: in a typical networking-heavy account, close to half the bill is charged per hour, whether or not any traffic flows.

About the numbers. Rates are Mumbai (ap-south-1) on-demand list prices in USD as pulled from the AWS Price List API in October 2026, before Savings Plans, credits or private discounts, and before tax. AWS changes prices, so re-check the price list before any purchase decision. All worked examples use a hypothetical team with invented round numbers, chosen to show the arithmetic, not to describe any real company.

1. Why read a bill by meter, not by service

Open Cost Explorer grouped by service and you see names: EC2, VPC, Network Firewall, CloudWatch. That view tells you where money goes, but not why. Two lines of the same size can behave completely differently. One rises with traffic, one with the number of things that exist, one with how long data sits around, one with how often a script calls an API.

Think of AWS as a city utility company. Some things charge rent (you pay every hour the thing exists). Some charge a toll (you pay for every GB that drives through). Some charge storage (you pay for space by the month). Some charge per ticket (you pay per API call). Most real components combine two or three of these. A NAT gateway charges rent and a toll. A load balancer charges rent and a capacity fee. Once you can see the rent and the toll separately, cost work stops being guesswork.

2. The seven meter types

MeterYou pay whenCost moves withTypical components
Per hourthe resource exists, busy or idlehow many you keep, for how longEC2, Network Firewall endpoints, NAT, load balancers, EKS clusters, RDS, VPN, Transit Gateway attachments
Per GB moveddata passes throughtraffic volume and its pathfirewall processing, NAT processing, cross-AZ transfer, internet egress, VPC endpoint data
Per GB-month storeddata sits somewheresize times time, even if unusedEBS volumes and snapshots, S3, ECR, backups, log storage
Per requestan API call or event happenshow often code, agents or users call itCost Explorer API, WAF, KMS, Secrets Manager, CloudTrail data events, Route 53 queries
Per unit per montha thing is provisionedcount of keys, secrets, alarms, metrics, ACLsKMS keys, Secrets Manager secrets, WAF ACLs and rules, CloudWatch alarms and metrics
Commitmentyou promise a $/hour for 1 or 3 yearshow much of your usage the promise coversSavings Plans, Reserved Instances
Pass-throughtax is applied to your invoiceyour pre-tax billGST in India, VAT or sales tax elsewhere
App on EC2 per hour NAT gateway hour + $0.056/GB Network Firewall hour + $0.065/GB Internet egress $0.1093/GB (first 10 TB) One GB leaving a private subnet can cross three per-GB meters Every box also has an hourly fee that runs whether or not this GB ever flows. The path, not the service, decides the price of a GB.

Fig 1. Meters stack along a network path. A firewall, NAT and egress each charge per GB on top of their hourly rent.

3. Decoding a usage type

Cost Explorer and the Cost and Usage Report (CUR) name every meter with a usage type. Learn the shape and you can decode any line without opening a pricing page. The prefix is a region code, then the meter name.

APS3-Endpoint-Hour                 Mumbai, Network Firewall endpoint, billed in hours
APS3-Traffic-GB-Processed          Mumbai, Network Firewall, billed per GB inspected
APS3-NatGateway-Bytes              Mumbai, NAT gateway data processed
APS3-DataTransfer-Regional-Bytes   Mumbai, traffic between Availability Zones
APS3-EBS:VolumeUsage.gp3           Mumbai, gp3 disk, provisioned GB-month
USE1-APIRequest                    N. Virginia, Cost Explorer API call

APS3 is Mumbai (ap-south-1). Hyderabad (ap-south-2) has its own prefix, which is why a disaster-recovery region shows up as a separate set of lines. Global services such as Cost Explorer are priced in US East and carry a USE1 prefix wherever you call them from.

Four rules used everywhere in this guide

  • A month is 730 hours. AWS uses 730 hours to turn hourly rates into monthly ones. That is where the familiar $3.65 per month for a public IPv4 address comes from ($0.005 × 730).
  • Prices are list, before discounts. Savings Plans, credits and private pricing lower the effective rate. Tax is added on top.
  • Hourly resources bill while idle. A firewall with no traffic, a load balancer with no targets and an unattached disk all keep their meter running.
  • Data in is almost always free; data out and data sideways is not. The path a packet takes decides which per-GB meters it crosses.

4. One-page cheat sheet

Mumbai (ap-south-1) on-demand list prices, USD, October 2026. Monthly figures use 730 hours.

ComponentModelWhat is meteredMumbai rateNote
EC2 instanceper hourinstance-hour, varies by typet3.medium $0.0448, m6a.large $0.0556, r6a.xlarge $0.143Stops when the instance stops
Network Firewallhourly + per GBendpoint-hour + GB processed$0.395/endpoint-hr ($288/mo) + $0.065/GBOne endpoint per AZ
NAT gatewayhourly + per GBgateway-hour + GB processed$0.056/hr ($40.88/mo) + $0.056/GBPer NAT, per AZ
Load balancer (ALB, NLB)hourly + capacityLB-hour + LCU or NLCU$0.0239/hr ($17.45/mo) + $0.008 ALB / $0.006 NLB per capacity-unit-hourThe hourly fee is the floor
EKS control planeper hourcluster-hour$0.10/hr ($73/mo); extended support $0.50/hrNodes billed as EC2
RDS PostgreSQLhourly + storageinstance-hour + GB-monthdb.r6g.2xlarge $1.025/hr Single-AZ, $2.05 Multi-AZ; gp3 $0.131/GB-moMulti-AZ doubles both
Public IPv4 / Elastic IPper houraddress-hour$0.005/hr ($3.65/mo)In use or idle, since Feb 2024
VPC interface endpointhourly + per GBendpoint-hour per AZ + GB$0.013/hr ($9.49/mo) + $0.01/GBGateway endpoints for S3 and DynamoDB are free
Transit Gatewayhourly + per GBattachment-hour + GB$0.07/hr ($51.10/mo) + $0.02/GBPer attachment
Site-to-Site VPNper hourconnection-hour$0.05/hr ($36.50/mo)Plus a TGW attachment if used
Client VPNhourlyendpoint association-hour + connection-hour$0.15/hr ($110/mo) + $0.05 per active connection-hourAn unused endpoint still bills
EBS gp3per GB-monthGB provisioned (+ IOPS, throughput above baseline)$0.0912/GB-mo; gp2 $0.114; snapshots $0.05Billed attached or not
S3 Standardper GB-month + requestsGB stored + requests + retrieval$0.025/GB-mo; PUT/LIST $0.005 per 1,000; GET $0.004 per 10,000Glacier Flexible $0.0045/GB-mo
ECRper GB-monthGB of images$0.10/GB-moNo lifecycle policy means it grows forever
CloudWatch Logsper GBGB ingested + GB-month stored + GB scannedingest $0.67/GB; storage $0.03/GB-mo; query $0.0067/GBIngestion is the big meter
CloudWatch metrics, alarmsper unit per monthmetric-month, alarm-monthcustom metric $0.30 (first 10k); alarm $0.10Small free tier
Cost Explorer APIper requestAPI request$0.01 per request, each page countsConsole is free
AWS WAFper unit + requestweb ACL + rule per month + requests$5 per ACL, $1 per rule, $0.60 per million requestsLogging billed separately
KMSper unit + requestkey-month + requests$1 per customer key; $0.03 per 10,000 requestsAWS-managed keys have no monthly fee
Secrets Managerper unit + requestsecret-month + API calls$0.40 per secret; $0.05 per 10,000 calls
CloudTrailper requestevents beyond the free copydata events $1.00 per millionFirst management trail free
AWS Configper requestconfiguration items + rule evaluations$0.003 per item; $0.001 per evaluation (first 100k)Recorder scope drives cost
Route 53per requesthosted zone + queries$0.40 per million resolver queries; $0.125/hr per resolver endpoint ENI
AWS Budgetsper unitaction-enabled budget-day$0.10 per budget-day beyond 62 freeCost Anomaly Detection is free
Data transferper GBGB, by pathcross-AZ $0.01 each way; internet out $0.1093 (first 10 TB); Mumbai to Hyderabad $0.086Inbound from the internet is free
Savings Planscommitment$/hour for 1 or 3 yearson-demand rate less the plan discountBilled whether used or not
Taxpass-throughpercent of taxable linesIndia GST, roughly 15 to 18 percent of pre-tax in practiceLands on the 1st for the prior month

5. What a typical bill looks like by meter

Take a hypothetical platform team running Kubernetes on EKS in Mumbai, with a firewall in front of every VPC, a few dozen load balancers and a disaster-recovery copy in Hyderabad. Suppose its monthly bill is $20,000. Grouped by meter instead of by service, a bill like that often looks roughly like this:

Billing modelWhat is in itHypothetical share
Per hour, always onEC2, firewall endpoints, load balancer hours, EKS clustersabout 45%
Per GB movedfirewall processing, cross-AZ transfer, NAT processingabout 15 to 20%
Per GB-month storedEBS volumes, S3about 12%
Logs, IPs, endpoints, misc.CloudWatch, public IPv4, VPC endpoints, capacity unitsabout 10%
Taxpass-throughabout 13 to 15%

The first row is the important one. Nearly half the money is decided by what exists, not by what is used. Traffic can fall to zero overnight and that half barely moves. That is why the fastest savings usually come from deleting or consolidating things, not from tuning them.

Reading the bill backwards: dollars to quantities

A useful trick is to divide each line by its list rate. The result tells you what is actually running, which is often a surprise.

Hypothetical lineCost÷ rate≈ quantity
Firewall endpoint-hours$2,844$0.395 × 720 h10 endpoints running all month
Firewall data processed$1,950$0.065/GB30 TB inspected (1,000 GB/day)
EBS gp3 storage$2,280$0.0912/GB-mo25 TB of volumes
Cross-AZ transfer$800$0.02/GB ($0.01 each side)40 TB crossed zones
Load balancer hours$860$0.0239 × 720 h50 load balancers
EKS control plane$360$0.10 × 720 h5 clusters

"We have 50 load balancers?" is a common reaction. These are derived numbers, and they assume list price with no discount, but they turn an abstract bill into a list of things you can go and look at.

Part A. Hourly and per-GB networking

Networking is where bills quietly grow. Each component below has a fixed fee for existing plus a variable fee for traffic, and several of them sit on the same path.

AWS Network Firewall

Billed like a rented appliance. You pay for each firewall endpoint for every hour it exists, one endpoint per Availability Zone the firewall covers, and separately for every GB it inspects. Idle or busy, the endpoint fee does not change.

MeteredUnitMumbai rateUsage type
Endpointhour, per endpoint$0.395APS3-Endpoint-Hour
Traffic processedGB$0.065APS3-Traffic-GB-Processed
Traffic via Transit Gateway attachmentGB$0.065APS3-Traffic-Bytes-Processed-Transit-Gateway
Advanced inspection endpoint (TLS)hour$0.380APS3-Advanced-Inspection-Endpoint-Hour
Advanced threat protectionGB$0.005APS3-Advanced-Threat-Protection-Traffic-GB-Processed
Secondary endpointhour$0.158APS3-Secondary-Endpoint-Hour

Formula: monthly = (endpoints × $0.395 × 730) + (GB inspected × $0.065)

Worked example (hypothetical). A two-AZ firewall with zero traffic costs 2 × $0.395 × 730 = $577 a month before it inspects a single byte. A small dev VPC with such a firewall costs about $19 a day forever. Add 20 TB of inspected traffic and you add 20,480 × $0.065 = $1,331.

Watch for. The firewall is one of three charges on a typical outbound path (NAT hour, NAT GB, firewall GB). Traffic that does not need inspection, such as calls to S3, still pays $0.065/GB if it takes that route. Each extra AZ adds a whole endpoint, and a DR region that mirrors production doubles the fixed floor. Deleting a firewall changes the security model, so it is an architecture decision, not just a cost one.
Lever. Fewer endpoints per environment (one AZ for non-production VPCs where acceptable), a shared inspection VPC behind Transit Gateway instead of a firewall per VPC, and routing AWS-service traffic through free gateway endpoints so it never reaches the firewall.

NAT gateway

A managed NAT is billed for existing and for every GB it processes, in both directions. Because it is one per AZ, an environment with a NAT in each of two zones pays the hourly fee twice.

MeteredUnitMumbai rateUsage type
NAT gatewayhour$0.056APS3-NatGateway-Hours
Data processedGB$0.056APS3-NatGateway-Bytes

Formula: monthly = (NATs × $0.056 × 730) + (GB × $0.056)

Worked example (hypothetical). One NAT is $40.88 a month fixed. Four NATs across environments are about $164 before any data. Push 4 TB through them and add about $230.

Watch for. A NAT in front of a firewall means traffic pays NAT $0.056 plus firewall $0.065, up to $0.121/GB. AWS documents a waiver on part of the NAT charge when both are in the path, so the effective rate lands between $0.065 and $0.121. Public IPv4 on the NAT adds $3.65 a month per address. NAT cost appears in Cost Explorer under "EC2 other", not under VPC, which makes it easy to miss.
Lever. Send S3 and DynamoDB traffic through free gateway endpoints, and remove NAT from VPCs that have no private egress need.

Load balancers (ALB and NLB)

Two meters: a fixed fee for every hour the balancer exists, and a capacity fee measured in LCU (ALB) or NLCU (NLB). You are billed on whichever dimension is highest in that hour: new connections, active connections, bytes processed or rule evaluations.

MeteredUnitMumbai rateUsage type
Application Load Balancerhour$0.0239APS3-LoadBalancerUsage
Network Load Balancerhour$0.0239APS3-LoadBalancerUsage
Gateway Load Balancerhour$0.0133APS3-LoadBalancerUsage
ALB capacity unitLCU-hour$0.008APS3-LCUUsage
NLB capacity unitNLCU-hour$0.006APS3-LCUUsage
Classic LB data processedGB$0.008APS3-DataProcessing-Bytes

Formula: monthly = (LBs × $0.0239 × 730) + (capacity units × rate)

Worked example (hypothetical). 50 load balancers cost about $870 a month in hours alone. If 30 of them carry almost no traffic, consolidating them saves around $500 a month, plus their public IPs.

Watch for. In Kubernetes, every Service of type LoadBalancer creates its own NLB. Ten services means ten balancers, each with its own hourly fee. Every public balancer also holds a public IPv4 address per AZ at $3.65 a month each.
Lever. Put services behind one ingress controller per cluster, and delete balancers with no healthy targets.

EKS control plane

AWS charges a flat hourly fee per cluster for the managed control plane. Worker nodes are ordinary EC2 instances billed separately, along with their volumes and load balancers.

MeteredUnitMumbai rateUsage type
Cluster, standard supportcluster-hour$0.10APS3-AmazonEKS-Hours:perCluster
Cluster, extended supportcluster-hour$0.50APS3-AmazonEKS-Hours:extendedSupport
Hybrid nodesvCPU-hour$0.02, tiered down to $0.006APS3-AmazonEKSHybridNodes-Hours:pervCPU

Formula: monthly = clusters × $0.10 × 730 = $73 per cluster.

Watch for. A cluster on a Kubernetes version past standard support jumps to $0.50 an hour, five times the price, or $365 a month. Scaling node groups to zero removes the EC2 cost but not the cluster fee.
Lever. Delete empty test clusters, keep every cluster on a supported version, and consider fewer, shared clusters with namespaces.

EC2 instances

Billed per second (60-second minimum) at an hourly rate set by instance type, region and purchase option. The rate stops when the instance stops, but its disks and Elastic IPs keep billing.

InstanceMumbai rate per hourUsage type
t3.medium (2 vCPU, 4 GiB)$0.0448APS3-BoxUsage:t3.medium
m6a.large$0.0556APS3-BoxUsage:m6a.large
m7g.large (Graviton)$0.0583APS3-BoxUsage:m7g.large
c6a.2xlarge$0.187APS3-BoxUsage:c6a.2xlarge
r6a.xlarge$0.143APS3-BoxUsage:r6a.xlarge
r6i.xlarge$0.260APS3-BoxUsage:r6i.xlarge
Spotmarket price, usually far below on-demandAPS3-SpotUsage:<type>

Formula: monthly = instances × hourly rate × hours running (Linux, shared tenancy, on-demand).

Worked example (hypothetical). 30 t3.medium nodes at $0.0448 × 720 hours cost $32.26 each, about $968 a month. Size is linear: a c6a.4xlarge at $0.374 an hour costs exactly four times a c6a.xlarge at $0.0935.

Watch for. Because size is linear, halving the instance halves the cost, which makes right-sizing the biggest EC2 lever. Windows and licensed software such as SQL Server add a per-hour licence on top. Stopped instances still pay for their volumes and for any Elastic IP not attached to a running instance.
Lever. Right-size using 14 days of CloudWatch CPU and memory, move to Graviton where the software supports it, then cover steady load with a Savings Plan.

Savings Plans and Reserved Instances

Not a service but a billing contract. You commit to a fixed $/hour for one or three years, and AWS bills matching usage at a lower rate. The commitment is charged every hour whether you use it or not, so it only saves money on usage that is truly steady.

TypeUnitDiscountUsage type
Compute Savings Plan$/hour commitmentAWS states "up to 66%"SavingsPlanCoveredUsage / SavingsPlanNegation
EC2 Instance Savings Plan$/hour commitment"up to 72%"same
Reserved Instanceinstance-hourdiscounted hourly rate per typeHeavyUsage:<type>

Formula: covered usage costs the commitment rate; uncovered usage costs on-demand; unused commitment is lost.

Watch for. Resize first, then commit. Committing on an oversized fleet locks the waste in for years. A plan held at the organization's payer account makes member-account bills look like compute is free, so judge cost at the payer. Savings Plans cover compute (and Compute Savings Plans also cover Fargate and Lambda). They do not cover firewalls, NAT, EBS or data transfer.

VPC networking: public IPv4, endpoints, Transit Gateway, VPN

The "VPC" line in Cost Explorer is a mix of small hourly charges. Each is cheap, but they multiply by AZ, by VPC and by account.

MeteredUnitMumbai rateUsage type
Public IPv4 (in use or idle)address-hour$0.005APS3-PublicIPv4:InUseAddress / IdleAddress
Interface endpoint (PrivateLink)endpoint-hour, per AZ$0.013APS3-VpcEndpoint-Hours
Interface endpoint dataGB (to 1 PB)$0.01APS3-VpcEndpoint-Bytes
Gateway endpoint (S3, DynamoDB)nonefreenone
Transit Gateway attachmentattachment-hour$0.07APS3-TransitGateway-Hours
Transit Gateway dataGB$0.02APS3-TransitGateway-Bytes
Site-to-Site VPN connectionconnection-hour$0.05APS3-VPN-Usage-Hours:ipsec.1
Client VPN endpoint associationhour$0.15APS3-ClientVPN-EndpointHours
Client VPN active connectionhour per user$0.05APS3-ClientVPN-ConnectionHours
VPC peering dataGB each direction$0.01APS3-VpcPeering-In/Out-Bytes

Worked example (hypothetical). A hub account with a Transit Gateway and five attachments pays 5 × $51.10 = $256 a month before any traffic. Three VPN connections add $110, even if one of the tunnels carries zero bytes. Three interface endpoints across three AZs cost 9 × $9.49, about $85.

Watch for. An interface endpoint bills per AZ you attach it to. The gateway endpoint for S3 is free, but only works if it is associated with the right subnet route tables. A Client VPN endpoint left associated still bills its association fee.
Lever. Release idle addresses, delete empty endpoints and unused VPN tunnels, and attach S3 gateway endpoints everywhere.

Data transfer

Data movement is metered by path, not by service. The same GB can be free, $0.01 or $0.11 depending on where it goes.

PathUnitMumbai rateUsage type
Same AZ, private IPGBfreen/a
Between AZs, same regionGB, charged on each side$0.01 out + $0.01 inAPS3-DataTransfer-Regional-Bytes
Out to the internet (first 10 TB)GB$0.1093APS3-AWS-Out-Bytes
Out to the internet (10 to 50 TB)GB$0.085APS3-AWS-Out-Bytes
Mumbai to Hyderabad (inter-region)GB$0.086APS3-AWS-Out-Bytes
Internet into AWSGBfreen/a

Formula: cross-AZ cost = GB × $0.01 × 2 (once leaving one AZ, once arriving in the other).

Worked example (hypothetical). A monitoring pod in one zone scrapes a busy peer in another zone and receives 2.5 TB a day. That is about 2,560 GB × $0.02 = $51 a day, or $1,500 a month, for a single misplaced pod. Moving it into the same zone makes the traffic free.

Watch for. Chatty replication, monitoring scrapes and Kafka or Postgres traffic between zones are the usual causes. DR replication from Mumbai to Hyderabad is $0.086/GB, so 1 TB a month is about $88 plus the receiving side's storage. Cross-AZ is billed inside "EC2 other", not under VPC.
Lever. Keep chatty pairs in the same AZ (topology-aware routing in Kubernetes), and watch the cross-AZ usage type every day.

Part B. Storage: pay per GB-month

Storage bills on provisioned or stored size multiplied by time. It does not care whether anything ever reads it.

EBS volumes and snapshots

You pay for the size you provision, not the data you store, from the moment the volume is created until it is deleted. Detaching it or stopping the instance changes nothing.

MeteredUnitMumbai rateUsage type
gp3 storageGB-month$0.0912APS3-EBS:VolumeUsage.gp3
gp3 extra IOPS (above 3,000)IOPS-month$0.0057APS3-EBS:VolumeP-IOPS.gp3
gp3 extra throughput (above 125 MiB/s)MiBps-month$0.0456APS3-EBS:VolumeP-Throughput.gp3
gp2 storageGB-month$0.114APS3-EBS:VolumeUsage.gp2
io2 storage / IOPSGB-month / IOPS-month$0.131 / $0.068APS3-EBS:VolumeUsage.io2
st1 / sc1 HDDGB-month$0.051 / $0.0174APS3-EBS:VolumeUsage.st1 / .sc1
SnapshotGB-month (incremental)$0.05APS3-EBS:SnapshotUsage
Snapshot archiveGB-month$0.0125 (retrieval $0.03/GB)APS3-EBS:SnapshotArchiveStorage

Formula: monthly = provisioned GB × rate + extra IOPS and throughput.

Worked example (hypothetical). Deleting a forgotten 2 TB data volume saves 2,048 × $0.0912 = $187 a month. Sixty unattached volumes totalling 2.3 TB cost about $210 a month while doing nothing.

Watch for. gp2 is 25 percent more expensive than gp3 for the same size and gives less baseline performance, and converting is online and free. Snapshots are incremental but billed at the full $0.05, and many old ones add up. If a savings estimate uses the US gp3 rate ($0.08), it understates Mumbai savings, where gp3 is $0.0912.
Lever. Delete unattached volumes after taking a snapshot, convert gp2 to gp3, and set a lifecycle policy for snapshots.

S3, ECR and AWS Backup

S3 charges separately for what you store, how often you call it, and what you pull back out. The storage class sets the price: cheaper classes trade lower storage cost for retrieval fees and minimum storage durations.

MeteredUnitMumbai rateUsage type
S3 Standard (first 50 TB)GB-month$0.025APS3-TimedStorage-ByteHrs
Standard-IAGB-month$0.0138 (+ $0.01/GB retrieval)APS3-TimedStorage-SIA-ByteHrs
Glacier Instant RetrievalGB-month$0.005 (+ $0.03/GB retrieval)APS3-TimedStorage-GIR-ByteHrs
Glacier Flexible RetrievalGB-month$0.0045APS3-TimedStorage-GlacierByteHrs
PUT / COPY / POST / LISTper 1,000 requests$0.005APS3-Requests-Tier1
GET and othersper 10,000 requests$0.004APS3-Requests-Tier2
ECR image storageGB-month$0.10APS3-TimedStorage-ByteHrs
AWS Backup (EBS/EC2 warm)GB-monthsee the Backup price listAPS3-WarmStorage-ByteHrs-<service>

Formula: monthly = GB stored × class rate + requests + retrieval + lifecycle transitions.

Worked example (hypothetical). A single database-backup bucket holding 3.4 TB in Standard costs about $85 a month. A lifecycle rule moving objects older than 30 days to Glacier Flexible Retrieval cuts that part to about $15. Flow-log buckets that already move data to Glacier after 7 days cost almost nothing.

Watch for. Transition requests are charged (Glacier PUT is $0.036 per 1,000), so lifecycle rules on millions of tiny objects can cost more than they save. Versioned buckets without a noncurrent-version expiry rule keep every old version billing. Glacier classes have minimum storage durations of 90 or 180 days, and deleting earlier is billed for the remainder.
Lever. Add lifecycle rules (transition, expire noncurrent versions, abort incomplete multipart uploads) and ECR lifecycle policies that keep only the last N images.

Part C. Per request, per event and per unit

These cost little per call, so they hide until something automated calls them in a loop, or an agent runs every hour.

AWS Cost Explorer

The Cost Explorer console is free. The API (GetCostAndUsage, GetCostForecast, GetRightsizingRecommendation and the rest) costs a flat fee per request, and a paginated response counts one request per page. A separate opt-in charge applies to hourly and resource-level data.

MeteredUnitRateUsage type
API request (any Cost Explorer call)request$0.01USE1-APIRequest
Additional source viewsrequest$0.01USE1-AdditionalSourceViews
Granular (hourly, resource-level) dataper 1,000 usage records per month$0.01USE1-CostDataStorage
Console, saved reports, 13 months of datanonefreenone

Formula: monthly = calls per day × 30 × $0.01 (multiply by pages per call if results paginate).

Calls per dayPer dayPer monthPer year
30$0.30$9$110
100$1.00$30$365
300$3.00$90$1,095
600$6.00$180$2,190
2,000$20.00$600$7,300
A common estimation mistake. If you design a cost-reporting agent that makes 30 calls a day for each of 20 accounts, that is 600 calls a day and about $180 a month, not the $9 a month that "30 calls a day" sounds like. Calling once from the payer account, grouped by linked account, keeps it near the low end.
Watch for. Calls are billed in US East wherever you make them, and appear under Cost Explorer, not under the service you are analysing. Loops matter: a dashboard refresh that fires 40 grouped queries is $0.40, and a scheduler running it hourly does that 24 times a day. Resource-level data only reaches back 14 days, so an agent that wants history must save its own snapshots.
Lever. Cache results (Cost Explorer data refreshes at most about once a day), group queries by account in one call, and use the CUR in S3 with Athena for heavy analysis.

CloudWatch: logs, metrics and alarms

Three families. Logs charge per GB ingested (the expensive part), per GB-month stored and per GB scanned by queries. Metrics charge per custom metric per month. Alarms charge per alarm per month. VPC flow logs sent to CloudWatch are "vended logs" and use the vended ingestion tiers.

MeteredUnitMumbai rateUsage type
Vended logs ingested (first 10 TB)GB$0.67APS3-VendedLog-Bytes
Custom logs ingested (Standard)GB$0.67APS3-DataProcessing-Bytes
Custom logs, Infrequent Access classGB$0.335APS3-DataProcessingIA-Bytes
Log storageGB-month$0.03APS3-TimedStorage-ByteHrs
Logs Insights queryGB scanned$0.0067APS3-DataScanned-Bytes
Custom metric (first 10,000)metric-month$0.30APS3-CW:MetricMonitorUsage
Standard alarmalarm-month$0.10APS3-CW:AlarmMonitorUsage
GetMetricData APIper 1,000 metrics$0.01APS3-CW:GMD-Metrics

Formula: logs = GB ingested × $0.67 + GB stored × $0.03 × months kept.

Worked example (hypothetical). 600 GB a month of VPC flow logs sent to CloudWatch costs about $400 in ingestion alone. Keeping 200 GB for 180 days is only about $6 a month of storage, but every byte was already charged $0.67 on the way in. Sending flow logs straight to S3 avoids most of that.

Watch for. Storage looks cheap and ingestion is where the money goes. Firewall alert and flow logging adds the same ingestion fee on top of the firewall's own charges.
Lever. Choose the cheapest flow-log destination (often S3), set a retention period on every log group, and filter before ingesting.

WAF, KMS, Secrets Manager, CloudTrail, Config, Route 53

Security and governance services share one pattern: a small monthly fee per object you create, plus a per-call or per-event fee that scales with traffic or automation.

MeteredUnitMumbai rateUsage type
WAF web ACLACL-month$5.00APS3-WebACLV2
WAF rulerule-month$1.00APS3-RuleV2
WAF requestsper million$0.60APS3-RequestV2-Tier1
KMS customer-managed keykey-month$1.00ap-south-1-KMS-Keys
KMS requestsper 10,000$0.03ap-south-1-KMS-Requests
Secrets Manager secretsecret-month$0.40APS3-AWSSecretsManager-Secrets
Secrets Manager APIper 10,000 calls$0.05APS3-AWSSecretsManagerAPIRequest
CloudTrail data eventsper event$1 per millionAPS3-DataEventsRecorded
CloudTrail Lake queryGB scanned$0.005APS3-QueryScanned-Bytes
Config configuration itemitem recorded$0.003APS3-ConfigurationItemRecorded
Config rule evaluationper evaluation (first 100k)$0.001APS3-ConfigRuleEvaluations
Route 53 resolver queriesper million (first 1B)$0.40APS3-DNS-Queries

Formula: monthly = (objects × monthly fee) + (calls or events × unit rate).

Watch for. KMS and Secrets Manager look like a few dollars, but 100 million KMS requests cost $300 (10,000 × $0.03), so a service that calls KMS on every request adds up. AWS Config bills per resource change, and EKS and autoscaling churn many resources, so check before turning on organization-wide recording. Free tiers cover the first management-event trail and some Config and Secrets Manager use.

RDS, DMS and Directory Service

Managed databases bill the instance by the hour plus storage, backup storage and, for provisioned IOPS, I/O. Multi-AZ doubles both the instance and the storage rate, because AWS runs a standby.

MeteredUnitMumbai rateUsage type
db.t3.medium PostgreSQL, Single / Multi-AZhour$0.106 / $0.212APS3-InstanceUsage:db.t3.medium
db.r6g.large PostgreSQL, Single / Multi-AZhour$0.256 / $0.513APS3-InstanceUsage:db.r6g.large
db.r6g.2xlarge PostgreSQL, Single / Multi-AZhour$1.025 / $2.05APS3-InstanceUsage:db.r6g.2xlarge
RDS gp3 storage, Single / Multi-AZGB-month$0.131 / $0.262APS3-RDS:GP3-Storage
Backup beyond free allocationGB-month$0.095APS3-RDS:ChargedBackupUsage
DMS gp2 replication storageGB-month$0.114APS3-DMS:GP2-Storage
Directory Service Standard ADDC-hour$0.07APS3-Std-MicrosoftAD-DC-Usage
Directory Service Enterprise ADDC-hour$0.224APS3-MicrosoftAD-DC-Usage

Formula: monthly = (instance rate × 730) + (GB × storage rate) + extra backup.

Worked example (hypothetical). A db.r6g.2xlarge Single-AZ costs $1.025 × 730 = $748 a month. If it sits at 1 percent CPU, dropping two sizes cuts the compute fee by roughly three quarters, because instance cost scales linearly with size.

Watch for. A stopped RDS instance restarts itself after seven days, and its storage keeps billing while stopped. Database Savings Plans and Reserved DB instances are the commitment route, but only once the size is settled.

6. Tax, free tools and governance

ItemHow it billsNote
Tax (India GST)pass-through on taxable linesNot optimizable. Lands on the 1st for the previous month, so a daily chart shows a big spike on day one. Exclude tax when judging a daily trend.
Gateway VPC endpoints (S3, DynamoDB)freeOnly works once attached to the right route tables.
Cost Anomaly DetectionfreeTurn it on in every account; there is no reason not to.
AWS Budgetsfirst 62 action-enabled budget-days free, then $0.10 per budget-dayAn account with no budget can run 50 percent over plan with nobody alerted.
Cost Explorer consolefreeThe API is $0.01 per request.
Inbound data from the internetfree
Same-AZ private trafficfreeThe cheapest path for chatty services.
AWS-managed KMS keys, IAM, the VPC itself, subnets, route tablesfreeThe things around them (NAT, endpoints, IPs) are not.
Support planpercentage of monthly spend on Business and aboveCheck which plan each account is on.

7. How to estimate a new component before you build it

  1. List every meter in the component's table above: hours, GB, requests, units.
  2. For each hourly meter, count the resources and multiply by rate × 730. Count per AZ where the table says per AZ.
  3. For each per-GB meter, estimate monthly GB for that path, then multiply. Trace the path: NAT, then firewall, then internet stacks several meters.
  4. For storage, multiply provisioned GB by the GB-month rate, and add snapshot and backup copies.
  5. Add tax (around 15 to 18 percent in India). Then subtract any Savings Plan coverage, on the compute part only.

Worked example: a new two-AZ VPC with NAT and a firewall, 2 TB a month outbound.

ItemCalculationMonthly
Firewall endpoints2 × $0.395 × 730$577
Firewall processing2,048 GB × $0.065$133
NAT gateways2 × $0.056 × 730$82
NAT processing (upper bound, no waiver)2,048 GB × $0.056$115
Public IPv4 on the NATs2 × $0.005 × 730$7
Subtotal before tax$914

Of that $914, about $666 is fixed and appears before a single byte flows. No compute, load balancers or storage are included yet. This is why "just one more VPC" is rarely cheap.

8. The levers, ranked by how often they pay

  1. Delete what exists but is not used. Unattached volumes, idle load balancers, empty clusters, unused VPN tunnels, idle public IPs. Pure hourly savings with no performance risk.
  2. Consolidate per-AZ and per-VPC infrastructure. Fewer firewall endpoints, a shared inspection VPC, one ingress per cluster.
  3. Fix the traffic path. Gateway endpoints for S3 and DynamoDB, same-AZ placement for chatty services, no NAT where there is no egress need.
  4. Right-size, then commit. Resize EC2 and RDS on two weeks of real metrics, move to Graviton, then buy Savings Plans for the steady remainder.
  5. Put lifecycles on everything that stores. S3 transitions, noncurrent-version expiry, ECR image limits, snapshot policies, log retention.
  6. Watch the loops. Any automation that calls a per-request API on a schedule: Cost Explorer, KMS, Secrets Manager, Config.

9. Common mistakes

  • Judging cost by service instead of by meter. You cannot tell rent from tolls at the service level.
  • Assuming idle means free. Hourly meters run while idle.
  • Buying a Savings Plan before right-sizing. It locks the waste in for one to three years.
  • Reading member-account bills when the plan sits at the payer. Compute can look free in a member account.
  • Using US prices for Mumbai estimates. Many Mumbai rates are higher, so savings get understated.
  • Reading a daily chart with tax in it. The spike on the 1st is tax for the previous month, not a sudden jump in usage.
  • Counting "calls per day" without multiplying by accounts and pages. Per-request APIs grow fast in automation.

FAQ

Why does my bill not drop when traffic drops?

Because a large share of it is per-hour rent for things that exist: instances, firewall endpoints, NATs, load balancers and clusters. Those meters run whether or not any traffic flows. Only the per-GB part follows traffic.

Where do NAT and cross-AZ charges show up in Cost Explorer?

Mostly under "EC2 other", not under VPC. Filter by usage type, such as NatGateway-Bytes or DataTransfer-Regional-Bytes, to see them clearly.

Is gp3 always cheaper than gp2?

For the same size, yes: in Mumbai gp3 is $0.0912 per GB-month against $0.114 for gp2, and it includes a higher baseline of IOPS and throughput. You only pay extra on gp3 if you provision IOPS or throughput above the baseline.

Do Savings Plans cover the firewall or data transfer?

No. They cover compute only (EC2, and for Compute Savings Plans also Fargate and Lambda). Firewalls, NAT, EBS and data transfer stay at their normal rates.

Is the Cost Explorer API expensive?

Each call is one cent, which is cheap until automation runs it in a loop across many accounts and pages. A design that calls once from the payer account and caches the result stays cheap.

Glossary

TermMeaning
Usage typeThe name of a billing meter in Cost Explorer and the CUR, such as APS3-NatGateway-Bytes.
CURCost and Usage Report: the most detailed AWS billing data, delivered to S3.
LCU / NLCULoad balancer capacity units, billed on the highest of several traffic dimensions each hour.
GB-monthOne GB stored for one month; the unit for storage pricing.
Vended logsLogs that AWS services produce for you, such as VPC flow logs, with their own ingestion rates.
Payer accountThe management account in an AWS Organization that receives the consolidated bill.
Gateway endpointA free VPC route to S3 or DynamoDB that avoids NAT and firewall per-GB charges.

Takeaways

  • Every AWS line item is one of seven meters. Learn the meter and you know the lever.
  • Close to half of a networking-heavy bill can be hourly rent that runs while idle.
  • The path a GB takes decides how many per-GB meters it pays.
  • Storage bills on provisioned size and time, never on use.
  • Per-request services are cheap until automation loops them.
  • Resize first, then commit, and judge commitments at the payer account.

References

← Part 10 series index →
© cvam — written in plaintext, served warm