Sprint 2 Report — Infrastructure Terraform AWS
Période : 2026-05-30 à 2026-06-13 Équipe : 1 ingénieur DevOps (Youssef Kadi) Repo : gitlab.com/yk-devops/fastapi-eks-project
Rapport rédigé a posteriori (backfill du 2026-06-20) pour homogénéiser la série 0→4. Stories et incidents tirés du milestone GitLab et des incidents documentés ; rétrospective reconstituée à partir de ces traces.
Executive Summary
Le sprint le plus dense en infrastructure : toute la fondation AWS a été codée en Terraform modulaire (backend S3, VPC, EKS, RDS PostgreSQL, ECR, IAM, orchestrateur principal), avec une séparation persistent / ephemeral pensée pour le coût (monter et détruire le cluster à la demande). C'est aussi le sprint qui a confronté à la réalité de l'IaC sur AWS : state lock, ressources hors state, dépendances de destruction (ENIs orphelins), et coûts cachés (snapshots RDS, NAT Gateway). Chaque incident a nourri une règle d'exploitation durable. En parallèle, les migrations de sécurité initiées au Sprint 1 (python-jose → PyJWT, passlib → bcrypt) ont été finalisées, et un devcontainer a fiabilisé l'environnement de développement.
Stories livrées
Infrastructure Terraform
| # | Description | Taille | Statut |
|---|---|---|---|
| #16 | Setup du backend Terraform S3 (state distant + lock) | S | Livré |
| #17 | Module Terraform VPC (subnets publics/privés, routing) | M | Livré |
| #18 | Module Terraform EKS (cluster + node group) | L | Livré |
| #19 | Module Terraform RDS PostgreSQL | M | Livré |
| #20 | Module Terraform ECR | S | Livré |
| #21 | Module Terraform IAM (rôles cluster/nodes) | M | Livré |
| #22 | Orchestrateur Terraform principal (persistent / ephemeral) | M | Livré |
Sécurité & développement
| # | Description | Taille | Statut |
|---|---|---|---|
| #13 | Migration python-jose → PyJWT (CVE-2024-33663) |
S | Livré |
| #14 | Migration passlib → bcrypt direct |
S | Livré |
| #15 | Devcontainer pour le développement local | S | Livré |
| #23 | Mise à jour de la documentation Sprint 2 | S | Livré |
Vélocité
| Taille | Nb éléments |
|---|---|
| S | 6 |
| M | 4 |
| L | 1 |
| Total | 11 |
Incidents majeurs et résolutions
Le sprint a capitalisé 5 incidents (INC-008 à INC-012), tous liés à la gestion du state Terraform et au cycle de vie des ressources AWS.
INC-008 : state lock S3 non libéré
Error acquiring the state lock après une interruption de Terraform (Ctrl+C, redémarrage du container) laissant un .tflock dans S3.
Leçon : ne jamais interrompre un terraform apply/destroy. Utiliser tmux pour les opérations longues ; terraform force-unlock en dernier recours.
INC-009 : ressources AWS hors state (ECR, IAM)
RepositoryAlreadyExistsException / EntityAlreadyExists lors de la restructuration en modules persistent/ephemeral : le nouveau state ne connaissait pas des ressources créées par l'ancien.
Leçon : Terraform ne connaît que ce qui est dans son state. En production, ne jamais restructurer sans terraform import ; en dev, destroy → restructurer → apply. Formalisé en ADR 003.
INC-010 : EKS node group bloqué sans NAT Gateway (27+ min)
Les nodes en subnets privés timeout faute d'accès internet pour tirer les images ECR. Sans NAT Gateway, pas d'internet, nodes bloqués.
Leçon : EKS en subnets privés = NAT Gateway obligatoire. Coût ~0,045 $/h, donc à détruire le soir (le pattern « infra éphémère » du projet).
INC-011 : ENIs orphelins après terraform destroy
DependencyViolation : l'ELB créé par Envoy Gateway laissait des ENIs rattachées, bloquant la suppression de la VPC.
Leçon : toujours supprimer les ressources K8s (Gateway, services LoadBalancer) avant terraform destroy. Sans cleanup K8s → ENIs orphelins → destroy bloqué. Ce piège a directement inspiré le script de teardown ordonné des sprints suivants.
INC-012 : snapshot RDS non supprimé (coûts)
skip_final_snapshot = false créait un snapshot facturé même après destroy.
Leçon : en infra éphémère, skip_final_snapshot = true ; en production, false + gestion explicite des snapshots. Attention aux coûts cachés (snapshots, EBS, NAT).
Décisions d'architecture (ADRs)
| ADR | Décision | Résumé |
|---|---|---|
| 001 | RDS PostgreSQL Dev vs Prod | Paramétrage différencié (snapshots, multi-AZ, suppression) selon l'environnement |
| 002 | ECR Dev vs Prod | Stratégie de repository et lifecycle selon l'environnement |
| 003 | Terraform Orchestrator & lessons | Séparation persistent/ephemeral, règles de state (import, restructuration) |
| 004 | Migration passlib → bcrypt | Finalisation de la migration crypto initiée au Sprint 1 |
Rétrospective (reconstituée)
Ce qui a bien fonctionné. Le découpage en modules Terraform et la séparation persistent/ephemeral ont donné une infra reproductible et économique (monter/détruire à la demande), socle de tous les sprints suivants. Chaque incident a été transformé en règle d'exploitation (cleanup order, skip_final_snapshot, NAT obligatoire).
Ce qui a coûté du temps. Les pièges du state Terraform (lock, ressources hors state) et l'ordre de destruction (ENIs orphelins) ont chacun coûté des sessions, avec en plus la pression du coût AWS qui tourne. La restructuration en modules a révélé des ressources « invisibles » du nouveau state.
Ce que ça a appris. L'IaC ne pardonne pas l'à-peu-près sur le state et l'ordre des dépendances. Les leçons coût (NAT, snapshots) et cleanup (K8s avant destroy) sont devenues des réflexes systématiques, capitalisés dans les runbooks ultérieurs.
Sprint 2 fermé le 2026-06-13. L'infrastructure AWS est entièrement codée en Terraform, prête à accueillir le déploiement applicatif (Sprint 3).