Deleting unused load balancers and IP addresses: a small line that adds up
A load balancer with no targets and a public IP with no association each cost a few dollars to tens of dollars a month. Individually trivial, collectively thousands. Here is how to find them, verify they are dead, and remove them safely.
Quick answer
Find them with two signals. Load balancers: HealthyHostCount of zero or request count of zero for 14 consecutive days. An ALB base charge is about $16.43 a month, an NLB similar, and an Azure or GCP load balancer runs $18 to $25 plus rules. IP addresses: no association. Every public IPv4 on AWS bills $0.005 per hour (about $3.60 a month) whether attached or not, Azure standard static public IPs are about $3.65, and a GCP reserved unattached static IP is about $7.30. On a large estate this sweep commonly recovers $2,000 to $10,000 a month with essentially no risk, provided DNS records are checked first.
These are the smallest items on a cost hit list and often the highest count. Nobody deletes a load balancer when they decommission a service, because the load balancer is not what they were thinking about. Nobody releases an IP address, because it costs three dollars and releasing it feels risky. Multiply by a few hundred and it is a real line.
What each one costs
| Resource | Monthly base cost |
|---|---|
| AWS Application Load Balancer | ~$16.43 plus LCU charges |
| AWS Network Load Balancer | ~$16.43 plus NLCU charges |
| AWS Classic Load Balancer | ~$18.25 plus per GB |
| AWS public IPv4 (any) | ~$3.60 |
| Azure Standard Load Balancer | ~$18.25 plus rules and data |
| Azure standard static public IP | ~$3.65 |
| GCP forwarding rule | ~$18 plus per rule and per GB |
| GCP reserved unattached static IP | ~$7.30 |
Note the GCP detail: an unattached reserved static IP costs roughly double the attached rate, deliberately, to discourage hoarding. And since the 2024 AWS pricing change, every public IPv4 address bills whether it is attached to a running instance or not, which turned a previously free resource into a per address charge across entire estates. Background in AWS Elastic IP cost.
Step 1: find load balancers with nothing behind them
Two metrics decide it. HealthyHostCount of zero for 14 consecutive days means no target is registered and passing checks. Request count of zero over the same window means nothing is calling it even if targets exist. Either alone is suggestive; both together is conclusive.
A third check catches the case the metrics miss: a load balancer with healthy targets and real traffic that is nonetheless redundant, because the traffic is all from health checkers or an old monitoring probe. Look at the source of the requests before assuming traffic means value.
Cross reference against DNS before deleting anything. A load balancer with no traffic but an active DNS record pointing at it is a deletion that breaks something the moment traffic returns, and alias records pointing at load balancer hostnames are the most common trap. Check the load balancer comparison in load balancer cost comparison if you are also evaluating whether a cheaper type would serve.
Step 2: find IP addresses with no association
Unassociated public IPs are the easiest finding in cloud cost work because the state is explicit. On AWS, list Elastic IPs with no AssociationId. On Azure, list public IP addresses where ipConfiguration is null. On GCP, list addresses with status RESERVED rather than IN_USE.
Before releasing, ask one question: is this IP allowlisted somewhere you do not control? Static IPs are frequently reserved precisely because a partner, a payment processor, or a customer firewall has the address on an allowlist, and releasing it means you cannot get it back. That is the single real risk in this whole exercise, and it is why an owner tag on reserved addresses is worth enforcing. If the address is documented as allowlisted, keep it and accept the charge, which is cheap insurance compared to a re-allowlisting process that takes weeks.
Step 3: the associated but pointless ones
A subtler category: IPs attached to instances that do not need public addressing at all. An instance in a private subnet that reaches the internet through a NAT gateway does not need a public IP, and an instance that only serves traffic through a load balancer does not either. Auditing for public IPs on instances that should be private both saves the per address charge and reduces attack surface, which makes it an easy case to argue with a security team's support.
Step 4: delete safely
The protocol is the same as for any cleanup, and for these resources it can be faster because the risk is lower. Tag candidates, check DNS and allowlist documentation, notify owners, wait 7 days rather than 14 given the low risk, then delete. For load balancers, capture the configuration first, listeners, target groups, certificates, and rules, so recreation is a script rather than an archaeology exercise. Export it as Terraform if you can, which is useful documentation regardless.
What the sweep returns
A mid sized estate with 40 stale load balancers and 300 unused IPs recovers roughly $660 a month from the balancers and $1,080 from the addresses, about $1,740. A large estate with several hundred of each reaches $5,000 to $10,000 a month. It is not the biggest lever in a cost program, but it is among the fastest, and it carries almost no performance risk, which makes it an excellent first week deliverable when a program needs a visible win.
Stopping the regrowth
These accumulate because decommissioning is manual. Two structural fixes: manage load balancers and IPs in the same Terraform stack as the service they serve, so destroying the service destroys them too, and require an owner tag so an unattached address always has someone to ask. Then price the networking a change adds against the resource catalog before merge, so a new load balancer shows its $16 a month before it exists rather than after. Pair with the orphaned resource cleanup guide.
FAQ
How much does an unused load balancer cost?
An AWS Application or Network Load Balancer base charge is about $16.43 a month before capacity unit charges, a Classic Load Balancer about $18.25, an Azure Standard Load Balancer about $18.25 plus rules, and a GCP forwarding rule about $18. Individually small, but 40 stale load balancers is roughly $660 a month and a large estate with several hundred reaches thousands.
Do unattached IP addresses still cost money?
Yes, on every major cloud. Since the 2024 AWS pricing change every public IPv4 address bills $0.005 per hour, about $3.60 a month, whether attached or not. Azure standard static public IPs are about $3.65. GCP charges roughly $7.30 a month for a reserved but unattached static IP, deliberately about double the attached rate to discourage hoarding.
How do I confirm a load balancer is unused?
Two metrics together: HealthyHostCount of zero for 14 consecutive days means no target is registered and passing checks, and request count of zero over the same window means nothing is calling it. Also check the source of any traffic, because a load balancer whose only requests come from health checkers or an old monitoring probe is still effectively dead.
What is the risk of releasing a static IP?
That it is allowlisted somewhere you do not control. Static IPs are frequently reserved precisely because a partner, payment processor, or customer firewall has the address on an allowlist, and once released you cannot get it back. If the address is documented as allowlisted, keep it and pay the few dollars, which is cheap against a re-allowlisting process that takes weeks.
Should instances have public IP addresses at all?
Often not. An instance in a private subnet reaching the internet through a NAT gateway does not need one, and neither does an instance that only serves traffic through a load balancer. Auditing for public IPs on instances that should be private saves the per address charge and reduces attack surface, which makes it easy to argue with security team support behind it.
How do I stop load balancers and IPs accumulating?
Manage them in the same Terraform stack as the service they serve, so destroying the service destroys them too rather than leaving orphans behind, and require an owner tag so an unattached address always has someone to ask. Then price the networking a change adds before merge, so a new load balancer shows its roughly $16 a month cost at review time.
What to do next
Show the $16 a month before the load balancer exists. C3X prices Terraform against a live resource catalog. Start with the quickstart.
Share this post
Try C3X on your own Terraform
Free and open source. No API key required. One command to install, one command to estimate.