Module Terraform pour provisionner Cloud SQL PostgreSQL sur GCP, avec :
- IP privée (recommandé) ou publique (optionnelle, ACL contrôlées),
- Sauvegardes automatiques + PITR,
- HA optionnelle (
REGIONAL), - CMEK (KMS) optionnel,
- Validations de variables, outputs sensibles, labels FinOps.
- Sécurité par défaut : IP privée, suppression protégée, secrets sensibles, ACL explicites si IP publique.
- Résilience : backups quotidiens + Point-In-Time Recovery, HA REGIONAL pour prod critique, auto-resize disque.
- Portabilité : pas de
provider {}dans le module → le consumer (Terragrunt ou Terraform root) l’injecte. - Ergonomie : variables validées (regex/enum), sorties utiles (
connection_name, IPs), labels pour coût/ownership.
project_id,region,name,tier: aligné GCP (projet, région), nom conforme aux contraintes Cloud SQL, type machine explicite.
enable_private_ip(par défauttrue) +private_network: préférence IP privée pour Prod (trafic interne, IAM/Firewall maîtrisés).enable_public_ip+authorized_networks: utile pour Dev/POC, toujours restreint par CIDR (bastion / bureau).
app_passwordest sensitive ; s’il estnull, le module génère un password robuste viarandom_password.
👉 Recommandation : stocker/cycler le secret hors Terraform state (Secret Manager / Vault).
backup_enabled,backup_start_time,pitr_enabled: couche de base pour RPO faible.availability_type=REGIONALen Prod critique (failover AZ) ;ZONALpour Dev/QA.
labelspartout :env,owner,cost,service… pour le tri coût, les alertes, et l’asset inventory.deletion_protection = truepar défaut : anti-footgun en environnements persistants.
kms_key_name(CMEK) optionnel : répond aux exigences réglementaires (BYOK), sinon GMEK par défaut.
- Module sans provider (meilleure réutilisabilité ; le provider vient du consumer/Terragrunt).
- Validations de variables (regex noms, enums version/type) → fail fast.
- Outputs marqués
sensitivequand nécessaire (pas de fuite dans les logs/CI). - Séparation des responsabilités : le module n’installe pas Service Networking/VPC (module réseau dédié).
- Versionnement sémantique : tags
vX.Y.Z+ semantic-release → pin stable côté consumers (?ref=v1.0.0).
- Service Networking (IP privée) requis hors module : réseau et plages gérés par une autre équipe/module.
- Flags DB avancés non exposés par défaut (peuvent être ajoutés si besoin en
database_flagscadrés). - Réplicas non inclus (peut être ajouté comme sous-module ou ressource dédiée).
Le consumer (Terragrunt/Terraform root) injecte provider & remote state, puis :
module "db" {
source = "git::https://github.com/ORG/terraform-gcp-cloudsql-postgres.git?ref=v1.0.0"
project_id = var.project_id
region = var.region
name = "demo-db-dev"
database_version = "POSTGRES_16"
tier = "db-custom-2-7680"
enable_private_ip = true
private_network = "projects/PRJ/global/networks/SHARED-VPC"
}