Skip to main content
orphan · azure

Standard public IPs billing idle with nothing attached

resource types
1
rule IDs covered
1
severity
low

What does ZopNight detect here?

Detached Standard-SKU public IPs bill an idle hourly charge of roughly $34 per month, forever. ZopNight fires only when the discoverer's ipConfiguration check shows no attachment and the SKU metadata reads Standard, because a Basic IP is free when idle and flagging one would fabricate a saving.

Signal and threshold

How ZopNight evaluates Standard public IPs billing idle with nothing attached.
Field Value
Rule IDsRC-1363
Categoryorphan
Severitylow
Metricnone — pure configuration read
Sourcepublic_ip_idle.go

The address that outlives its VM

Deleting a VM, load balancer, or gateway in Azure leaves its public IP behind as an independent resource. A Standard-SKU address then bills its idle hourly rate indefinitely. The amount is small per address, but detached IPs accumulate in fleets, and each one also represents a reserved piece of your network identity that nobody is watching.

Attachment read from the API, not from tags

The signal is the discoverer’s reading of the address’s ipConfiguration property: an unassociated IP has no attachment to any NIC, load balancer frontend, or gateway. The rule is metadata-only on purpose: the prior tag-based fallback was removed because a customer-controlled tag must never drive an irreversible delete. Absent or ambiguous association state fails closed.

The Basic-SKU trap in the pricing data

Azure’s retail meter for idle public IPs is keyed to the Standard SKU; Basic addresses are free while idle. Pricing a Basic IP with the Standard rate would invent a charge that does not exist, so the rule fires only when the discoverer captured the SKU as Standard. Anything else, including a missing SKU, abstains. With Basic public IPs retired from sale, the Standard-only gate covers the fleet that actually bills.

Sweep a subscription for detached addresses

Terminal window
az network public-ip list --query \
"[?ipConfiguration==null && sku.name=='Standard'].{name:name, rg:resourceGroup, ip:ipAddress}" \
-o table

Before releasing an address

Write the literal IP down first. DNS records, firewall allowlists at partner companies, and mobile-app configurations sometimes pin that exact address, and a release hands it back to the Azure pool. If the address must survive, attach it to the replacement resource instead of deleting it. Otherwise delete; the charge stops immediately.

Quiet paths

Associated addresses, Basic or unknown SKUs, and addresses without a priced cost all pass without a finding. Reader alone is enough to reproduce the check. No metrics are involved, so Monitoring Reader is not needed for this one.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·