forked from pierront/but3-iac
chore: Add initial project scaffolding for Terraform-based GCP IaC
This commit is contained in:
281
tp-terraform.md
Normal file
281
tp-terraform.md
Normal file
@@ -0,0 +1,281 @@
|
||||
# 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 :
|
||||
|
||||
```text
|
||||
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 :
|
||||
|
||||
```terraform
|
||||
# À 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 :
|
||||
|
||||
```terraform
|
||||
# À 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 :
|
||||
|
||||
```terraform
|
||||
# À 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 :
|
||||
|
||||
```terraform
|
||||
# À 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 :
|
||||
|
||||
```terraform
|
||||
# À 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 :
|
||||
|
||||
```terraform
|
||||
# À 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 :
|
||||
|
||||
```terraform
|
||||
# À vous de définir :
|
||||
# - project_id (string)
|
||||
```
|
||||
|
||||
### Step 2 : Configuration IAM
|
||||
|
||||
Dans `modules/iam/main.tf`, créez :
|
||||
|
||||
```terraform
|
||||
# À 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 :
|
||||
|
||||
```terraform
|
||||
# À 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 :
|
||||
|
||||
```terraform
|
||||
# À 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.
|
||||
Reference in New Issue
Block a user