đ„ Quick Reference â 6 Incidents Critiques
Sauvé ma vie plusieurs fois. Si tu as 2 minutes, lis ça.
INC-001 : Variable GitLab CI Protected sur feature branch
Le problĂšme : Tu crĂ©es une variable SECRET_KEY avec "Protected" â
, la mets dans une feature branch, et... elle n'est pas injectĂ©e ! đ€Š
Error: pydantic_core.ValidationError: SECRET_KEY Field required
Pourquoi :
- Protected = injecté uniquement sur branches protégées (main, develop)
- Feature branch = pas protĂ©gĂ©e â variable pas disponible
Fix (30 secondes) :
Settings â CI/CD â Variables â SECRET_KEY
â Protected â â Masked
RĂšgle d'or :
Protected = production secrets SEULEMENT
Masked = cache la valeur dans les logs (suffisant pour feature branches)
INC-002 : Pydantic BaseSettings lit .env avant env vars
Le problĂšme : Docker Compose â DB_HOSTNAME=db injected dans le container, mais ton app se connecte Ă localhost:5432... qui n'existe pas en Docker ! đ„
Connection refused: localhost:5432
Pourquoi :
Pydantic BaseSettings priorité :
1. Fichier .env (HAUTE) â .env a DB_HOSTNAME=localhost
2. Variables d'environnement (BASSE)
Le fichier .env écrase tout !
Fix :
# Créer .env.docker (séparé, pour Docker uniquement)
DB_HOSTNAME=db
RĂšgle d'or :
.env = dev local (localhost)
.env.docker = dev Docker Compose (db)
En CI/CD = pas de fichier .env (variables injectées)
INC-005 : python-jose = CRITICAL CVE (algorithm confusion)
Le problĂšme : Tu utilises python-jose pour JWT, Trivy donne :
CRITICAL: python-jose algorithm confusion with ECDSA keys
CVE-2024-33663 (no fix available)
Et le projet python-jose est abandonnĂ© depuis 2023 ! đ
Fix :
# requirements.in
- python-jose
+ PyJWT >= 2.12.0
# app/oauth2.py
- from jose import JWTError
+ from jwt.exceptions import InvalidTokenError
RĂšgle d'or :
Avant d'utiliser une lib : vérifier
- DerniĂšre release (< 1 an)
- Issues ouvertes (pas 500+)
- Mainteneurs actifs (Slack/Discord)
Outils : deps.dev, snyk advisor, PyPI stats
INC-010 : EKS Node Group bloqué sans NAT Gateway (27+ min)
Le problĂšme : terraform apply lance, les nodes EKS prennent 27+ minutes Ă crĂ©er et finissent par Ă©chouer. đŽ
module.eks.aws_eks_node_group.main: Still creating... [27m36s elapsed]
Error: nodes cannot reach Amazon ECR (internet access required)
Pourquoi :
EKS nodes doivent télécharger images Docker depuis ECR
Sans NAT Gateway â pas d'internet dans la VPC privĂ©e
Nodes essaient de démarrer, timeout, échec.
Fix :
# terraform/ephemeral/vpc.tf
resource "aws_nat_gateway" "main" {
allocation_id = aws_eip.nat.id
subnet_id = aws_subnet.public.*.id[0]
}
# Et modifier la route table privée
route {
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.main.id
}
RĂšgle d'or :
EKS avec subnets privés = NAT Gateway OBLIGATOIRE
Pas de NAT = nodes bloqués, services impossibles à déployer
Coût : ~0.045$/h (à destroy le soir !)
INC-025 : Variables projet CI/CD écrasent variables YAML
Le problĂšme : Tu dĂ©finis AWS_ACCESS_KEY_ID dans .gitlab-ci.yml, mais tu as aussi créé une variable projet dans Settings â CI/CD â Variables. La variable projet gagne ! đ±
variables:
AWS_ACCESS_KEY_ID: $AWS_INFRA_ACCESS_KEY_ID # écrasée !
# La variable projet Settings â CI/CD â Variables gagne
Fix :
jobs:
infra-start:
before_script:
- export AWS_ACCESS_KEY_ID=$AWS_INFRA_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$AWS_INFRA_SECRET_ACCESS_KEY
PrioritĂ© GitLab CI (haute â basse) :
1. Variables Trigger/Schedule
2. Settings â CI/CD â Variables (projet) â TRĂS haute !
3. Variables fichier YAML
4. Variables groupe
RĂšgle d'or :
Si tu dois utiliser des secrets différents (gitlab_ci vs gitlab_ci_infra)
â TOUJOURS utiliser before_script export pour forcer
â Jamais compter sur les variables YAML seules
INC-044 : RĂ©gression lib Python kubernetes 36.0.0 â bootstrap 401
Le problĂšme : Ansible kubernetes.core renvoie 401 Unauthorized sur toutes les tasks, alors que kubectl get nodes passe juste avant avec les mĂȘmes credentials. đ€Ż
kubernetes.client.exceptions.UnauthorizedException: (401)
Reason: Unauthorized
Pourquoi :
Le client Python kubernetes 36.0.0 a une régression qui casse l'auth EKS.
Le MĂME token marche en kubectl ET curl brut (HTTP 200), mais le client v36 â 401.
Sur Alpine ET Ubuntu. pip install kubernetes (non pinné) tirait la 36 ;
une version antérieure marchait 4 jours avant.
Diagnostic (élimination méthodique) :
token â curl brut HTTP 200 â
(token valide)
identitĂ© â kubectl auth whoami = bon user â
OS â Ă©choue sur Ubuntu aussi â (pas Alpine)
version â kubernetes==31.0.0 â
/ 36.0.0 â â LA cause
Fix (1 ligne) :
- pip3 install kubernetes pyyaml --break-system-packages
+ pip3 install kubernetes==31.0.0 pyyaml --break-system-packages
RĂšgle d'or :
Pinner les versions des libs critiques en CI.
pip install <lib> sans version = une release upstream peut casser
l'infra du jour au lendemain, sans aucun changement de ton cÎté.
i/o timeout = réseau/CIDR | 401 = auth | 403 = autorisation
đ Cheatsheet
| Incident | Quand ça arrive | Fix rapide |
|---|---|---|
| INC-001 | Feature branch + Protected var | DĂ©sactiver Protected â Masked |
| INC-002 | Docker Compose connection error | Créer .env.docker |
| INC-005 | Trivy CRITICAL JWT | pip install PyJWT >= 2.12.0 |
| INC-010 | EKS nodes timeout 27+ min | Ajouter NAT Gateway Terraform |
| INC-025 | Credentials écrasées en CI | Utiliser before_script export |
| INC-031 | AmazonEKSClusterPolicy sur un user | Policy custom eks:DescribeCluster uniquement |
| INC-032 | eks:DescribeCluster manquant gitlab-ci | Ajouter EKSConnect Ă policy ecr_push |
| INC-033 | kubectl cluster-info forbidden | Remplacer par kubectl auth can-i -n fastapi |
| INC-035 | Init:InvalidImageName ${ECR_IMAGE} | yum install gettext + envsubst | kubectl apply |
| INC-036 | DB_PASSWORD manquant dans secret | Ajouter TF_VAR_db_password au secret K8s |
| INC-038 | State lock = AccessDenied youss_admin | Terraform = iamadmin uniquement |
| INC-039 | Hardening absent du cluster (deploy fichier par fichier) | kubectl apply -k k8s/base/ + kustomize set image |
| INC-040 | terraform apply : accent dans description de SG | Descriptions SG en anglais ASCII |
| INC-041 | kubectl i/o timeout sur l'API EKS | default: tags [ubuntu] (runner self-hosted, IP dans CIDR) |
| INC-044 | bootstrap 401 (kubectl OK) | pip install kubernetes==31.0.0 (régression v36) |
| INC-045 | PSA absent sur EKS (deploy ne peut patcher le ns) | Bootstrap crée le ns avec labels PSA, deploy ne gÚre plus le ns |
| INC-046 | NetworkPolicy non enforced sur EKS (sortie port 80 OK) | VPC CNI en addon managé + enableNetworkPolicy=true (#55) |
đ Si tu cherches un incident spĂ©cifique
â Utilise Rechercher (đ en haut Ă droite) â Explore les Sprints par chronologie
Bon courage ! đ