Back to flin
flin

Backends R2 et Google Cloud Storage

Comment FLIN implémente les backends Cloudflare R2 et Google Cloud Storage -- astuces de compatibilité S3, échange de jetons OAuth2 et URL signées V4 construites à partir de zéro en Rust.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 3 min flin
EN/ FR/ ES
flinr2gcscloudflaregoogle-cloudstorage

Implémenter un backend de stockage cloud vous apprend le protocole. En implémenter deux vous apprend comment les protocoles divergent sous la surface. Cloudflare R2 et Google Cloud Storage stockent et servent tous deux des fichiers, mais leurs modèles d'authentification, algorithmes de signature d'URL et conventions API diffèrent de manières qui testent les limites d'une abstraction unifiée.

Cloudflare R2 : S3 avec une variante

L'argument de vente de R2 est la compatibilité S3. Il parle le même protocole et accepte les mêmes appels SDK. L'implémentation utilise le crate rust-s3 avec l'adressage par chemin (path-style) requis par R2 et la région « auto ».

R2 utilise "auto" au lieu d'une région spécifique -- Cloudflare route les requêtes vers le centre de données le plus proche automatiquement. Les requêtes HEAD sur R2 sont gratuites, rendant la déduplication essentiellement sans coût.

Google Cloud Storage : un monde différent

GCS ne parle pas S3. Il a sa propre API REST, son propre système d'authentification (OAuth2 avec comptes de service) et son propre algorithme d'URL signées (V4 avec RSA-SHA256). L'implémentation du backend GCS a nécessité substantiellement plus de code que R2.

L'authentification GCS utilise des fichiers JSON de comptes de service avec un flux en six étapes : charger le JSON, créer un JWT, signer avec la clé privée RSA, échanger contre un jeton OAuth2, mettre en cache le jeton et le rafraîchir avant expiration.

Les URL signées V4 de GCS utilisent un algorithme en quatre étapes impliquant une requête canonique, un hash SHA-256, une signature RSA et des paramètres de requête. FLIN implémente cet algorithme à partir de zéro en utilisant les crates rsa et pkcs8.

Résumé comparatif

AspectR2GCS
ProtocoleCompatible S3API REST personnalisée
AuthentificationClé d'accès + secretCompte de service + OAuth2
SignatureURL présignées S3V4 RSA-SHA256
Taille d'implémentation282 lignes580 lignes
Coûts de sortieZéroTarifs standard

R2 est l'implémentation plus simple car elle s'appuie sur l'écosystème de S3. GCS est plus complexe car elle nécessite une authentification et une signature personnalisées. Les deux sont des citoyens de première classe dans le système de stockage de FLIN, et passer de l'un à l'autre ne nécessite de changer qu'une valeur de configuration.


Ceci est la partie 128 de la série « Comment nous avons construit FLIN », documentant comment un CEO à Abidjan et un CTO IA ont conçu et construit un langage de programmation à partir de zéro.

Navigation de la série : - [127] Le patron de trait StorageBackend - [128] Backends R2 et Google Cloud Storage (vous êtes ici) - [129] Grants de téléchargement et clés d'accès

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

Le Step Zero ne suffisait pas : comment valider un constructeur sans valider le runtime a fait tomber toutes les sessions vocales de Déblo l’heure où nous avons livré le streaming caméra temps réel

La phase 14 a livré Déblo Eyes — streaming caméra temps réel via LiveKit vers Gemini Live native audio. Le premier deploy a fait tomber toutes les sessions vocales en production en quatre-vingt-dix secondes parce que notre Step 0 avait validé le constructeur sans exercer le runtime. Le build log de comment Déblo a eu des yeux, ce qu’un pré-vol incomplet a coûté, et quels points de polish ont été livrés ou reportés.

33 min May 20, 2026
debloclaude-opus-4.7claude-codegemini-live +25
Thales & Claude deblo

Le tiret cadratin qui a tué la production : comment un slogan marketing dans un header HTTP a fait tomber le chat de Déblo pendant 24 heures

Deux jours avant la soumission App Store, tout le produit chat de Déblo s’est cassé silencieusement. Pas de spinner, pas de toast, aucune erreur dans l’UI — juste un silence radio. L’incident de 24 heures se résumait à un seul « é » dans la valeur d’un header HTTP qui levait une UnicodeEncodeError avant qu’aucune requête vers OpenRouter ne quitte le backend. Post-mortem d’une fausse hypothèse, d’une trace Sentry, et d’un fix de six lignes qui a débloqué le lancement.

30 min May 19, 2026
debloclaude-opus-4.7claude-codeincident +19
Thales & Claude deblo

Six heures, d’une page blanche à la review Apple — Comment nous avons soumis Déblo à l’App Store, en direct

Marche à marche en direct de la soumission de Déblo à l’App Store iOS en six heures : ce que les validateurs d’Apple ont rejeté (un superscript Unicode), ce que nous avons corrigé (un Promotional Text gaspillé sur des marques tierces), et les rouages de l’ASO iOS que presque tout le monde rate.

30 min May 13, 2026
debloclaude-opus-4.7claude-codeapp-store +16