From cfeee8df7f1eb277d5e318b4baf4e3770da52f6b Mon Sep 17 00:00:00 2001 From: James Boutaric Date: Thu, 4 Dec 2025 10:15:36 +0100 Subject: [PATCH] . --- .DS_Store | Bin 6148 -> 6148 bytes iam-step.md | 90 --------------------- terraform/environments/dev/main.tf | 18 +++++ terraform/environments/dev/variables.tf | 33 +++++--- terraform/modules/compute/main.tf | 52 ++++++++----- terraform/modules/compute/outputs.tf | 7 +- terraform/modules/compute/variables.tf | 30 +++---- terraform/modules/iam/main.tf | 33 ++++++++ terraform/modules/iam/outputs.tf | 20 +++-- terraform/modules/iam/variables.tf | 7 ++ terraform/modules/network/main.tf | 99 ++++++++++++------------ terraform/modules/network/outputs.tf | 22 +++--- terraform/modules/network/variables.tf | 23 +++--- 13 files changed, 220 insertions(+), 214 deletions(-) delete mode 100644 iam-step.md diff --git a/.DS_Store b/.DS_Store index 560cb68863bea8b803a594ba3a51ce1c92fe7da1..beacb0c233ea2c6a50c2ae7cc3378245438fcf00 100644 GIT binary patch delta 91 zcmZoMXfc=|#>CJzu~2NHo}wrt0|Nsi1A_nqLjgk`L%L^9esWUI#6opO#>uN#3^$8$ u2(oN!uw>rM&cV;Y#L%``kmEb^WPTA{PLRd}3=9kmlWlmUH^+!9VFm!tLlo2i literal 6148 zcmZQzU|@7AO)+F(5MW?n;9!8zEL;p&0Z1N%F(jFwBAg)ez-E*%=rR;DWH6*Mq(bFJ zsnHM^4S~TM0-(Gr!H^8jvxyAI`4_}4VMt{tVklxrWJqJkXDDLGWzb{DWk~VN$xlwo z$xnh79Ge&z81(*w0obGB4CxFx4EYR642cXm47v=73`JlYG8sVTB{P&Tlrj`Cq%!C+ z6fop5q@$X~sDx%3J3}TzE<-wY)eKGy3=H$YR{sav%?VW<&tQmM2je6(^AS3XuL4>U^E0^A;1h_2!QH;R|W=L z{eOt6QF1f{Mnhm&h5#drORx*5BMq%vF+2&XYeDsC0#pX14pbd8g6d^(We#ZwfTWoq m1BwzLHV88^Fo3jzs(o-(%*en1(mL7@00qt{9u0v33IPC)i;?O8 diff --git a/iam-step.md b/iam-step.md deleted file mode 100644 index e9d2992..0000000 --- a/iam-step.md +++ /dev/null @@ -1,90 +0,0 @@ -# TP : Gestion des Identités (IAM) et Accès SSH - -Dans cette partie, vous allez configurer les accès pour que Terraform puisse interagir avec le projet et pour que vous puissiez vous connecter aux futures machines virtuelles. - -## Objectifs -1. Créer une identité machine (Service Account). -2. Lui donner des droits sur le projet. -3. Configurer votre propre clé SSH via le service **OS Login** de GCP. - ---- - -## Étape 1 : Créer l'identité machine -**Objectif :** Créer un compte de service (Service Account) qui sera utilisé par nos scripts d'automatisation. - -* **Ressource à utiliser :** `google_service_account` -* **Consignes :** - * Donnez-lui l'ID `terraform`. - * Ajoutez un `display_name` explicite pour qu'on le reconnaisse dans la console GCP. - -## Étape 2 : Générer une clé d'accès -**Objectif :** Pour utiliser ce compte de service depuis l'extérieur (ou via Terraform), nous avons besoin d'une clé. - -* **Ressource à utiliser :** `google_service_account_key` -* **Consignes :** - * Vous devez lier cette ressource au compte de service créé à l'étape 1 via son attribut `name` (ex: `google_service_account.votre_nom.name`). - * Définissez le type de clé publique sur `"TYPE_X509_PEM_FILE"`. - -## Étape 3 : Donner des droits (IAM) -**Objectif :** Un compte de service naît sans aucun droit. Vous devez lui donner le rôle de "Viewer" sur le projet pour qu'il puisse lire les ressources. - -* **Ressource à utiliser :** `google_project_iam_binding` -* **Consignes :** - * **Project :** Utilisez votre variable `var.project_id`. - * **Role :** Le rôle cible est `"roles/viewer"`. - * **Members :** C'est une liste. Attention à la syntaxe spécifique GCP pour désigner un membre : `"serviceAccount:..."`. Vous devez concaténer ce préfixe avec l'email du service account créé à l'étape 1 (`.email`). - -## Étape 4 : Récupérer votre identité -**Objectif :** Terraform doit savoir "qui" lance le script actuellement pour associer la clé SSH à la bonne personne. - -* **Data Source à utiliser :** `data "google_client_openid_userinfo"` -* **Consignes :** - * Déclarez simplement ce bloc `data` avec le nom `me`. Il n'a pas besoin d'arguments à l'intérieur. Il servira juste à récupérer votre email dynamiquement. - -## Étape 5 : Ajouter votre clé SSH (OS Login) -**Objectif :** Uploader votre clé publique SSH locale vers GCP pour permettre la connexion aux VMs sans gestion manuelle. - -* **Ressource à utiliser :** `google_os_login_ssh_public_key` -* **Consignes :** - * **User :** Utilisez l'email récupéré grâce au data source de l'étape 4 (`.email`). - * **Key :** Vous devez lire le contenu de votre fichier de clé publique locale. - * **Fonction Terraform :** Utilisez la fonction `file("chemin/vers/la/clé")`. - * **Chemin recommandé :** `~/.ssh/id_ed25519.pub`. - -> **Attention :** Vérifiez impérativement que vous avez bien généré une clé SSH sur votre poste local avant de lancer le `terraform apply`. Sinon, Terraform ne trouvera pas le fichier et plantera. - ---- - -### Résumé des liens entre ressources -Assurez-vous que vos ressources se référencent correctement : -* La **Clé** référencie le **Service Account**. -* L'**IAM Binding** référencie le **Service Account**. -* L'**OS Login** référencie le **Data User Info**. - -Voici la suite du document Markdown (MD) à ajouter à la suite de l'étape 5. - ---- - -## Étape 6 : Exposer les résultats (Outputs) - -**Objectif :** Une fois le déploiement terminé, Terraform masque par défaut certaines informations. Nous devons définir explicitement quelles valeurs nous voulons voir ou récupérer (notamment pour les utiliser dans d'autres scripts). - - * **Fichier à utiliser :** `outputs.tf` (c'est une bonne pratique de séparer les outputs du `main.tf`). - -### Consigne A : L'email du Service Account - -Nous aurons besoin de connaître l'adresse email complète générée par Google pour ce compte. - - * Créez un output nommé `service_account_email`. - * Dans la valeur (`value`), référencez l'attribut `.email` de la ressource créée à l'**Étape 1**. - -### Consigne B : La Clé Privée (Attention Sécurité) - -Nous devons récupérer la clé privée générée pour pouvoir authentifier des applications externes. - - * Créez un output nommé `service_account_key`. - * Dans la valeur, référencez l'attribut `.private_key` de la ressource créée à l'**Étape 2**. - * **Important :** Terraform refusera d'afficher cette valeur ou l'affichera en clair dans vos logs si vous ne faites pas attention. Vous **devez** ajouter l'argument suivant dans ce bloc output pour masquer la valeur dans le terminal : - ```hcl - sensitive = true - ``` diff --git a/terraform/environments/dev/main.tf b/terraform/environments/dev/main.tf index 2134366..a45ecf4 100644 --- a/terraform/environments/dev/main.tf +++ b/terraform/environments/dev/main.tf @@ -1,3 +1,8 @@ +# À 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) + terraform { required_providers { google = { @@ -20,5 +25,18 @@ module "network" { backend_cidr = var.backend_cidr database_cidr = var.database_cidr ssh_source_ranges = var.ssh_source_ranges +} +module "compute" { + source = "../../modules/compute" + instance_type = var.instance_type + zone = var.zone + frontend_subnet_id = module.network.subnets.frontend + backend_subnet_id = module.network.subnets.backend + database_subnet_id = module.network.subnets.database +} + +module "iam" { + source = "../../modules/iam" + project_id = var.project_id } \ No newline at end of file diff --git a/terraform/environments/dev/variables.tf b/terraform/environments/dev/variables.tf index 1d68642..242ce02 100644 --- a/terraform/environments/dev/variables.tf +++ b/terraform/environments/dev/variables.tf @@ -1,13 +1,14 @@ -# Commentaire +# définissez toutes les variables nécessaires avec des valeurs par défaut appropriées. + variable "project_name" { + description = "Nom du projet" type = string - description = "but3-iac" - default = "Automaticsearch" + default = "My First Project" } variable "region" { + description = "Region du projet" type = string - description = "Région dans laquelle déployer les ressources" default = "europe-west9" } @@ -30,17 +31,25 @@ variable "database_cidr" { } variable "ssh_source_ranges" { + description = "" type = string - description = "Plages d’adresses autorisées à se connecter en SSH" - default = "0.0.0.0/0" - + default = "0.0.0.0/0" } +variable "project_id" { + description = "ID du projet" + type = string + default = "plenary-plane-478713-q1" +} -variable "project_id"{ - description = "id du projet" - type = string - default = "plenary-plane-478713-q1" - +variable "instance_type" { + description = "type de l'instance" + type = string + default = "e2-small" +} +variable "zone" { + description = "Nom de la zone" + type = string + default = "europe-west9-b" } \ No newline at end of file diff --git a/terraform/modules/compute/main.tf b/terraform/modules/compute/main.tf index 684e549..306f3c3 100644 --- a/terraform/modules/compute/main.tf +++ b/terraform/modules/compute/main.tf @@ -1,5 +1,28 @@ +# À 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 + resource "google_compute_instance" "vm_frontend" { - name = "frontend-instance" + name = "vm-frontend" machine_type = var.instance_type zone = var.zone @@ -10,14 +33,12 @@ resource "google_compute_instance" "vm_frontend" { } } - network_interface { + access_config {} # IP publique subnetwork = var.frontend_subnet_id - - access_config {} } - tags= ["frontend", "ssh"] + tags = ["frontend", "ssh"] metadata = { enable-oslogin = "TRUE" @@ -25,7 +46,7 @@ resource "google_compute_instance" "vm_frontend" { } resource "google_compute_instance" "vm_backend" { - name = "backend-instance" + name = "vm-backend" machine_type = var.instance_type zone = var.zone @@ -36,24 +57,21 @@ resource "google_compute_instance" "vm_backend" { } } - network_interface { subnetwork = var.backend_subnet_id - } - tags = ["backend", "ssh"] + tags = ["backend", "ssh"] - metadata = { - enable-oslogin = "TRUE" - } + metadata = { + enable-oslogin = "TRUE" + } } resource "google_compute_instance" "vm_database" { - name = "database-instance" + name = "vm-database" machine_type = var.instance_type zone = var.zone - boot_disk { initialize_params { @@ -62,15 +80,13 @@ resource "google_compute_instance" "vm_database" { } } - network_interface { subnetwork = var.database_subnet_id - } - tags = ["database", "ssh"] + tags = ["database", "ssh"] metadata = { enable-oslogin = "TRUE" } -} +} \ No newline at end of file diff --git a/terraform/modules/compute/outputs.tf b/terraform/modules/compute/outputs.tf index 58c6d07..e685448 100644 --- a/terraform/modules/compute/outputs.tf +++ b/terraform/modules/compute/outputs.tf @@ -1,3 +1,8 @@ +# À vous d'exposer : +# 1. Les IPs internes de toutes les instances +# 2. L'IP publique du frontend +# 3. Les noms des instances + output "ip_internes" { value = { frontend = google_compute_instance.vm_frontend.network_interface[0].network_ip @@ -16,4 +21,4 @@ output "nom_instances" { backend = google_compute_instance.vm_backend.name database = google_compute_instance.vm_database.name } -} \ No newline at end of file +} diff --git a/terraform/modules/compute/variables.tf b/terraform/modules/compute/variables.tf index 4dabcfc..07ab6ea 100644 --- a/terraform/modules/compute/variables.tf +++ b/terraform/modules/compute/variables.tf @@ -1,27 +1,31 @@ +# À vous de définir les variables pour : +# - instance_type +# - zone +# - frontend_subnet_id +# - backend_subnet_id +# - database_subnet_id + variable "instance_type" { - description = "Type de machine à utiliser pour les instances" - type = string - + description = "type de l'instance" + type = string } variable "zone" { - description = "Zone où déployer les instances" - type = string + description = "Nom de la zone" + type = string } variable "frontend_subnet_id" { - description = "ID du sous-réseau frontend" - type = string + description = "id du frontend" + type = string } variable "backend_subnet_id" { - description = "ID du sous-réseau backend" - type = string + description = "id du backend" + type = string } variable "database_subnet_id" { - description = "ID du sous-réseau database" - type = string + description = "id du database" + type = string } - - diff --git a/terraform/modules/iam/main.tf b/terraform/modules/iam/main.tf index e69de29..eeafaa7 100644 --- a/terraform/modules/iam/main.tf +++ b/terraform/modules/iam/main.tf @@ -0,0 +1,33 @@ +# À 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 + +resource "google_service_account" "service_account" { + account_id = "terraform" + display_name = "terraform" +} + +resource "google_service_account_key" "mykey" { + service_account_id = google_service_account.service_account.name + public_key_type = "TYPE_X509_PEM_FILE" +} + +resource "google_project_iam_binding" "custom_service_account" { + project = var.project_id + role = "roles/viewer" + + members = [ + "serviceAccount:${google_service_account.service_account.email}", + ] +} + +data "google_client_openid_userinfo" "me" { +} + +resource "google_os_login_ssh_public_key" "cache" { + user = data.google_client_openid_userinfo.me.email + key = file("~/.ssh/id_ed25519.pub") + project = var.project_id +} \ No newline at end of file diff --git a/terraform/modules/iam/outputs.tf b/terraform/modules/iam/outputs.tf index 91f33d3..48866d1 100644 --- a/terraform/modules/iam/outputs.tf +++ b/terraform/modules/iam/outputs.tf @@ -1,10 +1,14 @@ -output "service_account_email"{ - description = "Service account email" - value = google.service.account.myaccount.email +# À vous d'exposer : +# 1. L'email du compte de service +# 2. La clé du compte de service (sensitive = true) + +output "email" { + description = "Service account email." + value = google_service_account.service_account.email } -output "service_account_key"{ - description = "Service key" - sensitive = true - value = google.service.account.mykey.private_key -} \ No newline at end of file +output "key" { + description = "Service account private key." + sensitive = true + value = google_service_account_key.mykey.private_key +} diff --git a/terraform/modules/iam/variables.tf b/terraform/modules/iam/variables.tf index e69de29..a0b734d 100644 --- a/terraform/modules/iam/variables.tf +++ b/terraform/modules/iam/variables.tf @@ -0,0 +1,7 @@ +# À vous de définir : +# - project_id (string) + +variable "project_id" { + description = "ID du projet" + type = string +} \ No newline at end of file diff --git a/terraform/modules/network/main.tf b/terraform/modules/network/main.tf index 15e7703..041336b 100644 --- a/terraform/modules/network/main.tf +++ b/terraform/modules/network/main.tf @@ -1,87 +1,88 @@ -resource "google_compute_network" "vpc" { - name = "mon-vpc" +# À 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 + +# VPC +resource "google_compute_network" "vpc_terraform" { + name = "vpc-terraform-2" auto_create_subnetworks = false } # Sous-réseau -resource "google_compute_subnetwork" "frontend_network" { - name = "mon-frontend" - network = google_compute_network.vpc.id +resource "google_compute_subnetwork" "subnet_frontend" { + name = "frontend-2" + network = google_compute_network.vpc_terraform.id ip_cidr_range = var.frontend_cidr region = var.region } -resource "google_compute_subnetwork" "backend_network" { - name = "mon-backend" - network = google_compute_network.vpc.id +resource "google_compute_subnetwork" "subnet_backend" { + name = "backend-2" + network = google_compute_network.vpc_terraform.id ip_cidr_range = var.backend_cidr region = var.region } -resource "google_compute_subnetwork" "database_network" { - name = "mon-database" - network = google_compute_network.vpc.id +resource "google_compute_subnetwork" "subnet_database" { + name = "database-2" + network = google_compute_network.vpc_terraform.id ip_cidr_range = var.database_cidr region = var.region } -resource "google_compute_firewall" "ssh_firewall" { - name = "mon-ssh" - network = google_compute_network.vpc.id +resource "google_compute_firewall" "allow_user_frontend" { + name = "allow-user-frontend-2" + network = google_compute_network.vpc_terraform.id - allow { - protocol = "tcp" - ports = ["22"] - } - - source_ranges = ["0.0.0.0/0"] - target_tags = ["ssh"] - -} - - -resource "google_compute_firewall" "frontend_firewall" { - name = "frontend" - network = google_compute_network.vpc.id - - allow { + allow { protocol = "tcp" ports = ["80", "443"] } source_ranges = ["0.0.0.0/0"] - target_tags = ["frontend"] - + target_tags = ["frontend"] } -resource "google_compute_firewall" "backend_firewall" { - name = "backend" - network = google_compute_network.vpc.id +resource "google_compute_firewall" "allow_frontend_backend" { + name = "allow-frontend-backend-2" + network = google_compute_network.vpc_terraform.id - allow { + allow { protocol = "tcp" ports = ["8000"] } source_tags = ["frontend"] - target_tags = ["backend"] - + target_tags = ["backend"] } -resource "google_compute_firewall" "database_firewall" { - name = "database" - network = google_compute_network.vpc.id +resource "google_compute_firewall" "allow_ssh_all" { + name = "allow-ssh-all-2" + network = google_compute_network.vpc_terraform.id - allow { + allow { + protocol = "tcp" + ports = ["22"] + } + + source_ranges = ["0.0.0.0/0"] + target_tags = ["ssh"] +} + +resource "google_compute_firewall" "allow_backend_database" { + name = "allow-backend-database-2" + network = google_compute_network.vpc_terraform.id + + allow { protocol = "tcp" ports = ["3306"] } source_tags = ["backend"] - target_tags = ["database"] - -} - - - - + target_tags = ["database"] +} \ No newline at end of file diff --git a/terraform/modules/network/outputs.tf b/terraform/modules/network/outputs.tf index 481db39..2191456 100644 --- a/terraform/modules/network/outputs.tf +++ b/terraform/modules/network/outputs.tf @@ -1,17 +1,15 @@ -output "vpc_terraform" { - description = "ID du VPC créé" - value = google_compute_network.vpc.id +# À vous d'exposer : +# 1. L'ID du VPC +# 2. Les IDs des sous-réseaux sous forme de map +output "vpc" { + value = google_compute_network.vpc_terraform.id } - -output "subnet_ids" { - description = "Map des IDs des sous-réseaux" +output "subnets" { value = { - - frontend = google_compute_subnetwork.frontend_network.id - backend = google_compute_subnetwork.backend_network.id - database = google_compute_subnetwork.database_network.id + frontend = google_compute_subnetwork.subnet_frontend.id + backend = google_compute_subnetwork.subnet_backend.id + database = google_compute_subnetwork.subnet_database.id } - -} +} \ No newline at end of file diff --git a/terraform/modules/network/variables.tf b/terraform/modules/network/variables.tf index 2a74cdb..36786d4 100644 --- a/terraform/modules/network/variables.tf +++ b/terraform/modules/network/variables.tf @@ -1,36 +1,37 @@ +# À 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) + variable "project_name" { + description = "Nom du projet" type = string - description = "but3-iac" - } variable "region" { + description = "Region du projet" type = string - description = "Région dans laquelle déployer les ressources" - } variable "frontend_cidr" { description = "CIDR for frontend subnet" type = string - } variable "backend_cidr" { description = "CIDR for backend subnet" type = string - } variable "database_cidr" { description = "CIDR for database subnet" type = string - } variable "ssh_source_ranges" { - description = "Plages d’adresses autorisées à se connecter en SSH" + description = "" type = string - - -} +} \ No newline at end of file