[Nom du Binding Cloudflare]
Type de ressource : Binding Cloudflare (KV / Queue / R2 / Service / Secret)
Fichier source :services/[worker-name]/wrangler.toml
Statut : [Actif / Déprécié / En développement]
1. Vue dâensemble
Section titled â1. Vue dâensembleâ1.1. Description
Section titled â1.1. Descriptionâ[Description concise du rĂŽle de ce binding dans lâarchitecture L3]
1.2. Objectif
Section titled â1.2. Objectifâ- [Objectif principal : ex. stocker temporairement les soumissions de formulaires en cas de panne CRM]
- [BĂ©nĂ©fice pour lâarchitecture : ex. rĂ©silience asynchrone sans bloquer lâutilisateur]
1.3. Caractéristiques
Section titled â1.3. CaractĂ©ristiquesâ| PropriĂ©tĂ© | Valeur |
|---|---|
| Type de binding | [KV / Queue / R2 / Service / Secret / D1 / Durable Object] |
| Nom du binding | [BINDING_NAME] |
| Nom de la ressource | [resource-name] |
| Environnements | [Production / Staging / Preview] |
| Workers consommateurs | [Liste des Workers qui utilisent ce binding] |
2. Architecture et flux
Section titled â2. Architecture et fluxâ2.1. Diagramme de flux
Section titled â2.1. Diagramme de fluxâ[Worker Producteur] â âą Ăcriture / Envoi âŒ[Binding Cloudflare] â âą Stockage / File d'attente âŒ[Worker Consommateur] â âą Lecture / Consommation âŒ[Action / RĂ©ponse]2.2. Composants impliquĂ©s
Section titled â2.2. Composants impliquĂ©sâ| Composant | RĂŽle | Type |
|---|---|---|
| [Worker producteur] | Ăcriture dans le binding | Worker L3 |
| [Binding] | Stockage / File dâattente | Cloudflare Service |
| [Worker consommateur] | Lecture / Consommation | Worker L3 |
3. Configuration
Section titled â3. Configurationâ3.1. Configuration Wrangler (wrangler.toml)
Section titled â3.1. Configuration Wrangler (wrangler.toml)â# Exemple pour KV[[kv_namespaces]]binding = "KV_BINDING"id = "your-kv-namespace-id"preview_id = "your-preview-kv-namespace-id"
# Exemple pour Queue (producer)[[queues.producers]]queue = "queue-name"binding = "QUEUE_BINDING"
# Exemple pour Queue (consumer)[[queues.consumers]]queue = "queue-name"max_batch_size = 10max_batch_timeout = 30
# Exemple pour R2[[r2_buckets]]binding = "R2_BUCKET"bucket_name = "bucket-name"preview_bucket_name = "bucket-name-staging"
# Exemple pour Service Binding[[services]]binding = "SERVICE_BINDING"service = "service-name"environment = "production"3.2. Création de la ressource
Section titled â3.2. CrĂ©ation de la ressourceâ# CrĂ©ation d'un namespace KVwrangler kv:namespace create "KV_BINDING" --env productionwrangler kv:namespace create "KV_BINDING" --env staging
# Création d'une Queuewrangler queues create queue-name --env productionwrangler queues create queue-name --env staging
# Création d'un bucket R2wrangler r2 bucket create bucket-name
# Liaison d'un bucket R2 Ă un Workerwrangler r2 bucket link bucket-name --binding R2_BUCKET3.3. Variables dâenvironnement associĂ©es
Section titled â3.3. Variables dâenvironnement associĂ©esâ| Variable | Description | Obligatoire | Valeur par dĂ©faut |
|---|---|---|---|
| [Variable] | [Description] | [â /â] | [Valeur] |
4. Implémentation
Section titled â4. ImplĂ©mentationâ4.1. Interface TypeScript du binding
Section titled â4.1. Interface TypeScript du bindingâ// Interface Env du Worker consommateurexport interface Env { // KV KV_BINDING: KVNamespace;
// Queue QUEUE_BINDING: Queue;
// R2 R2_BUCKET: R2Bucket;
// Service SERVICE_BINDING: Fetcher;
// Secret SECRET_NAME: string;}4.2. Utilisation dans un Worker producteur
Section titled â4.2. Utilisation dans un Worker producteurâ// Exemple : Ăcriture dans KVawait env.KV_BINDING.put('key', 'value', { expirationTtl: 3600, // 1 heure metadata: { createdAt: new Date().toISOString() }});
// Exemple : Envoi dans une Queueawait env.QUEUE_BINDING.send({ email: 'user@example.com', message: 'Hello', submittedAt: new Date().toISOString()});
// Exemple : Upload vers R2await env.R2_BUCKET.put('path/to/file.jpg', fileContent, { httpMetadata: { contentType: 'image/jpeg' }, customMetadata: { uploadedBy: 'user-123' }});
// Exemple : Appel Ă un Service Bindingconst response = await env.SERVICE_BINDING.fetch('https://service-name/path', { method: 'POST', body: JSON.stringify({ data: 'value' })});4.3. Utilisation dans un Worker consommateur (Queue)
Section titled â4.3. Utilisation dans un Worker consommateur (Queue)âexport default { async queue(batch: MessageBatch, env: Env, ctx: ExecutionContext): Promise<void> { for (const message of batch.messages) { try { const payload = message.body as { email: string; message: string };
// Traitement du message await processMessage(payload, env);
// Acknowledgement implicite (message retiré de la queue) message.ack(); } catch (error) { console.error('Erreur de traitement du message', error);
// Retry ou dead letter queue message.retry(); } } },};5. Cas dâusage spĂ©cifiques
Section titled â5. Cas dâusage spĂ©cifiquesâ5.1. KV : Debouncing de webhooks
Section titled â5.1. KV : Debouncing de webhooksâContexte : Le Worker cms-webhook-receiver utilise KV pour Ă©viter les rebuilds multiples en cascade.
// Pose d'un lock pour 2 minutesconst lockKey = 'sanity-rebuild-lock';const isLocked = await env.WEBHOOK_LOCK_KV.get(lockKey);
if (isLocked) { return new Response(JSON.stringify({ status: 'ignored', message: 'Rebuild déjà planifié (Debounced)' }), { status: 200 });}
await env.WEBHOOK_LOCK_KV.put(lockKey, 'locked', { expirationTtl: 120 });Configuration :
- Clé :
sanity-rebuild-lock - TTL : 120 secondes (2 minutes)
- Rationale : ProtĂ©ger les quotas CI/CD de lâhĂ©bergeur
5.2. Queue : Fallback asynchrone pour formulaires
Section titled â5.2. Queue : Fallback asynchrone pour formulairesâContexte : Le Worker form-handler utilise une Queue pour re-tenter lâenvoi au CRM en cas de panne.
try { const crmRes = await fetch(env.CRM_ENDPOINT_URL, { method: 'POST', headers: { 'Authorization': `Bearer ${env.CRM_API_KEY}` }, body: JSON.stringify(crmPayload), }); if (!crmRes.ok) throw new Error(`Erreur HTTP CRM: ${crmRes.status}`);} catch (crmError) { console.error('Ăchec de synchro CRM en direct. Envoi en queue...', crmError); await env.SUBMISSIONS_QUEUE.send(crmPayload);}Configuration :
- Nom de la Queue :
form-submissions-queue - Binding :
SUBMISSIONS_QUEUE - Rationale : RĂ©silience asynchrone sans bloquer lâutilisateur
5.3. R2 : Stockage des médias
Section titled â5.3. R2 : Stockage des mĂ©diasâContexte : Les Workers media-upload, media-cleanup et sanity-backup utilisent R2 pour stocker les mĂ©dias et les backups.
// Upload d'un médiaawait env.R2_BUCKET.put(`medias/images/blog/${Date.now()}-${filename}`, fileContent, { httpMetadata: { contentType: 'image/webp' }});
// Listing des objetsconst objects = await env.R2_BUCKET.list({ prefix: 'medias/' });
// Suppressionawait env.R2_BUCKET.delete('medias/images/blog/old-image.webp');
// Streaming vers R2 (backup)await env.R2_BACKUP_BUCKET.put(backupKey, exportRes.body, { customMetadata: { exportedAt: new Date().toISOString() }});Configuration :
- Bucket médias :
pub-medias - Bucket backups :
backups-sanity - Rationale : Stockage Edge natif, coûts maßtrisés, performance optimale
6. Sécurité et accÚs
Section titled â6. SĂ©curitĂ© et accĂšsâ6.1. ContrĂŽle dâaccĂšs
Section titled â6.1. ContrĂŽle dâaccĂšsâ| Binding | AccĂšs | Rationale |
|---|---|---|
| KV | Workers uniquement | Pas dâaccĂšs direct depuis le client |
| Queue | Workers uniquement | Pas dâaccĂšs direct depuis le client |
| R2 | Workers + URLs publiques/signées | Médias publics, documents sensibles signés |
| Secrets | Workers uniquement | Jamais exposés cÎté client |
6.2. RÚgles de sécurité
Section titled â6.2. RĂšgles de sĂ©curitĂ©â- â Les bindings sont accessibles uniquement depuis les Workers (pas depuis le navigateur)
- â
Les secrets sont injectés via
wrangler secret put(jamais dans le code source) - â Les buckets R2 publics sont protĂ©gĂ©s par le proxy Cloudflare (WAF, DDoS)
- â Les URLs signĂ©es ont une durĂ©e de vie limitĂ©e (1h Ă 24h max)
- â Les Queues ne sont pas accessibles publiquement ( Workers uniquement)
6.3. Rotation des secrets
Section titled â6.3. Rotation des secretsâ# Rotation d'un secretwrangler secret put SECRET_NAME --env productionwrangler secret put SECRET_NAME --env staging
# Liste des secretswrangler secret list --env production7. Performance et limites
Section titled â7. Performance et limitesâ7.1. Limites par type de binding
Section titled â7.1. Limites par type de bindingâ| Binding | Limite | Rationale |
|---|---|---|
| KV | 100 000 lectures/s, 1 000 écritures/s | Quota Cloudflare |
| Queue | 5 000 messages/s, 10 MB max par message | Quota Cloudflare |
| R2 | 10 000 000 requĂȘtes/mois (Free), IllimitĂ© (Paid) | Quota Cloudflare |
| Service Binding | 50 sous-requĂȘtes par Worker | Limite Workers |
7.2. Optimisations appliquées
Section titled â7.2. Optimisations appliquĂ©esâ- â Utiliser KV pour les donnĂ©es frĂ©quemment lues et rarement modifiĂ©es
- â Utiliser les Queues pour le traitement asynchrone (Ă©vite les timeouts)
- â Utiliser R2 pour le stockage de fichiers (pas de limite de taille)
- â Utiliser le streaming HTTP pour les gros volumes (Ă©vite OOM)
- â Mettre en cache les donnĂ©es KV avec TTL appropriĂ©
7.3. Coûts
Section titled â7.3. CoĂ»tsâ| Binding | ModĂšle de coĂ»t | Estimation mensuelle |
|---|---|---|
| KV | $0.50/10M lectures, $5/1M écritures | ~$5-10 |
| Queue | $0.40/1M messages | ~$2-5 |
| R2 | $0.015/GB/mois, $0.36/1M requĂȘtes | ~$10-20 |
| Service Binding | Inclus dans le coût Workers | $0 supplémentaire |
8. Monitoring et observabilité
Section titled â8. Monitoring et observabilitĂ©â8.1. MĂ©triques clĂ©s
Section titled â8.1. MĂ©triques clĂ©sâ| Binding | MĂ©trique | Seuil dâalerte | Canal |
|---|---|---|---|
| KV | Latence p95 | > 50ms | Slack |
| Queue | Profondeur de la queue | > 1000 messages | PagerDuty |
| Queue | Taux dâerreur | > 5% sur 5 min | Slack |
| R2 | Espace utilisé | > 80% du quota | |
| R2 | Coût mensuel | > $50 |
8.2. Commandes de debug
Section titled â8.2. Commandes de debugâ# Inspection KVwrangler kv:key list --binding=KV_BINDING --env productionwrangler kv:key get --binding=KV_BINDING "key" --env production
# Inspection Queuewrangler queues info queue-name --env production
# Inspection R2wrangler r2 object list bucket-name --prefix medias/
# Logs en temps réelwrangler tail [worker-name] --env production9. Débogage et troubleshooting
Section titled â9. DĂ©bogage et troubleshootingâ9.1. ProblĂšmes courants
Section titled â9.1. ProblĂšmes courantsâ| SymptĂŽme | Cause probable | Solution |
|---|---|---|
| âBinding not foundâ | Binding mal configurĂ© dans wrangler.toml | VĂ©rifier la configuration et redĂ©ployer |
| âQueue fullâ | Consommateur trop lent | Augmenter max_batch_size ou ajouter des consommateurs |
| âKV rate limit exceededâ | Trop de lectures/Ă©critures | Mettre en cache ou optimiser les accĂšs |
| âR2 access deniedâ | Permissions insuffisantes | VĂ©rifier les permissions du token API |
| âSecret not foundâ | Secret non injectĂ© | ExĂ©cuter wrangler secret put |
9.2. Tests manuels
Section titled â9.2. Tests manuelsâ# Test KVwrangler kv:key put --binding=KV_BINDING "test-key" "test-value" --env stagingwrangler kv:key get --binding=KV_BINDING "test-key" --env staging
# Test Queue (envoi manuel)wrangler queues send queue-name --data '{"test": "data"}' --env staging
# Test R2wrangler r2 object put bucket-name/test.txt --file=test.txtwrangler r2 object get bucket-name/test.txt10. Bonnes pratiques
Section titled â10. Bonnes pratiquesâ10.1. Architecture
Section titled â10.1. Architectureâ- â Utiliser KV pour les donnĂ©es temporaires (locks, cache, sessions)
- â Utiliser les Queues pour le traitement asynchrone (formulaires, webhooks)
- â Utiliser R2 pour le stockage de fichiers (mĂ©dias, backups)
- â SĂ©parer les buckets par environnement (production, staging)
- â Documenter les bindings dans ce fichier
10.2. Code
Section titled â10.2. Codeâ- â Typer strictement les bindings dans lâinterface Env
- â GĂ©rer les erreurs de maniĂšre explicite (try/catch)
- â Utiliser le streaming pour les gros volumes (R2)
- â Mettre en cache les donnĂ©es KV avec TTL appropriĂ©
- â Logger les opĂ©rations critiques pour lâaudit
10.3. Performance
Section titled â10.3. Performanceâ- â Minimiser les lectures/Ă©critures KV (batch si possible)
- â Utiliser les Queues pour Ă©viter les timeouts
- â Utiliser le streaming HTTP pour R2 (Ă©vite OOM)
- â Surveiller les mĂ©triques de performance (latence, dĂ©bit)
- â Optimiser les coĂ»ts (nettoyage rĂ©gulier, lifecycle rules)
10.4. Sécurité
Section titled â10.4. SĂ©curitĂ©â- â Ne jamais exposer les bindings cĂŽtĂ© client
- â
Injecter les secrets via
wrangler secret put - â Rotation rĂ©guliĂšre des secrets (tous les 90 jours)
- â Utiliser des URLs signĂ©es pour les documents sensibles
- â Auditer les accĂšs aux buckets R2
11. Ăvolutions et roadmap
Section titled â11. Ăvolutions et roadmapâ11.1. AmĂ©liorations planifiĂ©es
Section titled â11.1. AmĂ©liorations planifiĂ©esâ- [Ăvolution 1 : ex. Migration vers D1 pour les donnĂ©es relationnelles]
- [Ăvolution 2 : ex. Ajout de Durable Objects pour les sessions utilisateur]
- [Ăvolution 3 : ex. ImplĂ©mentation dâune dead letter queue pour les messages Ă©chouĂ©s]
11.2. Limitations connues
Section titled â11.2. Limitations connuesâ- â KV ne supporte pas les transactions (pas dâatomicitĂ© multi-clĂ©s)
- â Les Queues ont une limite de 10 MB par message
- â R2 ne supporte pas nativement la transformation dâimages (nĂ©cessite Cloudflare Images)
- â Les Service Bindings ont une limite de 50 sous-requĂȘtes par Worker
12. Ressources liées
Section titled â12. Ressources liĂ©esâ- Documentation Cloudflare KV : Getting Started
- Documentation Cloudflare Queues : Getting Started
- Documentation Cloudflare R2 : Getting Started
- Documentation Service Bindings : Workers Services
- DAT L3 : §5 - Microservices Métiers (Cloudflare Workers Dédiés)
- DAT L3 : §6 - Structure Monorepo, Wrangler & Configuration
- Workers consommateurs :
services/form-handler/services/cms-webhook-receiver/services/media-upload/services/media-cleanup/services/sanity-backup/
- Fichiers concernés :
services/[worker-name]/wrangler.toml- Configuration Dashboard Cloudflare â KV / Queues / R2
13. Historique des modifications
Section titled â13. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| YYYY-MM-DD | 1.0 | Création initiale | [Nom] |
| YYYY-MM-DD | 1.1 | [Modification] | [Nom] |
---
**Points clés de ce template :**- Couvre tous les types de bindings Cloudflare (KV, Queue, R2, Service, Secret)- Détaille la configuration Wrangler complÚte pour chaque type- Inclut des cas d'usage spécifiques au projet (debouncing webhooks, fallback formulaires, stockage médias)- Documente les limites, les coûts et les optimisations- Fournit les commandes de debug et de monitoring- Sépare clairement les bonnes pratiques par catégorie (architecture, code, performance, sécurité)