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.
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
| Meter | You pay when | Cost moves with | Typical components |
|---|---|---|---|
| Per hour | the resource exists, busy or idle | how many you keep, for how long | EC2, Network Firewall endpoints, NAT, load balancers, EKS clusters, RDS, VPN, Transit Gateway attachments |
| Per GB moved | data passes through | traffic volume and its path | firewall processing, NAT processing, cross-AZ transfer, internet egress, VPC endpoint data |
| Per GB-month stored | data sits somewhere | size times time, even if unused | EBS volumes and snapshots, S3, ECR, backups, log storage |
| Per request | an API call or event happens | how often code, agents or users call it | Cost Explorer API, WAF, KMS, Secrets Manager, CloudTrail data events, Route 53 queries |
| Per unit per month | a thing is provisioned | count of keys, secrets, alarms, metrics, ACLs | KMS keys, Secrets Manager secrets, WAF ACLs and rules, CloudWatch alarms and metrics |
| Commitment | you promise a $/hour for 1 or 3 years | how much of your usage the promise covers | Savings Plans, Reserved Instances |
| Pass-through | tax is applied to your invoice | your pre-tax bill | GST in India, VAT or sales tax elsewhere |
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.
| Component | Model | What is metered | Mumbai rate | Note |
|---|---|---|---|---|
| EC2 instance | per hour | instance-hour, varies by type | t3.medium $0.0448, m6a.large $0.0556, r6a.xlarge $0.143 | Stops when the instance stops |
| Network Firewall | hourly + per GB | endpoint-hour + GB processed | $0.395/endpoint-hr ($288/mo) + $0.065/GB | One endpoint per AZ |
| NAT gateway | hourly + per GB | gateway-hour + GB processed | $0.056/hr ($40.88/mo) + $0.056/GB | Per NAT, per AZ |
| Load balancer (ALB, NLB) | hourly + capacity | LB-hour + LCU or NLCU | $0.0239/hr ($17.45/mo) + $0.008 ALB / $0.006 NLB per capacity-unit-hour | The hourly fee is the floor |
| EKS control plane | per hour | cluster-hour | $0.10/hr ($73/mo); extended support $0.50/hr | Nodes billed as EC2 |
| RDS PostgreSQL | hourly + storage | instance-hour + GB-month | db.r6g.2xlarge $1.025/hr Single-AZ, $2.05 Multi-AZ; gp3 $0.131/GB-mo | Multi-AZ doubles both |
| Public IPv4 / Elastic IP | per hour | address-hour | $0.005/hr ($3.65/mo) | In use or idle, since Feb 2024 |
| VPC interface endpoint | hourly + per GB | endpoint-hour per AZ + GB | $0.013/hr ($9.49/mo) + $0.01/GB | Gateway endpoints for S3 and DynamoDB are free |
| Transit Gateway | hourly + per GB | attachment-hour + GB | $0.07/hr ($51.10/mo) + $0.02/GB | Per attachment |
| Site-to-Site VPN | per hour | connection-hour | $0.05/hr ($36.50/mo) | Plus a TGW attachment if used |
| Client VPN | hourly | endpoint association-hour + connection-hour | $0.15/hr ($110/mo) + $0.05 per active connection-hour | An unused endpoint still bills |
| EBS gp3 | per GB-month | GB provisioned (+ IOPS, throughput above baseline) | $0.0912/GB-mo; gp2 $0.114; snapshots $0.05 | Billed attached or not |
| S3 Standard | per GB-month + requests | GB stored + requests + retrieval | $0.025/GB-mo; PUT/LIST $0.005 per 1,000; GET $0.004 per 10,000 | Glacier Flexible $0.0045/GB-mo |
| ECR | per GB-month | GB of images | $0.10/GB-mo | No lifecycle policy means it grows forever |
| CloudWatch Logs | per GB | GB ingested + GB-month stored + GB scanned | ingest $0.67/GB; storage $0.03/GB-mo; query $0.0067/GB | Ingestion is the big meter |
| CloudWatch metrics, alarms | per unit per month | metric-month, alarm-month | custom metric $0.30 (first 10k); alarm $0.10 | Small free tier |
| Cost Explorer API | per request | API request | $0.01 per request, each page counts | Console is free |
| AWS WAF | per unit + request | web ACL + rule per month + requests | $5 per ACL, $1 per rule, $0.60 per million requests | Logging billed separately |
| KMS | per unit + request | key-month + requests | $1 per customer key; $0.03 per 10,000 requests | AWS-managed keys have no monthly fee |
| Secrets Manager | per unit + request | secret-month + API calls | $0.40 per secret; $0.05 per 10,000 calls | |
| CloudTrail | per request | events beyond the free copy | data events $1.00 per million | First management trail free |
| AWS Config | per request | configuration items + rule evaluations | $0.003 per item; $0.001 per evaluation (first 100k) | Recorder scope drives cost |
| Route 53 | per request | hosted zone + queries | $0.40 per million resolver queries; $0.125/hr per resolver endpoint ENI | |
| AWS Budgets | per unit | action-enabled budget-day | $0.10 per budget-day beyond 62 free | Cost Anomaly Detection is free |
| Data transfer | per GB | GB, by path | cross-AZ $0.01 each way; internet out $0.1093 (first 10 TB); Mumbai to Hyderabad $0.086 | Inbound from the internet is free |
| Savings Plans | commitment | $/hour for 1 or 3 years | on-demand rate less the plan discount | Billed whether used or not |
| Tax | pass-through | percent of taxable lines | India GST, roughly 15 to 18 percent of pre-tax in practice | Lands 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 model | What is in it | Hypothetical share |
|---|---|---|
| Per hour, always on | EC2, firewall endpoints, load balancer hours, EKS clusters | about 45% |
| Per GB moved | firewall processing, cross-AZ transfer, NAT processing | about 15 to 20% |
| Per GB-month stored | EBS volumes, S3 | about 12% |
| Logs, IPs, endpoints, misc. | CloudWatch, public IPv4, VPC endpoints, capacity units | about 10% |
| Tax | pass-through | about 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 line | Cost | ÷ rate | ≈ quantity |
|---|---|---|---|
| Firewall endpoint-hours | $2,844 | $0.395 × 720 h | 10 endpoints running all month |
| Firewall data processed | $1,950 | $0.065/GB | 30 TB inspected (1,000 GB/day) |
| EBS gp3 storage | $2,280 | $0.0912/GB-mo | 25 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 h | 50 load balancers |
| EKS control plane | $360 | $0.10 × 720 h | 5 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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| Endpoint | hour, per endpoint | $0.395 | APS3-Endpoint-Hour |
| Traffic processed | GB | $0.065 | APS3-Traffic-GB-Processed |
| Traffic via Transit Gateway attachment | GB | $0.065 | APS3-Traffic-Bytes-Processed-Transit-Gateway |
| Advanced inspection endpoint (TLS) | hour | $0.380 | APS3-Advanced-Inspection-Endpoint-Hour |
| Advanced threat protection | GB | $0.005 | APS3-Advanced-Threat-Protection-Traffic-GB-Processed |
| Secondary endpoint | hour | $0.158 | APS3-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.
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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| NAT gateway | hour | $0.056 | APS3-NatGateway-Hours |
| Data processed | GB | $0.056 | APS3-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.
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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| Application Load Balancer | hour | $0.0239 | APS3-LoadBalancerUsage |
| Network Load Balancer | hour | $0.0239 | APS3-LoadBalancerUsage |
| Gateway Load Balancer | hour | $0.0133 | APS3-LoadBalancerUsage |
| ALB capacity unit | LCU-hour | $0.008 | APS3-LCUUsage |
| NLB capacity unit | NLCU-hour | $0.006 | APS3-LCUUsage |
| Classic LB data processed | GB | $0.008 | APS3-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.
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.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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| Cluster, standard support | cluster-hour | $0.10 | APS3-AmazonEKS-Hours:perCluster |
| Cluster, extended support | cluster-hour | $0.50 | APS3-AmazonEKS-Hours:extendedSupport |
| Hybrid nodes | vCPU-hour | $0.02, tiered down to $0.006 | APS3-AmazonEKSHybridNodes-Hours:pervCPU |
Formula: monthly = clusters × $0.10 × 730 = $73 per cluster.
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.
| Instance | Mumbai rate per hour | Usage type |
|---|---|---|
| t3.medium (2 vCPU, 4 GiB) | $0.0448 | APS3-BoxUsage:t3.medium |
| m6a.large | $0.0556 | APS3-BoxUsage:m6a.large |
| m7g.large (Graviton) | $0.0583 | APS3-BoxUsage:m7g.large |
| c6a.2xlarge | $0.187 | APS3-BoxUsage:c6a.2xlarge |
| r6a.xlarge | $0.143 | APS3-BoxUsage:r6a.xlarge |
| r6i.xlarge | $0.260 | APS3-BoxUsage:r6i.xlarge |
| Spot | market price, usually far below on-demand | APS3-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.
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.
| Type | Unit | Discount | Usage type |
|---|---|---|---|
| Compute Savings Plan | $/hour commitment | AWS states "up to 66%" | SavingsPlanCoveredUsage / SavingsPlanNegation |
| EC2 Instance Savings Plan | $/hour commitment | "up to 72%" | same |
| Reserved Instance | instance-hour | discounted hourly rate per type | HeavyUsage:<type> |
Formula: covered usage costs the commitment rate; uncovered usage costs on-demand; unused commitment is lost.
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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| Public IPv4 (in use or idle) | address-hour | $0.005 | APS3-PublicIPv4:InUseAddress / IdleAddress |
| Interface endpoint (PrivateLink) | endpoint-hour, per AZ | $0.013 | APS3-VpcEndpoint-Hours |
| Interface endpoint data | GB (to 1 PB) | $0.01 | APS3-VpcEndpoint-Bytes |
| Gateway endpoint (S3, DynamoDB) | none | free | none |
| Transit Gateway attachment | attachment-hour | $0.07 | APS3-TransitGateway-Hours |
| Transit Gateway data | GB | $0.02 | APS3-TransitGateway-Bytes |
| Site-to-Site VPN connection | connection-hour | $0.05 | APS3-VPN-Usage-Hours:ipsec.1 |
| Client VPN endpoint association | hour | $0.15 | APS3-ClientVPN-EndpointHours |
| Client VPN active connection | hour per user | $0.05 | APS3-ClientVPN-ConnectionHours |
| VPC peering data | GB each direction | $0.01 | APS3-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.
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.
| Path | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| Same AZ, private IP | GB | free | n/a |
| Between AZs, same region | GB, charged on each side | $0.01 out + $0.01 in | APS3-DataTransfer-Regional-Bytes |
| Out to the internet (first 10 TB) | GB | $0.1093 | APS3-AWS-Out-Bytes |
| Out to the internet (10 to 50 TB) | GB | $0.085 | APS3-AWS-Out-Bytes |
| Mumbai to Hyderabad (inter-region) | GB | $0.086 | APS3-AWS-Out-Bytes |
| Internet into AWS | GB | free | n/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.
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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| gp3 storage | GB-month | $0.0912 | APS3-EBS:VolumeUsage.gp3 |
| gp3 extra IOPS (above 3,000) | IOPS-month | $0.0057 | APS3-EBS:VolumeP-IOPS.gp3 |
| gp3 extra throughput (above 125 MiB/s) | MiBps-month | $0.0456 | APS3-EBS:VolumeP-Throughput.gp3 |
| gp2 storage | GB-month | $0.114 | APS3-EBS:VolumeUsage.gp2 |
| io2 storage / IOPS | GB-month / IOPS-month | $0.131 / $0.068 | APS3-EBS:VolumeUsage.io2 |
| st1 / sc1 HDD | GB-month | $0.051 / $0.0174 | APS3-EBS:VolumeUsage.st1 / .sc1 |
| Snapshot | GB-month (incremental) | $0.05 | APS3-EBS:SnapshotUsage |
| Snapshot archive | GB-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.
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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| S3 Standard (first 50 TB) | GB-month | $0.025 | APS3-TimedStorage-ByteHrs |
| Standard-IA | GB-month | $0.0138 (+ $0.01/GB retrieval) | APS3-TimedStorage-SIA-ByteHrs |
| Glacier Instant Retrieval | GB-month | $0.005 (+ $0.03/GB retrieval) | APS3-TimedStorage-GIR-ByteHrs |
| Glacier Flexible Retrieval | GB-month | $0.0045 | APS3-TimedStorage-GlacierByteHrs |
| PUT / COPY / POST / LIST | per 1,000 requests | $0.005 | APS3-Requests-Tier1 |
| GET and others | per 10,000 requests | $0.004 | APS3-Requests-Tier2 |
| ECR image storage | GB-month | $0.10 | APS3-TimedStorage-ByteHrs |
| AWS Backup (EBS/EC2 warm) | GB-month | see the Backup price list | APS3-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.
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.
| Metered | Unit | Rate | Usage type |
|---|---|---|---|
| API request (any Cost Explorer call) | request | $0.01 | USE1-APIRequest |
| Additional source views | request | $0.01 | USE1-AdditionalSourceViews |
| Granular (hourly, resource-level) data | per 1,000 usage records per month | $0.01 | USE1-CostDataStorage |
| Console, saved reports, 13 months of data | none | free | none |
Formula: monthly = calls per day × 30 × $0.01 (multiply by pages per call if results paginate).
| Calls per day | Per day | Per month | Per 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 |
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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| Vended logs ingested (first 10 TB) | GB | $0.67 | APS3-VendedLog-Bytes |
| Custom logs ingested (Standard) | GB | $0.67 | APS3-DataProcessing-Bytes |
| Custom logs, Infrequent Access class | GB | $0.335 | APS3-DataProcessingIA-Bytes |
| Log storage | GB-month | $0.03 | APS3-TimedStorage-ByteHrs |
| Logs Insights query | GB scanned | $0.0067 | APS3-DataScanned-Bytes |
| Custom metric (first 10,000) | metric-month | $0.30 | APS3-CW:MetricMonitorUsage |
| Standard alarm | alarm-month | $0.10 | APS3-CW:AlarmMonitorUsage |
| GetMetricData API | per 1,000 metrics | $0.01 | APS3-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.
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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| WAF web ACL | ACL-month | $5.00 | APS3-WebACLV2 |
| WAF rule | rule-month | $1.00 | APS3-RuleV2 |
| WAF requests | per million | $0.60 | APS3-RequestV2-Tier1 |
| KMS customer-managed key | key-month | $1.00 | ap-south-1-KMS-Keys |
| KMS requests | per 10,000 | $0.03 | ap-south-1-KMS-Requests |
| Secrets Manager secret | secret-month | $0.40 | APS3-AWSSecretsManager-Secrets |
| Secrets Manager API | per 10,000 calls | $0.05 | APS3-AWSSecretsManagerAPIRequest |
| CloudTrail data events | per event | $1 per million | APS3-DataEventsRecorded |
| CloudTrail Lake query | GB scanned | $0.005 | APS3-QueryScanned-Bytes |
| Config configuration item | item recorded | $0.003 | APS3-ConfigurationItemRecorded |
| Config rule evaluation | per evaluation (first 100k) | $0.001 | APS3-ConfigRuleEvaluations |
| Route 53 resolver queries | per million (first 1B) | $0.40 | APS3-DNS-Queries |
Formula: monthly = (objects × monthly fee) + (calls or events × unit rate).
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.
| Metered | Unit | Mumbai rate | Usage type |
|---|---|---|---|
| db.t3.medium PostgreSQL, Single / Multi-AZ | hour | $0.106 / $0.212 | APS3-InstanceUsage:db.t3.medium |
| db.r6g.large PostgreSQL, Single / Multi-AZ | hour | $0.256 / $0.513 | APS3-InstanceUsage:db.r6g.large |
| db.r6g.2xlarge PostgreSQL, Single / Multi-AZ | hour | $1.025 / $2.05 | APS3-InstanceUsage:db.r6g.2xlarge |
| RDS gp3 storage, Single / Multi-AZ | GB-month | $0.131 / $0.262 | APS3-RDS:GP3-Storage |
| Backup beyond free allocation | GB-month | $0.095 | APS3-RDS:ChargedBackupUsage |
| DMS gp2 replication storage | GB-month | $0.114 | APS3-DMS:GP2-Storage |
| Directory Service Standard AD | DC-hour | $0.07 | APS3-Std-MicrosoftAD-DC-Usage |
| Directory Service Enterprise AD | DC-hour | $0.224 | APS3-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.
6. Tax, free tools and governance
| Item | How it bills | Note |
|---|---|---|
| Tax (India GST) | pass-through on taxable lines | Not 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) | free | Only works once attached to the right route tables. |
| Cost Anomaly Detection | free | Turn it on in every account; there is no reason not to. |
| AWS Budgets | first 62 action-enabled budget-days free, then $0.10 per budget-day | An account with no budget can run 50 percent over plan with nobody alerted. |
| Cost Explorer console | free | The API is $0.01 per request. |
| Inbound data from the internet | free | |
| Same-AZ private traffic | free | The cheapest path for chatty services. |
| AWS-managed KMS keys, IAM, the VPC itself, subnets, route tables | free | The things around them (NAT, endpoints, IPs) are not. |
| Support plan | percentage of monthly spend on Business and above | Check which plan each account is on. |
7. How to estimate a new component before you build it
- List every meter in the component's table above: hours, GB, requests, units.
- For each hourly meter, count the resources and multiply by rate × 730. Count per AZ where the table says per AZ.
- For each per-GB meter, estimate monthly GB for that path, then multiply. Trace the path: NAT, then firewall, then internet stacks several meters.
- For storage, multiply provisioned GB by the GB-month rate, and add snapshot and backup copies.
- 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.
| Item | Calculation | Monthly |
|---|---|---|
| Firewall endpoints | 2 × $0.395 × 730 | $577 |
| Firewall processing | 2,048 GB × $0.065 | $133 |
| NAT gateways | 2 × $0.056 × 730 | $82 |
| NAT processing (upper bound, no waiver) | 2,048 GB × $0.056 | $115 |
| Public IPv4 on the NATs | 2 × $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
- 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.
- Consolidate per-AZ and per-VPC infrastructure. Fewer firewall endpoints, a shared inspection VPC, one ingress per cluster.
- Fix the traffic path. Gateway endpoints for S3 and DynamoDB, same-AZ placement for chatty services, no NAT where there is no egress need.
- 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.
- Put lifecycles on everything that stores. S3 transitions, noncurrent-version expiry, ECR image limits, snapshot policies, log retention.
- 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
| Term | Meaning |
|---|---|
| Usage type | The name of a billing meter in Cost Explorer and the CUR, such as APS3-NatGateway-Bytes. |
| CUR | Cost and Usage Report: the most detailed AWS billing data, delivered to S3. |
| LCU / NLCU | Load balancer capacity units, billed on the highest of several traffic dimensions each hour. |
| GB-month | One GB stored for one month; the unit for storage pricing. |
| Vended logs | Logs that AWS services produce for you, such as VPC flow logs, with their own ingestion rates. |
| Payer account | The management account in an AWS Organization that receives the consolidated bill. |
| Gateway endpoint | A 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
- AWS Price List API Where every rate in this guide comes from.
- AWS Network Firewall pricing Endpoint-hours and GB processed.
- Amazon VPC pricing NAT, public IPv4, endpoints, Transit Gateway and VPN.
- Elastic Load Balancing pricing LCU and NLCU dimensions.
- Amazon EC2 on-demand pricing Instance rates and data transfer.
- Amazon EBS pricing gp3, gp2, io2 and snapshots.
- Amazon S3 pricing Storage classes, requests and transitions.
- Amazon CloudWatch pricing Logs, vended logs, metrics and alarms.
- AWS Cost Explorer pricing API requests and granular data.
- Savings Plans pricing Compute and EC2 Instance plans.
- Amazon EKS pricing Standard and extended support.
- Amazon RDS for PostgreSQL pricing Single-AZ and Multi-AZ.