Vercel Functions: i file statici FastAPI ora passano dalla CDN

Con Vercel, i file statici idonei di FastAPI passano dalla CDN senza invocare Functions: ecco cosa cambia per costi, sicurezza e metriche reali.

Sunday, September 13, 2026Omid Saffari
Tools
Vercel Functions: i file statici FastAPI ora passano dalla CDN

Vercel ha modificato una voce di costo per le app FastAPI il 10 settembre 2026. Ora le richieste idonee per frontend e file statici passano dalla CDN di Vercel direttamente al visitatore, senza più generare invocazioni di Vercel Functions né consumo di capacità di calcolo. Le richieste CDN e il trasferimento dati restano: si riduce quindi l'uso delle Function, ma la distribuzione statica non diventa gratuita.

Ora la richiesta evita Vercel Functions

Un file statico è un contenuto che il server può inviare così com'è, per esempio un file HTML, un foglio di stile, un bundle JavaScript, un font o un'immagine. Una Vercel Function è il processo FastAPI in esecuzione che gestisce le richieste dinamiche. La CDN è il livello di distribuzione vicino al visitatore.

Prima di questa modifica, anche un file montato tramite FastAPI poteva seguire il percorso della Function. La richiesta arrivava alla rete Vercel, invocava la Function FastAPI e lasciava a Python il compito di restituire il file.

Ora, durante la build, Vercel individua i file idonei dietro app.frontend() e StaticFiles di FastAPI. Li porta sulla CDN e le richieste corrispondenti vengono servite senza invocare la Function.

Il percorso passa da questo:

visitor → CDN → FastAPI Function → file → visitor

a questo:

visitor → CDN file → visitor

L'API dinamica non diventa statica: si spostano soltanto i file corrispondenti. Quelli nella directory public/ a livello di progetto erano già serviti dalla CDN, quindi le app che vi collocano tutte le risorse pubbliche non ottengono un nuovo risparmio da questa release.

Per impostazione predefinita, le directory portate sulla CDN restano anche nel bundle della Function. L'impostazione tool.vercel.fastapi.static.exclude = true elimina questa copia duplicata, ma riguarda il bundle ed è una decisione separata. Non serve per attivare il percorso della richiesta via CDN.

Sezione architettonica in cui le risorse FastAPI pubbliche seguono un percorso breve dal visitatore alla CDN, mentre quelle protette attraversano la Function e il relativo controllo
Le risorse pubbliche possono fermarsi alla CDN. Quelle protette richiedono ancora la Function quando FastAPI deve controllare la richiesta.

La fattura perde il compute, non la distribuzione

Vercel misura una richiesta su più livelli. Function Invocations conteggia le richieste che raggiungono il codice. Active CPU e Provisioned Memory misurano il lavoro e le risorse di runtime associati a tali invocazioni. Fast Origin Transfer misura il traffico tra la CDN e la Function.

Le metriche della distribuzione esterna sono distinte. La voce CDN Requests, visualizzata come Edge Requests nella dashboard, si applica sia alle risorse statiche sia al traffico delle Function. Fast Data Transfer misura i byte inviati tra la CDN e il visitatore.

Ecco il prospetto per un milione di richieste a risorse altrimenti identiche, che prima del deployment raggiungevano la Function e dopo il deployment risultano idonee alla promozione:

MetricaPrima della promozioneDopo la promozione
Function Invocations1 milione0
Active CPU per queste richiesteMisurata0
Provisioned Memory per queste richiesteMisurata0
Fast Origin Transfer per queste risposteMisurato0
CDN Requests o Edge Requests1 milione1 milione
Fast Data Transfer verso i visitatoriByte misuratiByte misurati

La tariffa Pro pubblicata è di $0.60 per un milione di invocazioni della Function. Un milione di richieste a file che prima raggiungevano la Function elimina quindi $0.60 di utilizzo lordo per le invocazioni prima del credito mensile, oltre al consumo effettivo di Active CPU, Provisioned Memory e Fast Origin Transfer prodotto da quelle richieste.

Quest'ultima parte va ricavata dai dati di Usage. Se la risposta di un file impegnava appena Python, la CPU eliminata sarà poca. Una risposta di grandi dimensioni può invece ridurre maggiormente il trasferimento dall'origine. La release offre un nuovo percorso, non una percentuale di risparmio universale.

L'utilizzo della CDN rimane dall'altra parte del prospetto. L'attuale pagina dei prezzi CDN di Vercel include nel piano Pro con fatturazione on demand i primi 10 milioni di Edge Requests e 1 TB iniziale di Fast Data Transfer; oltre queste soglie si applicano tariffe basate sulla regione. I team che usano Flat Rate CDN consumano invece la capacità di richieste e trasferimento prevista da quel piano. L'approfondimento su Flat Rate CDN tratta separatamente questa scelta di budget.

Per il piano Hobby, il vantaggio può tradursi in più margine operativo anziché in una fattura più bassa. Hobby include un milione di invocazioni della Function, quattro ore di Active CPU e 360 GB-hours di Provisioned Memory. Il traffico dei file pubblici che non raggiunge più la Function smette di consumare queste quote, mentre la distribuzione tramite CDN continua a essere conteggiata dove previsto.

L'idoneità dipende dalle route e dalle regole di sicurezza

Per StaticFiles, Vercel rispetta l'ordine di dichiarazione di FastAPI. Una route dichiarata prima di un mount statico prevale sullo stesso percorso e raggiunge la Function. Se è dichiarata dopo il mount, prevale il file sulla CDN.

app.frontend() si comporta in modo leggermente diverso. Le route API hanno sempre la precedenza sui file del frontend, indipendentemente dall'ordine di dichiarazione. In questo modo, un frontend montato su / non intercetta un vero endpoint API.

Anche la sicurezza cambia il comportamento predefinito. Un file sulla CDN non entra mai in Python, quindi il middleware FastAPI e i controlli Depends() non possono essere eseguiti. Per questo Vercel mantiene sulla Function, per impostazione predefinita, i percorsi seguenti:

  • Tutti i mount statici e i frontend quando l'app ha middleware di primo livello.
  • I mount statici di una sotto-app quando quella sotto-app ha un middleware.
  • Un frontend protetto da dipendenze FastAPI.

L'impostazione cdn = false fa la scelta opposta: disattiva la promozione e mantiene sulla Function tutte le richieste corrispondenti. È la soluzione corretta quando il codice dell'applicazione deve esaminare ogni richiesta.

Resta un caso limite più piccolo: il percorso radice senza slash di un mount StaticFiles raggiunge comunque la Function, così FastAPI può reindirizzarlo alla forma con slash finale. Non bisogna quindi aspettarsi uno zero assoluto nell'utilizzo della Function se i client continuano a richiedere quel percorso senza slash.

Dove cambia il lavoro quotidiano

Un founder SaaS con un solo repository FastAPI

Chi serve una web app in bundle tramite app.frontend() può lasciare dinamica l'API e togliere dal percorso della Function il traffico pubblico di HTML, CSS e JavaScript. Il risultato è una baseline di compute più pulita: il traffico del prodotto può crescere senza far sembrare backend ogni richiesta di risorse del browser.

Un engineer di agenzia con file pubblici e riservati ai clienti

Un engineer di agenzia può mettere la shell pubblica sulla CDN e dichiarare una route sensibile prima del mount statico. Il vantaggio non è soltanto un minore utilizzo della Function: la mappa delle route rende esplicito quali file dei clienti richiedono una decisione di accesso in Python e quali no.

Un responsabile backend al lavoro con il team finance

Il responsabile backend può fornire al team finance due previsioni separate: il traffico dinamico FastAPI per la voce Function e tutto il traffico dei visitatori per la voce CDN. Così, una diminuzione di Function Invocations non viene scambiata per un calo equivalente di Edge Requests o del trasferimento.

Un team con middleware globale

Un team che usa middleware di primo livello per logging, risoluzione del tenant o autenticazione deve aspettarsi che i mount statici restino sulla Function per impostazione predefinita. La scelta utile consiste nel capire se un'area di risorse chiaramente pubblica può bypassare quel middleware. Se la risposta è no, questa modifica non offre alcun risparmio sicuro da mettere a budget.

Verificare un deployment

Si parte dall'inventario reale delle route, non dall'ipotesi che ogni file con un'estensione sia pubblico.

  1. Distinguere i percorsi pubblici da quelli protetti

    Elencare ogni directory di app.frontend() e ogni mount StaticFiles. Contrassegnare i file che possono essere restituiti a qualunque visitatore. Separatamente, identificare tutto ciò la cui risposta dipende da utente, tenant, ruolo, cookie o esito del middleware al momento della richiesta.

  2. Controllare l'ordine di dichiarazione

    Mantenere una route della Function prima di un mount StaticFiles quando deve avere la precedenza. Questo è il pattern documentato da 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. Lasciare i percorsi protetti sulla Function

    Controllare middleware di primo livello, middleware delle sotto-app e dipendenze del frontend prima di modificare la configurazione. Non impostare cdn = true soltanto per far scendere un grafico, a meno che ogni file interessato sia davvero pubblico. Usare cdn = false quando tutto il traffico corrispondente deve passare da FastAPI.

  4. Decidere se alleggerire il bundle

    Se l'app in esecuzione non legge mai i file promossi, le directory di origine possono essere escluse dal bundle della Function con l'impostazione documentata:

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

    Mantenere il valore predefinito se il codice a runtime ha ancora bisogno di quei file.

  5. Eseguire il deployment e verificare la separazione

    Eseguire vc deploy. Provare un file pubblico, un file protetto e una route API. Verificare che la risposta protetta continui a comportarsi correttamente, quindi confrontare in Usage le metriche Function Invocations, Active CPU, Provisioned Memory, Fast Origin Transfer, Edge Requests e Fast Data Transfer del progetto. Il campione pubblico deve uscire dal percorso della Function senza scomparire dai totali CDN.

Il limite reale del risparmio

Il prezzo diretto delle invocazioni è di appena $0.60 per milione nel piano Pro. Per un'app piccola, il risparmio può essere di pochi centesimi o venire assorbito dal credito mensile. Il vantaggio maggiore può essere eliminare il rumore delle risorse dall'utilizzo della Function e conservare margine di compute per il vero lavoro dell'API.

Il risparmio aumenta quando il traffico delle risorse pubbliche è elevato, il vecchio percorso della Function manteneva occupata la memoria abbastanza a lungo da incidere o le risposte generavano un Fast Origin Transfer rilevante. Rimane contenuto se i file erano già in public/, il traffico è basso o le regole di sicurezza mantengono correttamente i percorsi sulla Function.

La modifica non sostituisce neppure l'ottimizzazione delle risorse. Lo stesso bundle JavaScript, la stessa immagine o lo stesso font di grandi dimensioni devono comunque attraversare la CDN per raggiungere il visitatore. Ridurre quei file resta l'intervento che abbassa il Fast Data Transfer.

Cosa fare lunedì

Conviene intervenire questa settimana se app.frontend() o StaticFiles serve file pubblici e tali richieste compaiono nell'utilizzo della Function. Meglio aspettare se i file sono protetti e le relative regole di accesso non sono ancora state separate. La modifica non ha effetti se i file interessati provengono già da public/ o da un altro percorso supportato da CDN.

Lunedì, inventariare i percorsi delle risorse pubbliche e protette, preservare tutte le route e i controlli che devono essere eseguiti, quindi verificare un deployment con una richiesta per ciascuna classe. Inserire a budget la riduzione misurata nell'utilizzo della Function, mantenendo nel prospetto le richieste CDN e il trasferimento.

Per altre analisi in linguaggio chiaro sui cambiamenti delle piattaforme che incidono sui costi operativi, iscriviti alla newsletter.

Ultimo aggiornamento
13 set 2026
Categoria
Explained

Preferisca questo sito su Google

Aggiungi omidsaffari.com come fonte preferita nella Ricerca Google

Segni omidsaffari.com come fonte preferita e Google lo mette in evidenza per lei in Top Stories, AI Overviews e AI Mode.

Rotazione chiavi API OpenAI: il piano operativo contro gli stop

Rotazione chiavi API OpenAI: il piano operativo contro gli stop

Le chiavi API di progetto OpenAI ora possono scadere. Un piano operativo per sostituirle, verificarle e revocarle senza fermare agenti e servizi.13 set 2026Explained
Gestione credenziali in Vercel Connect: chi può intervenire

Gestione credenziali in Vercel Connect: chi può intervenire

Vercel Connect introduce Connector Permissions: scopri come affidare la gestione credenziali condivise a un responsabile senza concedergli il ruolo Owner.13 set 2026Explained
Cloudflare R2: come indicizzare file senza estensione

Cloudflare R2: come indicizzare file senza estensione

Cloudflare R2 ora permette ad AI Search di indicizzare file senza estensione tramite Content-Type. Ecco cosa cambia, quali limiti restano e come procedere.12 set 2026Explained
Vercel Sandbox raddoppia il disco per i job più pesanti

Vercel Sandbox raddoppia il disco per i job più pesanti

Vercel Sandbox passa da 32 GB a 64 GB: cosa cambia per agenti AI, monorepo e build, come misurare il picco e valutare costi reali e persistenza.12 set 2026Explained
Cloudflare Workflows: la nuova retention richiede una scelta esplicita

Cloudflare Workflows: la nuova retention richiede una scelta esplicita

I nuovi Workflow su Workers Paid conservano gli stati completati e in errore per 7 giorni. Ecco come impostare la retention senza perdere prove utili.11 set 2026Explained
Reportistica aziendale: meno passaggi con ChatGPT Data

Reportistica aziendale: meno passaggi con ChatGPT Data

ChatGPT Data trasforma dati aziendali connessi in report ricorrenti. Valuta l'uso di Work, le query al warehouse, la revisione umana e la condivisione dei Site.11 set 2026Explained
Cursor AI Projects: più agenti, più lavoro da revisionare

Cursor AI Projects: più agenti, più lavoro da revisionare

Cursor AI Projects coordina agenti, contesto condiviso e automazioni. Ecco come testarlo, stimare costi e tempo di revisione senza perdere il controllo.11 set 2026Explained
Codex ChatGPT e Deep Research: il nuovo budget condiviso

Codex ChatGPT e Deep Research: il nuovo budget condiviso

Deep Research arriva in ChatGPT Work e Codex: ecco come usa crediti e limiti condivisi, quanto può costare e quale modalità conviene al team.10 set 2026Explained
Newsletter

Una lettera, ogni domenica.Sistemi che funzionano, non hot take.

Settimanale. Niente spam. Si cancella quando vuole.