Skip to content

kheuchi/terraform-gcp-cloudsql-postgres

Repository files navigation

terraform-gcp-cloudsql-postgres

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.

🎯 Objectifs & philosophie

  • 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.

🧠 Raisonnement de conception (variables & choix)

Entrées minimales

  • project_id, region, name, tier : aligné GCP (projet, région), nom conforme aux contraintes Cloud SQL, type machine explicite.

Réseau

  • enable_private_ip (par défaut true) + 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).

Sécurité & secrets

  • app_password est sensitive ; s’il est null, le module génère un password robuste via random_password.
    👉 Recommandation : stocker/cycler le secret hors Terraform state (Secret Manager / Vault).

Durabilité

  • backup_enabled, backup_start_time, pitr_enabled : couche de base pour RPO faible.
  • availability_type = REGIONAL en Prod critique (failover AZ) ; ZONAL pour Dev/QA.

Gouvernance & FinOps

  • labels partout : env, owner, cost, service… pour le tri coût, les alertes, et l’asset inventory.
  • deletion_protection = true par défaut : anti-footgun en environnements persistants.

Conformité

  • kms_key_name (CMEK) optionnel : répond aux exigences réglementaires (BYOK), sinon GMEK par défaut.

✅ Bonnes pratiques appliquées

  • 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 sensitive quand 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).

🔒 Limites & périmètre volontairement réduit

  • 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_flags cadrés).
  • Réplicas non inclus (peut être ajouté comme sous-module ou ressource dédiée).

🚀 Utilisation (exemple rapide)

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"
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages