Introduction
Spin, développé par Fermyon, est un framework open-source pour construire des microservices en WebAssembly (Wasm). Contrairement aux conteneurs traditionnels, Spin compile votre code en Wasm pour une exécution ultra-rapide, portable sur n'importe quel runtime (edge, cloud, on-prem). En 2026, avec l'essor de l'edge computing, Spin domine pour les APIs serverless : latence minimale, cold starts en millisecondes et isolation native.
Pourquoi l'adopter ? Imaginez des fonctions Lambda 10x plus rapides sans lock-in vendor. Ce tutoriel beginner vous guide pour créer une API HTTP simple en Rust : handler GET renvoyant JSON, build local, test et déploiement Fermyon Cloud. À la fin, vous aurez une app live, prête pour production. Durée : 20 min. Valeur : foundations solides pour scaler vers des apps complexes.
Prérequis
- Système : macOS, Linux ou Windows (WSL recommandé)
- Rust installé (via rustup.rs)
- Git (pour versionning)
- Compte gratuit Fermyon Cloud (optionnel pour déploiement)
- Terminal basique
Installer la CLI Spin
curl -fsSL https://developer.fermyon.com/downloads/spin/spin-stable-linux-amd64.tar.gz | tar -C /usr/local --strip-components=1 -zxf -
# Sur macOS avec Homebrew
brew install spin
# Vérifier
spin --versionCette commande télécharge et installe la CLI Spin stable (version 2026 compatible). Sur macOS, Homebrew simplifie. La vérification affiche la version (ex: v3.x), confirmant l'installation sans pièges comme les proxies bloquants – utilisez sudo si besoin root.
Créer votre premier projet Spin
Une fois la CLI installée, générez un squelette de projet. Spin supporte Rust, TinyGo, etc. ; on choisit Rust pour sa maturité et perfos natives. Le template http-rust crée un handler HTTP basique, prêt à customiser.
Générer le projet
spin new hello-spin --template http-rust
cd hello-spin
# Explorer la structure
git init # Optionnel pour versionning
ls -laLa commande spin new scaffold un projet complet : Spin.toml pour config, src/lib.rs pour logic. --template http-rust cible APIs HTTP. Évitez les templates vides pour beginners ; ls montre Cargo.toml auto-généré, évitant setups manuels fastidieux.
Configurer Spin.toml
Spin.toml définit le composant : triggers (HTTP ici), bindings (volumes, Redis...), env vars. C'est le manifeste YAML-like pour déploiements. On le garde minimal pour démarrer.
Fichier de configuration Spin.toml
spin_manifest_version = "2"
[application]
name = "hello-spin"
version = "1.0.0"
[[trigger.http]]
route = "/..."
component = "hello-spin"
[component]
source = { crate = "hello-spin" }
allowed_http_hosts = []
[component.build]
command = "cargo"
Ce manifest v2 (standard 2026) lie le trigger HTTP à toutes routes (/...). allowed_http_hosts sécurise les outbound calls. Piège : oubliez spin_manifest_version et le build échoue ; command = "cargo" automatise la compilation Wasm.
Implémenter le handler HTTP
Dans src/lib.rs, Spin utilise wit-bindgen pour interfaces Wasm standardisées (WIT). Le handler traite requests HTTP : parse JSON, retourne 200 OK. Analogie : comme Express.js mais compilé en Wasm pur.
Handler Rust principal
use spin_sdk::http::{IntoResponse, Request, Response};
use spin_sdk::http_component;
#[http_component]
fn handle_request(_req: Request) -> anyhow::Result<impl IntoResponse> {
let body = r#"{"message": "Hello from Spin Fermyon 2026!"}"#;
Ok(Response::builder()
.status(200)
.header("content-type", "application/json")
.body(body)?)
}
Ce handler minimal répond JSON sur toute route POST/GET. http_component macro génère le WIT binding. Ajoutez anyhow pour errors gracieux. Piège : oubliez ? sur body() et paniquez en runtime ; testez avec curl post-build.
Build et tester localement
Compilez en Wasm optimisé, puis lancez le runtime Spin. Accédez via localhost:3000. Logs intégrés aident debug.
Build et run local
spin build
# Runner local
spin up
# Test en autre terminal
curl http://127.0.0.1:3000/ -
# Stopper : Ctrl+Cspin build cross-compile en hello-spin.sbg.wasm (format Spin Bundle Graph). spin up hot-reload dev mode. Curl teste l'endpoint ; attendez "Hello from Spin...". Piège : ports occupés – spin up --port 8080.
Déployer sur Fermyon Cloud
Pour prod, push vers Fermyon Cloud : gratuit, auto-scale. spin login authentifie, deploy publie.
Déploiement cloud
spin login # Crée compte si besoin
spin deploy
# URL live affichée, ex: https://hello-spin.fermyon.app
curl https://<votre-app>.fermyon.app/deploy build + upload atomique. Cloud gère scaling. Piège : sans login, erreur 401 ; vérifiez spin apps list post-deploy. URL publique = endpoint prod instantané.
Bonnes pratiques
- Validez inputs : Utilisez
serdepour JSON strict, évitez injections. - Gestion erreurs : Retournez toujours
Response::builder().status(400)au lieu de panics. - Bindings dynamiques : Ajoutez Redis/KeyValue via
[component.outbound_handler]pour stateful apps. - Optimisez Wasm :
cargo build --releaseavantspin buildpour tailles <1MB. - CI/CD : Intégrez GitHub Actions avec
spin build && spin deploy.
Erreurs courantes à éviter
- Oubli
spin build: Runtime refuse sans.wasmgénéré. - Routes mal matchées :
route = "/api/..."au lieu de"/..."bloque tests. - Dépendances manquantes : Ajoutez
spin-sdk = "2"dansCargo.tomlou build fail. - Cold starts ignorés : Testez avec
spin up --timeout 30spour simuler.
Pour aller plus loin
- Docs officielles : Fermyon Spin
- Avancé : Multi-composants, Redis binding (tuto)
- Formations : Learni Group - WebAssembly & Edge
- Repo exemple : Forkez ce projet sur GitHub pour scaler.