Files
but3-iac/tp-terraform.md
ducreux 1ac4c47229 info
2025-12-04 09:52:04 +00:00

6.2 KiB

TP Terraform : Architecture modulaire 3-tiers sur GCP

Introduction

Dans ce TP, nous allons déployer une architecture trois tiers sur Google Cloud Platform (GCP) en utilisant une approche modulaire avec Terraform.

Cette architecture comprendra :

  • Une couche frontend exposée sur Internet
  • Une couche backend pour la logique métier
  • Une couche base de données
  • Une gestion des accès via IAM

Prérequis ✔️

  • Un compte Google Cloud Platform (GCP)
  • Terraform installé (v1.0.0 ou supérieure)
  • Google Cloud SDK installé et configuré
  • Un éditeur de texte (VSCode recommandé)
  • Une clé SSH (créée avec ssh-keygen -t ed25519)

Structure du Projet ✔️

Créez la structure de répertoires suivante :

tp-cloud/
└── terraform
    ├── environments/
    │   └── dev/
    │       ├── main.tf
    │       ├── variables.tf
    │       └── outputs.tf
    ├── modules/
    │   ├── network/
    │   │   ├── main.tf
    │   │   ├── variables.tf
    │   │   └── outputs.tf
    │   ├── compute/
    │   │   ├── main.tf
    │   │   ├── variables.tf
    │   │   └── outputs.tf
    │   └── iam/
    │       ├── main.tf
    │       ├── variables.tf
    │       └── outputs.tf
    └── templates/
        └── ansible.cfg.tpl

Partie 1 : Module Network ✔️

Step 1 : Variables du Module

Dans modules/network/variables.tf, définissez les variables :

# À vous de définir les variables pour :
# - project_name (string)
# - region (string)
# - frontend_cidr (string)
# - backend_cidr (string)
# - database_cidr (string)
# - ssh_source_ranges (string)

Step 2 : Ressources Réseau

Dans modules/network/main.tf, créez :

# À vous de créer :
# 1. Un VPC personnalisé avec auto_create_subnetworks = false
# 2. Trois sous-réseaux (frontend, backend, database)
# 3. Règles de firewall :
#    - HTTP/HTTPS vers frontend
#    - SSH vers toutes les instances
#    - Port 8000 de frontend vers backend
#    - Port 3306 de backend vers database

Step 3 : Outputs du Module

Dans modules/network/outputs.tf, exposez :

# À vous d'exposer :
# 1. L'ID du VPC
# 2. Les IDs des sous-réseaux sous forme de map

Partie 2 : Module Compute ✔️

Step 1 : Variables du Module

Dans modules/compute/variables.tf, définissez :

# À vous de définir les variables pour :
# - instance_type
# - zone
# - frontend_subnet_id
# - backend_subnet_id
# - database_subnet_id

Step 2 : Instances

Dans modules/compute/main.tf, créez :

# À vous de créer :

# 1. Instance frontend :
#    - Image : debian-11
#    - Disque : 10GB
#    - IP publique
#    - Tags : frontend, ssh
#    - OS Login enabled

# 2. Instance backend :
#    - Image : debian-11
#    - Disque : 10GB
#    - Pas d'IP publique (interne seulement)
#    - Tags : backend, ssh
#    - OS Login enabled

# 3. Instance database :
#    - Image : debian-11
#    - Disque : 20GB
#    - Pas d'IP publique
#    - Tags : database, ssh
#    - OS Login enabled

Step 3 : Outputs du Module

Dans modules/compute/outputs.tf, exposez :

# À vous d'exposer :
# 1. Les IPs internes de toutes les instances
# 2. L'IP publique du frontend
# 3. Les noms des instances

Partie 3 : Module IAM ✔️

Step 1 : Variables du Module

Dans modules/iam/variables.tf, définissez :

# À vous de définir :
# - project_id (string)

Step 2 : Configuration IAM

Dans modules/iam/main.tf, créez :

# À vous de créer :
# 1. Un compte de service pour Terraform
# 2. Une clé pour ce compte de service
# 3. Les rôles IAM nécessaires
# 4. La configuration OS Login avec votre clé SSH

Step 3 : Outputs du Module

Dans modules/iam/outputs.tf, exposez :

# À vous d'exposer :
# 1. L'email du compte de service
# 2. La clé du compte de service (sensitive = true)

Partie 4 : Configuration de l'Environnement ✔️

Step 1 : Variables d'Environnement

Dans environments/dev/variables.tf, définissez toutes les variables nécessaires avec des valeurs par défaut appropriées.

Step 2 : Configuration Principale

Dans environments/dev/main.tf, configurez :

# À vous de :
# 1. Configurer le provider google
# 2. Appeler les trois modules avec les bonnes variables
# 3. Créer le fichier de configuration Ansible (template)

Step 3 : Outputs

Dans environments/dev/outputs.tf, exposez les informations utiles des trois modules.


Validation et Tests ✔️

À chaque étape du développement :

  1. Initialisation : terraform init
  2. Validation : terraform fmt terraform validate
  3. Déploiement : terraform plan terraform apply

Critères de Validation

Votre implémentation sera validée sur :

  1. Structure Modulaire
    • Séparation claire des responsabilités
    • Réutilisabilité des modules
    • Gestion appropriée des dépendances
  2. Configuration Réseau
    • Segmentation appropriée
    • Règles de firewall cohérentes
    • Communication inter-tiers sécurisée
  3. Sécurité
    • OS Login correctement configuré
    • Accès SSH restreint
    • Principe du moindre privilège
  4. Qualité du Code
    • Nommage cohérent
    • Variables bien typées
    • Outputs pertinents

Bonus

Améliorations possibles :

  1. Réseau
    • Cloud NAT pour les instances privées ✔️
    • VPC Service Controls
    • Cloud Armor pour le frontend
  2. Compute
    • Custom metadata ✔️
    • Instance groups
    • Load balancer
  3. IAM
    • Custom roles ✔️
    • Workload Identity
    • Secret Manager

Nettoyage ✔️

À la fin du TP, n'oubliez pas de détruire les ressources : terraform destroy

Documentation Utile

  • Terraform GCP Provider
  • GCP Networking
  • GCP Compute Engine
  • GCP IAM

Conseils

  • Développez et testez chaque module individuellement.
  • Utilisez terraform console pour tester les expressions.
  • Documentez vos choix d'implémentation.
  • Utilisez des noms de ressources cohérents.