From 84d78b69e1330aa0471001b62de08e451ddec0a5 Mon Sep 17 00:00:00 2001 From: kara-mosr Date: Wed, 3 Dec 2025 16:06:54 +0100 Subject: [PATCH] ajout des configs terraform --- terraform/environments/dev/main.tf | 19 +++----- terraform/environments/dev/outputs.tf | 7 +-- terraform/environments/dev/variables.tf | 63 +++++++++++++++++++++---- terraform/modules/compute/main.tf | 17 +++---- terraform/modules/iam/main.tf | 24 ++-------- terraform/modules/iam/outputs.tf | 5 +- terraform/modules/network/main.tf | 18 ++----- 7 files changed, 76 insertions(+), 77 deletions(-) diff --git a/terraform/environments/dev/main.tf b/terraform/environments/dev/main.tf index 31c2879..eb73f42 100644 --- a/terraform/environments/dev/main.tf +++ b/terraform/environments/dev/main.tf @@ -1,4 +1,3 @@ -# Configuration Provider terraform { required_providers { google = { @@ -13,7 +12,6 @@ provider "google" { region = var.region } -# 1. Appel du Module IAM (pour configurer l'accès avant de créer les VMs) module "iam" { source = "../../modules/iam" @@ -22,7 +20,6 @@ module "iam" { ssh_public_key = var.ssh_public_key } -# 2. Appel du Module Network module "network" { source = "../../modules/network" @@ -34,11 +31,9 @@ module "network" { ssh_source_ranges = var.ssh_source_ranges } -# 3. Appel du Module Compute module "compute" { source = "../../modules/compute" - # Dépendances du module network frontend_subnet_id = module.network.subnets_map.frontend backend_subnet_id = module.network.subnets_map.backend database_subnet_id = module.network.subnets_map.database @@ -46,23 +41,21 @@ module "compute" { project_id = var.project_id instance_type = var.instance_type zone = var.zone - # Assurez-vous que l'IAM est configuré avant de créer les instances + depends_on = [module.iam] } -# 4. Créer le fichier de configuration Ansible (template) -# C'est un bloc data pour lire le template data "template_file" "ansible_cfg_tpl" { template = file("../../templates/ansible.cfg.tpl") vars = { - frontend_ip = module.compute.internal_ips.frontend - backend_ip = module.compute.internal_ips.backend - database_ip = module.compute.internal_ips.database + # On utilise les IPs internes pour les deux tiers privés + frontend_public_ip = module.compute.frontend_public_ip + backend_ip = module.compute.internal_ips.backend + database_ip = module.compute.internal_ips.database } } -# C'est une ressource pour écrire le fichier final (inventaire Ansible) resource "local_file" "ansible_inventory" { content = data.template_file.ansible_cfg_tpl.rendered - filename = "ansible-inventory.cfg" # Crée le fichier dans environments/dev + filename = "ansible-inventory.cfg" } \ No newline at end of file diff --git a/terraform/environments/dev/outputs.tf b/terraform/environments/dev/outputs.tf index c9c5646..ca0746f 100644 --- a/terraform/environments/dev/outputs.tf +++ b/terraform/environments/dev/outputs.tf @@ -1,6 +1,3 @@ -# environments/dev/outputs.tf - -# IPs publiques et internes pour l'accès et Ansible output "frontend_public_ip" { description = "IP publique du Frontend pour les tests HTTP/HTTPS." value = module.compute.frontend_public_ip @@ -11,11 +8,9 @@ output "internal_ips" { value = module.compute.internal_ips } -# Information OS Login output "gcp_user_for_ssh" { description = "Nom d'utilisateur pour se connecter en SSH via OS Login." - # Utilise une fonction de regex pour extraire le nom d'utilisateur avant le '@' de l'email - value = regex("^(.*)@", var.gcp_user_email)[0] + value = regex("^(.*)@", var.gcp_user_email)[0] } output "service_account_email" { diff --git a/terraform/environments/dev/variables.tf b/terraform/environments/dev/variables.tf index e8dadab..d7d2a65 100644 --- a/terraform/environments/dev/variables.tf +++ b/terraform/environments/dev/variables.tf @@ -1,13 +1,56 @@ -output "service_account_email" { - description = "L'email du compte de service créé." - value = google_service_account.terraform_sa.email +variable "project_id" { + description = "L'ID du projet GCP." + type = string } -/* -# Décommentez si vous avez créé la clé -output "service_account_key" { - description = "La clé privée encodée du compte de service." - value = google_service_account_key.terraform_sa_key.private_key_base64 - sensitive = true # Marquer comme sensible +variable "region" { + description = "Région de déploiement." + type = string + default = "europe-west1" } -*/ \ No newline at end of file + +variable "zone" { + description = "Zone de déploiement." + type = string + default = "europe-west1-b" +} + +variable "instance_type" { + description = "Type de machine pour les instances." + type = string + default = "e2-small" +} + +variable "frontend_cidr" { + description = "Plage CIDR du frontend." + type = string + default = "10.10.1.0/24" +} + +variable "backend_cidr" { + description = "Plage CIDR du backend." + type = string + default = "10.10.2.0/24" +} + +variable "database_cidr" { + description = "Plage CIDR de la base de données." + type = string + default = "10.10.3.0/24" +} + +variable "ssh_source_ranges" { + description = "Plages CIDR autorisées pour l'accès SSH." + type = list(string) + default = ["0.0.0.0/0"] +} + +variable "gcp_user_email" { + description = "Votre adresse e-mail GCP (pour OS Login)." + type = string +} + +variable "ssh_public_key" { + description = "Votre clé publique SSH (contenu du fichier ~/.ssh/id_ed25519.pub)." + type = string +} \ No newline at end of file diff --git a/terraform/modules/compute/main.tf b/terraform/modules/compute/main.tf index e9dd677..75b938f 100644 --- a/terraform/modules/compute/main.tf +++ b/terraform/modules/compute/main.tf @@ -1,19 +1,17 @@ -# Définition du disque de démarrage locals { disk_config = { frontend = 10 backend = 10 - database = 20 # 20GB pour la base de données + database = 20 } } -# Instance Frontend (publique) resource "google_compute_instance" "frontend_instance" { project = var.project_id name = "frontend-instance" machine_type = var.instance_type zone = var.zone - tags = ["frontend", "ssh"] # Tags pour les règles de firewall + tags = ["frontend", "ssh"] boot_disk { initialize_params { @@ -24,18 +22,16 @@ resource "google_compute_instance" "frontend_instance" { network_interface { subnetwork = var.frontend_subnet_id - # Configuration IP publique access_config { - # Laissez vide pour IP éphémère + # IP publique (éphémère) } } metadata = { - enable-oslogin = "TRUE" # OS Login enabled + enable-oslogin = "TRUE" } } -# Instance Backend (privée) resource "google_compute_instance" "backend_instance" { project = var.project_id name = "backend-instance" @@ -52,7 +48,7 @@ resource "google_compute_instance" "backend_instance" { network_interface { subnetwork = var.backend_subnet_id - # PAS de bloc access_config pour n'avoir qu'une IP interne + # Pas de bloc access_config pour IP interne seulement } metadata = { @@ -60,7 +56,6 @@ resource "google_compute_instance" "backend_instance" { } } -# Instance Database (privée) resource "google_compute_instance" "database_instance" { project = var.project_id name = "database-instance" @@ -77,7 +72,7 @@ resource "google_compute_instance" "database_instance" { network_interface { subnetwork = var.database_subnet_id - # PAS de bloc access_config pour n'avoir qu'une IP interne + # Pas de bloc access_config pour IP interne seulement } metadata = { diff --git a/terraform/modules/iam/main.tf b/terraform/modules/iam/main.tf index 2bf9a64..78c980b 100644 --- a/terraform/modules/iam/main.tf +++ b/terraform/modules/iam/main.tf @@ -1,47 +1,29 @@ -# 1. Compte de service pour Terraform resource "google_service_account" "terraform_sa" { project = var.project_id account_id = var.service_account_name display_name = "Terraform Deployment SA" } -# Rôles nécessaires pour le déploiement de l'architecture -# Ces rôles doivent être adaptés au principe du moindre privilège resource "google_project_iam_member" "sa_roles" { for_each = toset([ - "roles/compute.admin", # Pour créer les VMs, VPCs, Firewalls - "roles/iam.serviceAccountUser", # Pour utiliser le SA - "roles/resourcemanager.projectIamAdmin" # Pour gérer les rôles (si nécessaire) + "roles/compute.admin", + "roles/iam.serviceAccountUser" ]) project = var.project_id role = each.key member = "serviceAccount:${google_service_account.terraform_sa.email}" } -# 2. Clé pour ce compte de service (nécessaire si vous voulez l'utiliser hors de la VM) -# ATTENTION : En général, il est préférable d'utiliser Workload Identity ou l'identité de la VM. -# Pour le TP, nous allons seulement créer la SA et les rôles. La clé n'est pas nécessaire si vous utilisez gcloud auth application-default login. -# Si une clé est requise pour le TP, décommentez ceci : -/* -resource "google_service_account_key" "terraform_sa_key" { - service_account_id = google_service_account.terraform_sa.name - public_key_type = "TYPE_X509_PEM_FILE" -} -*/ - -# 3. Configuration OS Login et 4. Clé SSH -# Attribution des rôles OS Login à votre utilisateur resource "google_project_iam_member" "oslogin_roles" { for_each = toset([ "roles/compute.osLogin", - "roles/iam.serviceAccountUser" # Requis si vous utilisez un SA pour l'accès + "roles/iam.serviceAccountUser" ]) project = var.project_id role = each.key member = "user:${var.gcp_user_email}" } -# Ajout de la clé SSH à votre compte GCP pour OS Login resource "google_os_login_ssh_public_key" "user_ssh_key" { user = var.gcp_user_email key = var.ssh_public_key diff --git a/terraform/modules/iam/outputs.tf b/terraform/modules/iam/outputs.tf index edc73a0..31382af 100644 --- a/terraform/modules/iam/outputs.tf +++ b/terraform/modules/iam/outputs.tf @@ -1,11 +1,10 @@ -# modules/iam/outputs.tf - output "service_account_email" { description = "L'email du compte de service créé." value = google_service_account.terraform_sa.email } -/* # Si vous aviez décommenté la clé du compte de service : +# La clé n'est pas exposée ici mais l'output est là pour l'exercice (décommenter si nécessaire) +/* output "service_account_key" { description = "La clé privée encodée du compte de service." value = google_service_account_key.terraform_sa_key.private_key_base64 diff --git a/terraform/modules/network/main.tf b/terraform/modules/network/main.tf index 22d727d..fe75583 100644 --- a/terraform/modules/network/main.tf +++ b/terraform/modules/network/main.tf @@ -1,12 +1,10 @@ -# 1. VPC personnalisé resource "google_compute_network" "vpc_network" { project = var.project_id name = "three-tier-vpc" - auto_create_subnetworks = false # Exigence respectée + auto_create_subnetworks = false routing_mode = "REGIONAL" } -# 2. Sous-réseaux (frontend, backend, database) resource "google_compute_subnetwork" "frontend_subnet" { project = var.project_id name = "frontend-subnet" @@ -31,16 +29,13 @@ resource "google_compute_subnetwork" "database_subnet" { network = google_compute_network.vpc_network.id } -# 3. Règles de firewall (4 règles) - -# Règle 1: HTTP/HTTPS vers frontend (80, 443) resource "google_compute_firewall" "allow_web" { project = var.project_id name = "allow-http-https-frontend" network = google_compute_network.vpc_network.name direction = "INGRESS" source_ranges = ["0.0.0.0/0"] - target_tags = ["frontend"] + target_tags = ["frontend"] allow { protocol = "tcp" @@ -48,14 +43,13 @@ resource "google_compute_firewall" "allow_web" { } } -# Règle 2: SSH vers toutes les instances (22) resource "google_compute_firewall" "allow_ssh" { project = var.project_id name = "allow-ssh-all" network = google_compute_network.vpc_network.name direction = "INGRESS" source_ranges = var.ssh_source_ranges - target_tags = ["ssh"] + target_tags = ["ssh"] allow { protocol = "tcp" @@ -63,14 +57,13 @@ resource "google_compute_firewall" "allow_ssh" { } } -# Règle 3: Port 8000 de frontend vers backend resource "google_compute_firewall" "allow_frontend_to_backend" { project = var.project_id name = "allow-frontend-to-backend-8000" network = google_compute_network.vpc_network.name direction = "INGRESS" source_tags = ["frontend"] - target_tags = ["backend"] + target_tags = ["backend"] allow { protocol = "tcp" @@ -78,14 +71,13 @@ resource "google_compute_firewall" "allow_frontend_to_backend" { } } -# Règle 4: Port 3306 de backend vers database resource "google_compute_firewall" "allow_backend_to_database" { project = var.project_id name = "allow-backend-to-database-3306" network = google_compute_network.vpc_network.name direction = "INGRESS" source_tags = ["backend"] - target_tags = ["database"] + target_tags = ["database"] allow { protocol = "tcp"