Una IP pública parece gratis porque no tiene CPU ni disco. No lo es. Desde el 1 de febrero de 2024, AWS cobra USD 0,005 por hora por cada dirección IPv4 pública, esté asociada a un recurso o no. Son USD 3,65 por mes por dirección (0,005 × 730 horas). Una sola no mueve la factura; cuarenta olvidadas a lo largo de tres años y varias cuentas, sí: USD 146 por mes que no compran nada.

Qué cobra cada nube por una IP pública

  • AWS: USD 0,005 por hora por cada IPv4 pública, incluidas las Elastic IP sin asociar y las IPs públicas que AWS asigna a instancias, balanceadores y NAT gateways. La regla rige desde el 1 de febrero de 2024 y figura en el anuncio oficial de AWS sobre el cargo por IPv4 pública.
  • GCP: una IP externa estática reservada que no está asignada a nada cuesta USD 0,01 por hora; la misma dirección en uso por una VM estándar cuesta USD 0,005 por hora, en regiones de Estados Unidos según la página de precios de red de Google Cloud. Sin usar cuesta el doble: USD 7,30 por mes contra USD 3,65.
  • Azure: la IP pública Standard factura por hora mientras exista, asociada o no. Una IP que quedó colgada de una NIC sin VM factura igual que una en uso.

La diferencia con el resto de los recursos olvidados es que una IP no aparece en ningún panel de rendimiento: no tiene métricas, no dispara alertas y no ocupa espacio. Solo aparece en la factura, como una línea chica que se repite todos los meses.

Por qué quedan IPs huérfanas

Casi siempre por un borrado incompleto. Borrar una VM a mano desde la consola elimina la VM, pero no necesariamente lo que estaba alrededor:

  • En AWS, una Elastic IP sobrevive a la instancia: al terminarla, la dirección sigue asignada a tu cuenta, sin asociar, facturando.
  • En Azure, borrar la VM puede dejar la NIC y la IP pública, salvo que se haya marcado borrarlas junto con la VM. La IP queda asociada a una NIC que no le sirve a nadie, y no se puede liberar hasta desasociarla.
  • En GCP, una dirección reservada como estática queda en estado RESERVED cuando se borra la VM que la usaba.

El otro origen frecuente son las pruebas: alguien reserva una IP para un ambiente temporal, el ambiente se borra y la IP no. La IP es sólo uno de los recursos que nacen con la VM y no mueren con ella; en qué sobrevive cuando borrás una VM está la lista completa, con discos y snapshots, nube por nube.

Cómo encontrarlas, nube por nube

Con permisos de solo lectura alcanza: es mínimo privilegio aplicado, porque buscar no requiere poder borrar. En AWS, las Elastic IP sin asociación (el comando es por región):

aws ec2 describe-addresses \ --query "Addresses[?AssociationId==null].[PublicIp,AllocationId]" \ --output table 

Hay un caso que este filtro no muestra: una Elastic IP asociada a una interfaz de red (ENI) que quedó suelta, sin instancia. Figura como asociada y no le sirve a nadie. Para verlo, listá las ENI en estado available con aws ec2 describe-network-interfaces --filters Name=status,Values=available.

En GCP, las direcciones externas reservadas que no usa nadie:

gcloud compute addresses list \ --filter="status=RESERVED AND addressType=EXTERNAL" \ --format="table(name,address,region,status)" 

En Azure, las IPs públicas sin configuración IP asociada, y las NIC que no tienen VM:

az network public-ip list \ --query "[?ipConfiguration==null].{name:name, rg:resourceGroup, ip:ipAddress}" -o table az network nic list \ --query "[?virtualMachine==null && privateEndpoint==null].{name:name, rg:resourceGroup}" -o table 

El filtro privateEndpoint==null no es decorativo: la NIC de un Private Endpoint tampoco tiene VM, y sin ese filtro aparece como huérfana una interfaz que está en uso. Borrarla corta el acceso privado a un servicio.

Antes de borrar: huérfana comprobada o desconocida

Una lista de candidatas no es una lista de borrado. Si un comando no pudo leer un campo, por permisos o por una región que no respondió, la respuesta honesta es "no sé", no "está libre". Liberar una IP en uso es peor que pagarla un mes más: la dirección no vuelve, y si estaba en un registro DNS o en la allowlist de un cliente, el corte es inmediato.

Una IP sin usar cuesta USD 3,65 por mes en AWS. Una IP liberada por error puede costar un incidente.

Cómo lo resuelve Control Cloud

Control Cloud lee el inventario de tus nubes con credenciales de solo lectura y marca las IPs huérfanas comprobadas en la página de cada proveedor y en el mapa, con un filtro que deja solo esas: una Elastic IP sin asociar o asociada a una interfaz de red (ENI) sin instancia, una IP estática de GCP que nadie usa, una IP pública de Azure retenida por una NIC sin VM. En GCP, si la lista de usuarios de la dirección no llegó, la IP queda como desconocida: sin marca y fuera del conteo.

No les pone precio: la página de costos muestra solo el gasto que devuelve la API de facturación del proveedor (hoy AWS, Azure y OCI), por servicio, sin estimaciones a partir del inventario. El importe de cada IP sale de las tarifas de arriba y de tu factura. Para estimar lo que se puede recortar en non-prod apagando VMs, la calculadora de ahorro hace la cuenta, y en apagar dev fuera de horario está el detalle de qué baja y qué no.