Aller au contenu

PD-6 — Retour d'expérience


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 [Spécification](PD-6-specification.md) | | | 🛠️ [Plan d'implémentation](PD-6-plan.md) | | | ✅ [Critères d'acceptation](PD-6-acceptability.md) | | | 📝 **Retour d'expérience** | *(ce document)* | [← Retour à storage](../PD-198-epic.md) · [↑ Index User Story](index.md)

1. Résumé exécutif

La User Story PD-6 visait à activer la Cross-Region Replication (CRR) entre AWS S3 Paris (eu-west-3) et Frankfurt (eu-central-1) pour garantir la résilience géographique des archives probatoires WORM. L'implémentation fournit un sous-module Terraform frankfurt/ avec bucket destination Object Lock COMPLIANCE, rôle IAM CRR dédié, configuration CRR avec RTC (15 min SLA), et monitoring CloudWatch. Cependant, 1 écart MAJEUR est identifié : SSE-S3 au lieu de SSE-KMS avec clés distinctes Paris/Francfort, ainsi que 2 écarts MINEURS : nommage buckets divergent de la spec et metric BytesPendingReplication absente. Verdict : ACCEPTÉ AVEC RÉSERVES.


2. Points fluides

  • CRR activée : réplication Paris → Frankfurt opérationnelle avec rule ID crr-paris-to-frankfurt
  • RTC (Replication Time Control) : SLA 15 minutes garanti avec replication_time.status = "Enabled"
  • Object Lock COMPLIANCE répliqué : mode COMPLIANCE identique source/destination
  • Delete marker replication désactivée : conformité WORM (pas de suppression répliquée)
  • Storage class DEEP_ARCHIVE : coût minimal sur la replica Frankfurt
  • IAM role dédié : pv-crr-replication-role avec permissions minimales
  • Permissions Object Lock : s3:PutObjectRetention, s3:PutObjectLegalHold incluses
  • Bucket policies restrictives : DenyAllDeletes + HTTPSOnly sur Frankfurt
  • Public access block : toutes options à true sur destination
  • Versioning activé : prérequis CRR et Object Lock respecté
  • prevent_destroy : protection Terraform contre suppression accidentelle
  • Metrics CRR activées : metrics.status = "Enabled" avec event_threshold 15 min
  • Tags conformité : NF-Z42-013, RetentionMax, Region, CRR role documentés
  • Logging intentionnel : justification documentée (source has logging)
  • replica_modifications : réplication des modifications de metadata activée
  • Script de test : test-crr.sh disponible pour validation

3. Points difficiles

Difficulté Contexte
SSE-KMS non implémenté Spec demande clés KMS distinctes Paris/Francfort, implémentation utilise SSE-S3
Nommage buckets Spec: pv-archives-paris/frankfurt, code: ${project_name}-archives-frankfurt-${env}
BytesPendingReplication absent Seul OperationsPendingReplication configuré dans CloudWatch
KMS cross-region SSE-KMS CRR nécessite replica_kms_key_id et permissions KMS cross-account
Glacier Vault Lock initial Prévu initialement, supprimé car redondant avec S3 Object Lock

4. Hypothèses révélées tardivement

Hypothèse initiale Réalité découverte
SSE-KMS requis pour CRR FAUX — SSE-S3 fonctionne, KMS nécessite configuration additionnelle
Nommage standardisé pv-* FAUX — Terraform utilise pattern ${project_name}-*-${environment}
Glacier Vault Lock nécessaire FAUX — S3 Object Lock COMPLIANCE suffit pour conformité WORM
Logging obligatoire destination FAUX — Source logging suffit car CRR = seul chemin d'écriture
Object Lock répliqué automatiquement VRAI — Avec permissions PutObjectRetention/LegalHold

5. Invariants complexes à implémenter

Invariant Complexité
Object Lock COMPLIANCE identique Source et destination doivent avoir même mode et rétention minimale
Delete marker replication = Disabled Obligatoire pour WORM, empêche propagation suppressions logiques
Versioning requis des deux côtés CRR nécessite versioning Enabled sur source ET destination
RTC SLA 15 min Replication Time Control garanti mais implique coûts additionnels
Ordre de création Bucket destination + Object Lock AVANT activation CRR
IAM cross-region Role dans Paris, policy couvre buckets Paris et Frankfurt

6. Dette technique

Dette Impact Priorité
SSE-S3 au lieu SSE-KMS Pas de séparation clés Paris/Frankfurt, audit KMS indisponible MOYENNE
Nommage divergent Documentation/spec à aligner avec code réel BASSE
BytesPendingReplication absent Visibilité volume réplication limitée BASSE
Documentation CRR /docs/infra/aws/crr/ partiellement créé BASSE
Plan de reprise Procédure restore Frankfurt → Paris à compléter MOYENNE

7. Risques résiduels

Risque Probabilité Impact Mitigation suggérée
Latence CRR > 15 min Faible MOYEN Alertes configurées, RTC garantit SLA
Échec réplication silencieux Faible ÉLEVÉ Metric OperationsFailedReplication surveillée
Coûts RTC Moyenne FAIBLE RTC payant mais SLA critique pour conformité
Restore depuis Frankfurt Moyenne MOYEN Tester procédure annuellement avec délais Glacier
KMS cross-region complexe N/A N/A Non implémenté, SSE-S3 utilisé

8. Améliorations processus

Amélioration Bénéfice attendu
Aligner nommage spec/code Éviter confusion documentation vs réalité
Documenter choix SSE-S3 vs KMS ADR justifiant le compromis
Ajouter BytesPendingReplication Visibilité volume en plus du nombre d'opérations
Monitoring mensuel métriques CRR Détection proactive anomalies
Test restore annuel Frankfurt Validation procédure de reprise
Suivi budgétaire CRR Documenter coûts RTC et DEEP_ARCHIVE

9. Enseignements clés

  1. S3 Object Lock COMPLIANCE + CRR = solution WORM complète — Glacier Vault Lock initialement prévu s'est révélé redondant. S3 Object Lock COMPLIANCE offre la même garantie d'immutabilité avec une architecture plus simple.

  2. Delete marker replication doit être explicitement désactivée pour WORM — Par défaut, la CRR peut répliquer les delete markers, ce qui compromettrait l'immutabilité. Le paramètre delete_marker_replication.status = "Disabled" est critique pour la conformité.

  3. RTC (Replication Time Control) est essentiel pour la conformité SLA — Le SLA 15 minutes garantit que les données sont répliquées dans un délai prévisible, critique pour la résilience probatoire. Cette fonctionnalité est payante mais justifiée.

  4. Le logging sur le bucket destination CRR est optionnel — Le bucket source capture toutes les écritures. Le bucket destination ne reçoit des objets que via CRR, rendant le logging destination redondant. L'alerte SonarQube S6258 est documentée comme intentionnelle.

  5. SSE-KMS CRR nécessite une configuration additionnelle significative — La réplication avec SSE-KMS requiert replica_kms_key_id, des permissions KMS cross-region, et un bloc sse_kms_encrypted_objects. Le choix SSE-S3 simplifie l'implémentation mais ne satisfait pas l'exigence de clés distinctes.