Retour au blog
Comparatif Technique · 8 min de lecture

Edge Functions en Rust/WASM face à Cloudflare Workers et Vercel Edge

Affane Daylami · Fondateur· 24 août 2026

Cloudflare Workers et Vercel Edge Functions exécutent votre code dans des isolates V8, un contexte JavaScript léger, pas un conteneur ni une machine virtuelle. Aurabase propose un second chemin, vérifié dans son code : un mode wasm qui exécute directement du Rust compilé en WebAssembly, nativement, dans le service aura-functions, via le runtime Wasmtime.

Le mode par défaut d’Aurabase reste toutefois Deno (V8 Isolates lui aussi), comme documenté dans le cœur Rust d’Aurabase. « Edge Functions en Rust » recouvre trois réalités différentes selon la plateforme : un SDK communautaire côté Cloudflare, aucune voie officielle côté Vercel, un mode d’exécution natif avec sa propre CLI côté Aurabase. Ce comparatif détaille les trois architectures sans mélanger ce qui est vérifié et ce qui reste un objectif de plateforme.

L'essentiel
  • Aurabase propose deux runtimes d'Edge Functions : deno (V8 Isolates, service dédié, mode par défaut) et wasm (Rust compilé, exécuté nativement via Wasmtime). Champ runtime vérifié dans services/aura-functions.
  • Cloudflare Workers tourne sur des isolates V8 et peut exécuter du WebAssembly en complément, notamment via le SDK communautaire workers-rs. Ce n'est pas un runtime Rust natif dédié comme le mode wasm d'Aurabase.
  • Vercel Edge Functions repose sur l'Edge Runtime, un sous-ensemble d'API Node.js sur isolates V8 : aucun SDK ni CLI officiels pour écrire la fonction elle-même en Rust.
  • Le mode wasm d'Aurabase isole chaque exécution avec un budget CPU en « fuel » Wasmtime, une limite mémoire dédiée et un timeout par epoch, mais n'expose aujourd'hui aucun accès réseau sortant au module invité.
  • Trois architectures différentes pour un même objectif : démarrer vite et isoler chaque exécution, sans le coût d'un conteneur complet.
#
Contexte

Isolates V8 et modules WASM : deux mécaniques de sandboxing

Un isolate V8 est un contexte d'exécution JavaScript léger à l'intérieur d'un même moteur V8 : pas de nouveau processus système, pas de nouveau noyau à démarrer. C'est le mécanisme que Cloudflare a rendu public le premier pour les Workers, et que Vercel réutilise pour son Edge Runtime. L'objectif est le même des deux côtés : éviter le coût d'un conteneur ou d'une VM à chaque requête.

Un module WebAssembly répond au même besoin par un mécanisme différent. Le bytecode WASM tourne dans une mémoire linéaire bornée, définie par la spécification elle-même. Le module invité ne peut pas adresser en dehors de cette zone, quel que soit le langage source (Rust, C, Go…) qui a produit le binaire. C'est ce modèle que Wasmtime applique dans le mode wasm d'Aurabase, détaillé plus bas. Pour les mesures de démarrage entre les deux mécaniques, voir notre dossier sur les benchmarks de cold start WebAssembly.

#
Runtime WASM

Ce que le mode wasm d’Aurabase fait réellement, vérifié dans le code

Chaque fonction Aurabase porte un champ runtime qui vaut "wasm" ou "deno". Le handler d'invocation choisit le chemin d'exécution en conséquence :

services/aura-functions/src/handlers/functions.rs (extrait)
RUST
// Dispatch selon le runtime : WASM (wasmtime) ou Deno (V8 Isolates via edge-runtime)
let resp = if func.runtime == "wasm" {
state.runtime.invoke(&wasm_bytes, &func.code_hash, req).await?
} else {
// Proxy vers aura-edge-runtime — V8 Isolates (supabase/edge-runtime, MIT)
proxy_to_edge_runtime(&state.config.edge_runtime_url, …).await?
};

Le sandbox s'appuie sur trois mécanismes Wasmtime combinés. Un budget CPU compté en « fuel » : chaque instruction WASM en consomme. Un timeout appliqué par incrément d'epoch : un thread dédié augmente l'horloge Wasmtime après le délai configuré, ce qui interrompt l'exécution en cours. Une limite mémoire posée via StoreLimits. Les trois bornes sont configurées à l'instanciation du moteur :

services/aura-functions/src/wasm/mod.rs (extrait)
RUST
let mut cfg = Config::new();
cfg.consume_fuel(true);
cfg.epoch_interruption(true);
// Mémoire bornée par StoreLimits, fuel initial = max_fuel,
// timeout = incrément d’epoch après timeout_secs (thread dédié)

Le module compilé est mis en cache par code_hash : un même binaire déployé n'est pas recompilé à chaque appel. Chaque invocation instancie malgré tout un Store et une instance neufs. Aucun état ne fuit d'un appel à l'autre. La surface exposée au module invité reste volontairement minimale, cinq fonctions hôtes au total : aura.log, aura.get_input, aura.set_output, aura.get_env et un stub env.abort pour la compatibilité AssemblyScript. Aucune fonction hôte n'expose d'appel réseau sortant à ce jour.

Vérifié vs objectif produit
Le mode wasm convient aujourd'hui à du calcul pur : validation, transformation de données, scoring, parsing. Une fonction qui doit appeler une API tierce (paiement, email, service externe) doit encore passer par le mode deno. C'est le mode par défaut d'Aurabase, et celui recommandé pour migrer du code Deno existant.

Côté déploiement, la CLI compile votre crate localement avant l'envoi : aura functions new scaffolde un crate cdylib, aura functions deploy le compile puis l'envoie.

terminal
BASH
# Scaffolding : crée aurabase/functions/<name>/ (Cargo.toml crate-type = cdylib)
aura functions new my-fn
# cargo build --target wasm32-unknown-unknown --release, puis upload
# POST /v1/functions/:project_id { runtime: "wasm", code: <wasm en base64> }
aura functions deploy my-fn
#
Cloudflare

Cloudflare Workers : isolates V8, avec WebAssembly en complément

Cloudflare Workers exécute nativement du JavaScript et du TypeScript dans des isolates V8 répartis sur le réseau mondial de Cloudflare. WebAssembly y est un citoyen de première classe depuis les débuts de la plateforme : un module .wasm peut être importé directement dans un Worker comme n'importe quel autre module.

Pour écrire un Worker entièrement en Rust, la voie la plus utilisée est le SDK communautaire workers-rs, qui compile le code vers wasm32-unknown-unknown et l'exécute dans le runtime Workers. La différence avec le mode wasm d'Aurabase tient à la surface disponible. Un Worker écrit en Rust via ce SDK s'exécute dans l'environnement Workers complet, et peut donc appeler fetch ou d'autres bindings de la plateforme. Le mode wasm d'Aurabase, lui, part d'une surface hôte volontairement réduite (section précédente).

#
Vercel

Vercel Edge Functions : un sous-ensemble Node.js, pas de voie Rust officielle

L'Edge Runtime de Vercel exécute aussi le code dans des isolates V8, avec un sous-ensemble d'API Web standard (fetch, Request/Response, crypto.subtle…) plutôt que l'environnement Node.js complet. Les modules natifs Node et les toolchains de compilation arbitraires n'y ont pas leur place.

L'objet WebAssembly fait partie de ce sous-ensemble : rien n'empêche de charger un binaire .wasm et de l'instancier à la main depuis une fonction JavaScript ou TypeScript. Mais à notre connaissance, Vercel ne publie aucun SDK ni CLI officiels pour écrire directement une Edge Function en Rust, contrairement à workers-rs côté Cloudflare ou à aura functions deploy côté Aurabase. Le chemin reste possible, mais entièrement manuel, sans outillage dédié.

#
Sécurité

Bac à sable : mémoire linéaire WASM contre isolation V8

Un isolate V8 sépare le code exécuté par un tas (heap) dédié et un contexte propre, à l'intérieur du même processus moteur. C'est un mécanisme éprouvé, à l'échelle de millions de requêtes par seconde chez Cloudflare et Vercel, mais qui reste un mécanisme d'isolation logicielle au sein d'un moteur JavaScript unique.

Le modèle WASM isole différemment : chaque instance obtient sa propre mémoire linéaire, un tampon contigu hors duquel aucun accès n'est possible par construction du format binaire lui-même, indépendamment du moteur qui l'exécute. Dans le runtime Aurabase, chaque fonction hôte qui manipule un pointeur fourni par le module invité (aura.log, aura.get_env…) revalide explicitement les bornes avant tout accès mémoire. C'est une défense en profondeur supplémentaire contre un module malveillant ou buggé.

#
Vue d'ensemble

Les trois architectures, côte à côte

Aurabase (wasm)Cloudflare WorkersVercel Edge Functions
Modèle d’exécutionModule WASM natif, WasmtimeIsolate V8 + WASM en module optionnelIsolate V8, sous-ensemble Node.js
Rust en premier planOui, mode dédié + CLIVia SDK communautaire (workers-rs)Non, aucune voie officielle
Accès réseau sortant du moduleNon, vérifié dans le code (aucune host function réseau)Oui, via l’environnement Workers completOui, API fetch standard
Budget CPUFuel Wasmtime, configurableLimite de temps CPU par requête (doc. Cloudflare)Limite de durée par invocation (doc. Vercel)
Déploiement dédié Rustaura functions deploy (cargo build local)wrangler + workers-rsAucun outil officiel équivalent

Colonnes Aurabase vérifiées dans services/aura-functions/src (23 août 2026). Colonnes Cloudflare et Vercel décrites à partir de l'architecture publique documentée de chaque plateforme (isolates V8, WebAssembly comme cible de compilation). Les limites précises de CPU et de mémoire évoluent avec chaque plan tarifaire : elles ne sont pas republiées ici sans mesure datée.

#
Décision

Quel runtime choisir selon votre fonction

Calcul pur, sans appel réseau : validation de schéma, transformation de données, scoring, génération d'image légère. Le mode wasm d'Aurabase convient directement, avec un sandbox mémoire strict, un budget CPU explicite, et sans dépendance à un service externe.

Fonction qui appelle une API tierce (paiement, email, webhook sortant). Le mode deno d'Aurabase reste le choix par défaut aujourd'hui, de la même façon qu'un Worker Cloudflare classique ou une Edge Function Vercel s'appuient sur fetch nativement.

Équipe déjà investie dans l'écosystème Cloudflare (KV, Durable Objects, R2). Rester sur Workers a du sens ; workers-rs permet d'y introduire du Rust progressivement, sans changer de plateforme.

Besoin d'un runtime Rust natif géré de bout en bout, avec une CLI dédiée et le même langage que le reste du backend. C'est l'angle que documente notre comparatif Wasmtime vs Wasmer, sur le choix du moteur WebAssembly lui-même.

#
Questions Fréquentes

FAQ

Peut-on écrire des Edge Functions Aurabase en Rust ?+
Oui, via le mode wasm. La CLI aura functions new scaffolde un crate Rust (crate-type cdylib). La commande aura functions deploy le compile en local avec cargo build --target wasm32-unknown-unknown --release, puis envoie le binaire au service aura-functions, qui l’exécute nativement avec le runtime Wasmtime. Ce n’est pas le mode par défaut : par défaut, une Edge Function Aurabase tourne en JavaScript/TypeScript (runtime Deno, V8 Isolates).
Cloudflare Workers permet-il vraiment d’écrire des fonctions en Rust ?+
Oui, mais indirectement : Cloudflare Workers exécute nativement du JavaScript/TypeScript dans des isolates V8. Le SDK communautaire workers-rs permet de compiler un Worker entier en Rust vers WebAssembly, mais ce n’est pas la voie la plus documentée officiellement. Le WASM y complète un Worker plutôt que de remplacer entièrement le modèle JS.
Vercel Edge Functions supporte-t-il WebAssembly ou Rust nativement ?+
L’Edge Runtime de Vercel expose les API Web standard, dont l’objet WebAssembly, donc un module .wasm peut être chargé et instancié manuellement depuis une fonction JavaScript/TypeScript. Mais à notre connaissance, Vercel ne publie aucun SDK ni CLI officiels pour écrire une Edge Function directement en Rust, contrairement à workers-rs côté Cloudflare ou à aura functions deploy côté Aurabase.
Le mode wasm d’Aurabase peut-il appeler une API tierce (paiement, email…) ?+
Pas aujourd’hui. Vérifié dans le code (services/aura-functions/src/wasm/mod.rs) : les seules host functions exposées au module WASM invité sont le log, la lecture de la requête d’entrée et l’écriture de la réponse de sortie. Une quatrième lit les variables d’environnement. Aucun accès réseau sortant. Pour une fonction qui doit appeler un service externe, le mode deno (par défaut) reste le chemin recommandé.
EDGE FUNCTIONS VÉRIFIÉES

Un seul backend, deux runtimes d'exécution.

Créez un projet Aurabase gratuit et déployez une première Edge Function, en JavaScript ou en Rust compilé WASM.

Aucune carte bancaire requise · 500 MB gratuits · 50 000 MAU