Cómo la CDN de Vercel reduce el uso de Functions en FastAPI

Vercel ahora sirve archivos estáticos elegibles de FastAPI desde su CDN. Descubre qué solicitudes dejan de usar Functions y cuáles aún las necesitan.

Sunday, September 13, 2026Omid Saffari
Tools
Cómo la CDN de Vercel reduce el uso de Functions en FastAPI

Vercel cambió una partida de costos para las aplicaciones FastAPI el 10 de septiembre de 2026. Ahora, las solicitudes elegibles del frontend y de archivos estáticos viajan desde la CDN de Vercel directamente hasta el visitante, por lo que dejan de generar invocaciones de Functions y consumo de cómputo. Las solicitudes a la CDN y la transferencia siguen existiendo: el cambio reduce el uso de Functions, pero no vuelve gratuita la entrega de contenido estático.

La solicitud pasa por la CDN de Vercel y evita la Function

Un archivo estático es aquel que el servidor puede enviar tal como está: un archivo HTML, una hoja de estilos, un paquete de JavaScript, una fuente o una imagen. Una Vercel Function es el proceso de FastAPI en ejecución que atiende las solicitudes dinámicas. La CDN es la capa de distribución situada cerca del visitante.

Antes de este cambio, incluso un archivo montado mediante FastAPI podía recorrer la ruta de la Function. La solicitud llegaba a la red de Vercel, invocaba la Function de FastAPI y Python devolvía el archivo.

Ahora Vercel detecta durante la compilación los archivos elegibles que están detrás de app.frontend() y de StaticFiles de FastAPI. Los mueve a la CDN y las solicitudes coincidentes se sirven sin invocar la Function.

La ruta pasa de ser esta:

visitor → CDN → FastAPI Function → file → visitor

a esta:

visitor → CDN file → visitor

La API dinámica no se vuelve estática: solo se trasladan los archivos coincidentes. Los archivos del directorio public/ situado en el nivel del proyecto ya se servían desde la CDN, así que esta actualización no aporta un ahorro nuevo a las aplicaciones que guardan allí todos sus recursos públicos.

De forma predeterminada, los directorios trasladados también permanecen dentro del paquete de la Function. La opción tool.vercel.fastapi.static.exclude = true elimina esa copia duplicada, pero es una decisión independiente sobre el paquete. No hace falta activarla para que funcione la ruta de solicitudes a través de la CDN.

Sección arquitectónica donde los recursos públicos de FastAPI recorren una ruta corta desde un visitante, a través de la CDN, mientras los recursos protegidos pasan por la Function y su control de acceso
Los recursos públicos pueden terminar su recorrido en la CDN. Los recursos protegidos siguen necesitando la Function cuando FastAPI debe comprobar la solicitud.

La factura pierde cómputo, no distribución

Vercel desglosa la medición de cada solicitud en varias capas. La métrica Function Invocations contabiliza las solicitudes que llegan al código. Active CPU y Provisioned Memory miden el trabajo y los recursos de ejecución asociados a esas invocaciones. Fast Origin Transfer mide el tráfico entre la CDN y la Function.

Las métricas de entrega al visitante son distintas. La métrica CDN Requests, que se muestra como Edge Requests en el panel, se aplica tanto a los recursos estáticos como al tráfico de Functions. Fast Data Transfer mide los bytes enviados entre la CDN y el visitante.

Este es el desglose claro para un millón de solicitudes de recursos idénticas que antes del despliegue llegaban a la Function y, después, cumplen los requisitos para trasladarse a la CDN:

MétricaAntes del trasladoDespués del traslado
Function Invocations1 millón0
Active CPU de esas solicitudesMedido0
Provisioned Memory de esas solicitudesMedido0
Fast Origin Transfer de esas respuestasMedido0
CDN Requests o Edge Requests1 millón1 millón
Fast Data Transfer a los visitantesBytes medidosBytes medidos

La tarifa publicada para Pro es de $0.60 por cada millón de invocaciones de Functions. Por tanto, un millón de solicitudes de archivos que antes llegaban a la Function eliminan $0.60 de consumo bruto por invocaciones antes del crédito mensual, además del Active CPU, la Provisioned Memory y el Fast Origin Transfer que esas solicitudes consumieran en la práctica.

Esa última parte debe salir de los datos de Usage. Si una respuesta de archivo apenas pasaba por Python, habrá poco uso de CPU que eliminar. Una respuesta grande puede recortar más transferencia desde el origen. La actualización abre una ruta nueva; no promete un porcentaje de ahorro universal.

El uso de la CDN sigue en el otro lado del balance. La página actual de precios de la CDN de Vercel indica que, en Pro con facturación bajo demanda, están incluidos los primeros 10 millones de Edge Requests y hasta 1 TB de Fast Data Transfer; después se aplican tarifas de uso según la región. Los equipos con Flat Rate CDN consumen la capacidad de solicitudes y transferencia incluida en ese plan. El análisis de Flat Rate CDN aborda esa decisión presupuestaria por separado.

En Hobby, el beneficio puede ser más margen disponible en lugar de una factura menor. Hobby incluye un millón de invocaciones de Functions, cuatro horas de Active CPU y 360 GB-horas de Provisioned Memory. El tráfico de archivos públicos que ya no llega a la Function deja de consumir esas cuotas, mientras que su distribución por la CDN sigue contabilizándose cuando corresponda.

La elegibilidad depende de las rutas y la seguridad

Vercel respeta el orden de declaración de FastAPI para StaticFiles. Si una ruta se declara antes que un montaje estático en la misma ruta, la primera tiene prioridad y llega a la Function. Si se declara después del montaje, pierde frente al archivo de la CDN.

app.frontend() funciona de forma algo distinta. Las rutas de la API siempre tienen prioridad sobre los archivos del frontend, sin importar el orden de declaración. Así, un frontend montado en / no absorbe un endpoint real de la API.

La seguridad también modifica el comportamiento predeterminado. Un archivo alojado en la CDN nunca entra en Python, de modo que no pueden ejecutarse ni el middleware de FastAPI ni las comprobaciones de Depends(). Por eso, Vercel mantiene estas rutas en la Function de forma predeterminada:

  • Todos los montajes estáticos y frontends cuando la aplicación tiene middleware de nivel superior.
  • Los montajes estáticos de una subaplicación cuando esa subaplicación tiene middleware.
  • Un frontend protegido por dependencias de FastAPI.

La opción cdn = false elige el compromiso contrario: desactiva el traslado y mantiene todas las solicitudes coincidentes en la Function. Es una decisión válida cuando el código de la aplicación debe examinar cada solicitud.

Hay un caso límite menor: la raíz sin barra final de un montaje de StaticFiles sigue llegando a la Function para que FastAPI pueda redirigirla a la variante con barra final. No esperes ver un cero absoluto en el uso de Functions si los clientes siguen solicitando esa ruta sin barra.

Cómo cambia el trabajo en cada equipo

Una persona que gestiona su SaaS con un único repositorio FastAPI

Quien sirve una aplicación web empaquetada mediante app.frontend() puede mantener dinámica la API y sacar de la ruta de la Function el tráfico público de HTML, CSS y JavaScript. El resultado es una base de consumo de cómputo más limpia: el tráfico del producto puede crecer sin que cada descarga de recursos del navegador parezca trabajo del backend.

Una agencia con archivos públicos y exclusivos para clientes

Un ingeniero de agencia puede colocar la interfaz pública en la CDN y, al mismo tiempo, declarar una ruta sensible antes del montaje estático. El beneficio no se limita a reducir el uso de Functions. También queda un mapa de rutas que distingue qué archivos de clientes necesitan que Python tome una decisión de acceso y cuáles no.

Un responsable de backend que trabaja con finanzas

El responsable de backend puede entregar a finanzas dos previsiones separadas: una para el tráfico dinámico de FastAPI en la partida de Functions y otra para todo el tráfico de visitantes en la partida de la CDN. Así se evita confundir una caída de Function Invocations con una reducción equivalente de Edge Requests o de transferencia.

Un equipo con middleware global

Un equipo que utiliza middleware de nivel superior para registro de eventos, resolución de tenants o autenticación debe esperar que, de forma predeterminada, los montajes estáticos permanezcan en la Function. La decisión útil es determinar si una zona de recursos inequívocamente públicos puede omitir ese middleware. Si la respuesta es no, este cambio no ofrece un ahorro seguro que pueda incluirse en el presupuesto.

Audita un despliegue

Empieza con un inventario real de rutas, no con la suposición de que todo archivo con extensión es público.

  1. Separa las rutas públicas de las protegidas

    Enumera todos los directorios de app.frontend() y todos los montajes de StaticFiles. Marca los archivos que pueden devolverse a cualquier visitante. Por separado, identifica aquellos cuya respuesta depende de un usuario, tenant, rol, cookie o resultado del middleware en el momento de la solicitud.

  2. Comprueba el orden de declaración

    Conserva una ruta de Function antes de un montaje de StaticFiles cuando esa ruta deba tener prioridad. Este es el patrón documentado por Vercel:

    Python
    from fastapi import FastAPI
    from fastapi.staticfiles import StaticFiles
    
    app = FastAPI()
    
    # Declared before the mount, so this route wins over any CDN file at this path.
    @app.get("/static/protected.json")
    def protected():
        return {"access": "denied"}
    
    app.mount("/static", StaticFiles(directory="static"))
  3. Mantén las rutas protegidas en la Function

    Revisa el middleware de nivel superior, el middleware de las subaplicaciones y las dependencias del frontend antes de modificar la configuración. No actives cdn = true solo para que baje una gráfica: antes, confirma que todos los archivos afectados son realmente públicos. Utiliza cdn = false cuando todo el tráfico coincidente deba pasar por FastAPI.

  4. Decide si conviene reducir el paquete

    Si la aplicación en ejecución nunca lee los archivos trasladados, puedes excluir sus directorios de origen del paquete de la Function con la opción documentada:

    TOML
    [tool.vercel.fastapi.static]
    exclude = true

    Mantén el valor predeterminado si el código en ejecución todavía necesita esos archivos.

  5. Despliega y verifica la separación

    Ejecuta vc deploy. Prueba un archivo público, uno protegido y una ruta de la API. Confirma que la respuesta protegida sigue comportándose correctamente y después compara Function Invocations, Active CPU, Provisioned Memory, Fast Origin Transfer, Edge Requests y Fast Data Transfer del proyecto en Usage. La muestra pública debería abandonar la ruta de la Function sin desaparecer de los totales de la CDN.

El límite real del ahorro

El precio directo por invocación es de apenas $0.60 por millón en Pro. Para una aplicación pequeña, el ahorro en efectivo puede reducirse a unos centavos o quedar absorbido por el crédito mensual. El beneficio más importante puede ser eliminar el ruido de los recursos en el uso de Functions y reservar margen de cómputo para el trabajo real de la API.

El ahorro aumenta cuando el tráfico de recursos públicos es elevado, la antigua ruta por la Function mantenía memoria asignada el tiempo suficiente para que su consumo fuera relevante o las respuestas generaban un Fast Origin Transfer considerable. Se mantiene bajo si los archivos ya estaban en public/, el tráfico es reducido o las reglas de seguridad obligan correctamente a conservar las rutas en la Function.

Esto tampoco sustituye la optimización de recursos. El mismo paquete grande de JavaScript, imagen o fuente todavía debe viajar por la CDN hasta el visitante. Reducir el tamaño de esos archivos sigue siendo la medida que recorta Fast Data Transfer.

La acción para el lunes

Actúa esta semana si app.frontend() o StaticFiles sirve archivos públicos y esas solicitudes aparecen en el uso de Functions. Espera si los archivos están protegidos y aún no has separado sus reglas de acceso. El cambio no te afecta si los archivos relevantes ya se sirven desde public/ o desde otra ruta respaldada por una CDN.

El lunes, haz un inventario de las rutas de recursos públicos y protegidos, conserva cada ruta y cada control que deba ejecutarse y verifica un despliegue con una solicitud de cada clase. Presupuesta la reducción medida del uso de Functions. Mantén en la hoja de cálculo las solicitudes y la transferencia de la CDN.

Si quieres más análisis claros sobre cambios de plataforma que alteran los costos operativos, suscríbete al boletín.

Última actualización
13 sept 2026
Categoría
Explained

Prefiera este sitio en Google

Añadir omidsaffari.com como fuente preferida en la Búsqueda de Google

Marque omidsaffari.com como fuente preferida y Google lo destacará para usted en Top Stories, AI Overviews y AI Mode.

Clave API OpenAI: cómo rotarla antes de que caduque

Clave API OpenAI: cómo rotarla antes de que caduque

Planifica la rotación de una clave API OpenAI antes de su caducidad: responsable, ventana de reemplazo, presupuesto y verificación sin interrupciones.13 sept 2026Explained
Gestión de credenciales en Vercel Connect: quién debe tener el control

Gestión de credenciales en Vercel Connect: quién debe tener el control

Vercel Connect ya permite asignar un responsable a los conectores compartidos. Así funciona el permiso Connector Manager y dónde están sus límites.13 sept 2026Explained
Cloudflare R2: cómo indexar archivos sin extensión con AI Search

Cloudflare R2: cómo indexar archivos sin extensión con AI Search

Cloudflare R2 ya permite que AI Search indexe archivos sin extensión mediante un Content-Type válido. Descubre qué cambia y qué trabajo sigue pendiente.12 sept 2026Explained
Vercel Sandbox 64 GB: más espacio para tareas de agentes

Vercel Sandbox 64 GB: más espacio para tareas de agentes

Vercel Sandbox duplica el disco de trabajo de 32 GB a 64 GB. Descubre qué cambia para repositorios, compilaciones y agentes de código más grandes.12 sept 2026Explained
Cloudflare Workers acorta el historial de Workflows: cómo ajustar la retención

Cloudflare Workers acorta el historial de Workflows: cómo ajustar la retención

Cloudflare Workers reduce a 7 días la retención predeterminada de nuevos Workflows de pago. Aprende a separar historial, evidencia y costo de almacenamiento.11 sept 2026Explained
Automatización de reportes con ChatGPT Data: menos traspasos

Automatización de reportes con ChatGPT Data: menos traspasos

Descubre cómo la automatización de reportes con ChatGPT Data reduce traspasos semanales, qué costos suma y cómo probarla sin comprometer permisos.11 sept 2026Explained
Cursor AI Projects: el reto ya no es programar, sino revisar

Cursor AI Projects: el reto ya no es programar, sino revisar

Cursor AI Projects coordina agentes, comparte contexto y automatiza tareas. Claves para probarlo sin perder el control de los costos ni de la revisión.11 sept 2026Explained
Codex ChatGPT: Deep Research entra en el presupuesto común

Codex ChatGPT: Deep Research entra en el presupuesto común

Deep Research ya consume el presupuesto compartido de Work y Codex. Así funcionan los créditos, los límites y el control del gasto en ChatGPT.10 sept 2026Explained
Newsletter

Una carta, cada domingo.Sistemas que funcionan, no opiniones calientes.

Semanal. Sin spam. Cancele cuando quiera.