From 540fb6c6340cc2047b33823d195db2d14ec598ef Mon Sep 17 00:00:00 2001 From: James Boutaric Date: Thu, 4 Dec 2025 10:03:07 +0100 Subject: [PATCH] . --- .DS_Store | Bin 6148 -> 6148 bytes iam-step.md | 90 ++++++++++++++++++++++++ terraform/environments/dev/main.tf | 15 ---- terraform/environments/dev/variables.tf | 34 ++++----- terraform/modules/compute/main.tf | 57 +++++---------- terraform/modules/compute/outputs.tf | 17 ++--- terraform/modules/compute/variables.tf | 22 ++---- terraform/modules/iam/main.tf | 5 -- terraform/modules/iam/outputs.tf | 13 +++- terraform/modules/iam/variables.tf | 2 - terraform/modules/network/main.tf | 71 +++++++------------ terraform/modules/network/outputs.tf | 14 ++-- terraform/modules/network/variables.tf | 21 +++--- 13 files changed, 184 insertions(+), 177 deletions(-) create mode 100644 iam-step.md diff --git a/.DS_Store b/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..560cb68863bea8b803a594ba3a51ce1c92fe7da1 100644 GIT binary patch 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 delta 66 zcmZoMXfc=|#>AjHu~2NHo+1YW0|Nsi1B1Y3K@KsN%?cc|m^ZU?@N+ORsBRYI_|80; WUqq3Sak8n1@??J=j?FP5E0_VtKn@20 diff --git a/iam-step.md b/iam-step.md new file mode 100644 index 0000000..e9d2992 --- /dev/null +++ b/iam-step.md @@ -0,0 +1,90 @@ +# 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 3103c96..2134366 100644 --- a/terraform/environments/dev/main.tf +++ b/terraform/environments/dev/main.tf @@ -1,9 +1,3 @@ -# À 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 = { @@ -26,14 +20,5 @@ 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.subnet_ids["frontend"] - backend_subnet_id = module.network.subnet_ids["backend"] - database_subnet_id = module.network.subnet_ids["database"] } \ No newline at end of file diff --git a/terraform/environments/dev/variables.tf b/terraform/environments/dev/variables.tf index 7e9ff19..1d68642 100644 --- a/terraform/environments/dev/variables.tf +++ b/terraform/environments/dev/variables.tf @@ -1,12 +1,13 @@ +# Commentaire variable "project_name" { - description = "Nom du projet cidr" type = string - default = "My Firdt Project" + description = "but3-iac" + default = "Automaticsearch" } variable "region" { - description = "region du cidr" type = string + description = "Région dans laquelle déployer les ressources" default = "europe-west9" } @@ -29,28 +30,17 @@ variable "database_cidr" { } variable "ssh_source_ranges" { - description = "ssh_source_range du projet cidr" type = string - default = "0.0.0.0/0" + description = "Plages d’adresses autorisées à se connecter en SSH" + 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 d'instance de vm" - type = string - default = "e2-micro" -} - - -variable "zone" { - description = "zone du projet" - 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 b28c55a..684e549 100644 --- a/terraform/modules/compute/main.tf +++ b/terraform/modules/compute/main.tf @@ -1,29 +1,5 @@ -# resource "google_compute_instance" "vm" { -# name = "ma-vm" -# machine_type = "e2-medium" -# zone = "europe-west1-b" - -# boot_disk { -# initialize_params { -# image = "debian-cloud/debian-11" -# size = 10 -# } -# } - -# network_interface { -# access_config {} # IP publique -# subnetwork = google_compute_subnetwork.subnet.id -# } - -# tags = ["web", "app"] - -# metadata = { -# enable-oslogin = "TRUE" -# } -# } - resource "google_compute_instance" "vm_frontend" { - name = "frontend" + name = "frontend-instance" machine_type = var.instance_type zone = var.zone @@ -34,22 +10,22 @@ 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" } } - - resource "google_compute_instance" "vm_backend" { - name = "backend" + name = "backend-instance" machine_type = var.instance_type zone = var.zone @@ -60,23 +36,24 @@ 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" + name = "database-instance" machine_type = var.instance_type zone = var.zone + boot_disk { initialize_params { @@ -85,13 +62,15 @@ 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 f76f7fc..58c6d07 100644 --- a/terraform/modules/compute/outputs.tf +++ b/terraform/modules/compute/outputs.tf @@ -1,9 +1,4 @@ -# output "instance_ip" { -# value = google_compute_instance.main.network_interface[0].access_config[0].nat_ip -# } - -output "instance_internal_ips" { - description = "IPs internes de toutes les instances" +output "ip_internes" { value = { frontend = google_compute_instance.vm_frontend.network_interface[0].network_ip backend = google_compute_instance.vm_backend.network_interface[0].network_ip @@ -11,16 +6,14 @@ output "instance_internal_ips" { } } -output "frontend_public_ip" { - description = "IP publique de l'instance frontend" - value = google_compute_instance.vm_frontend.network_interface[0].access_config[0].nat_ip +output "ip_public_frontend" { + value = google_compute_instance.vm_frontend.network_interface[0].access_config[0].nat_ip } -output "instance_names" { - description = "Noms de toutes les instances" +output "nom_instances" { value = { frontend = google_compute_instance.vm_frontend.name - backend = google_compute_instance.vm_backend.name + 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 0d822cb..4dabcfc 100644 --- a/terraform/modules/compute/variables.tf +++ b/terraform/modules/compute/variables.tf @@ -1,36 +1,26 @@ -# variable "project_id" { -# description = "ID du projet GCP" -# type = string -# default = "mon-projet" -# } - variable "instance_type" { - description = "Nom du projet cidr" + description = "Type de machine à utiliser pour les instances" type = string + } - variable "zone" { - description = "Nom du projet cidr" + description = "Zone où déployer les instances" type = string } - variable "frontend_subnet_id" { - description = "Nom du projet cidr" + description = "ID du sous-réseau frontend" type = string } - - variable "backend_subnet_id" { - description = "Nom du projet cidr" + description = "ID du sous-réseau backend" type = string } - variable "database_subnet_id" { - description = "Nom du projet cidr" + description = "ID du sous-réseau database" type = string } diff --git a/terraform/modules/iam/main.tf b/terraform/modules/iam/main.tf index a4b77c1..e69de29 100644 --- a/terraform/modules/iam/main.tf +++ b/terraform/modules/iam/main.tf @@ -1,5 +0,0 @@ -# À 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 \ No newline at end of file diff --git a/terraform/modules/iam/outputs.tf b/terraform/modules/iam/outputs.tf index c73acc0..91f33d3 100644 --- a/terraform/modules/iam/outputs.tf +++ b/terraform/modules/iam/outputs.tf @@ -1,3 +1,10 @@ -# À vous d'exposer : -# 1. L'email du compte de service -# 2. La clé du compte de service (sensitive = true) \ No newline at end of file +output "service_account_email"{ + description = "Service account email" + value = google.service.account.myaccount.email +} + +output "service_account_key"{ + description = "Service key" + sensitive = true + value = google.service.account.mykey.private_key +} \ No newline at end of file diff --git a/terraform/modules/iam/variables.tf b/terraform/modules/iam/variables.tf index 5ac1614..e69de29 100644 --- a/terraform/modules/iam/variables.tf +++ b/terraform/modules/iam/variables.tf @@ -1,2 +0,0 @@ -# À vous de définir : -# - project_id (string) \ No newline at end of file diff --git a/terraform/modules/network/main.tf b/terraform/modules/network/main.tf index a567807..15e7703 100644 --- a/terraform/modules/network/main.tf +++ b/terraform/modules/network/main.tf @@ -1,104 +1,87 @@ -# # VPC -# resource "google_compute_network" "vpc" { -# name = "mon-vpc" -# auto_create_subnetworks = false -# } resource "google_compute_network" "vpc" { name = "mon-vpc" auto_create_subnetworks = false } -# # Sous-réseau -# resource "google_compute_subnetwork" "subnet" { -# name = "mon-subnet" -# network = google_compute_network.vpc.id -# ip_cidr_range = "10.0.1.0/24" -# region = "europe-west1" -# } - -resource "google_compute_subnetwork" "frontend" { +# Sous-réseau +resource "google_compute_subnetwork" "frontend_network" { name = "mon-frontend" network = google_compute_network.vpc.id ip_cidr_range = var.frontend_cidr region = var.region } -resource "google_compute_subnetwork" "backend" { +resource "google_compute_subnetwork" "backend_network" { name = "mon-backend" network = google_compute_network.vpc.id ip_cidr_range = var.backend_cidr region = var.region } -resource "google_compute_subnetwork" "database" { - name = "ma-database" +resource "google_compute_subnetwork" "database_network" { + name = "mon-database" network = google_compute_network.vpc.id ip_cidr_range = var.database_cidr region = var.region } -# resource "google_compute_firewall" "allow_http" { -# name = "allow-http" -# network = google_compute_network.vpc.id +resource "google_compute_firewall" "ssh_firewall" { + name = "mon-ssh" + network = google_compute_network.vpc.id -# allow { -# protocol = "tcp" -# ports = ["80", "443"] -# } + allow { + protocol = "tcp" + ports = ["22"] + } + + source_ranges = ["0.0.0.0/0"] + target_tags = ["ssh"] + +} -# source_ranges = ["0.0.0.0/0"] -# target_tags = ["web"] -# } 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 - 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 - allow { + allow { protocol = "tcp" ports = ["3306"] } source_tags = ["backend"] - target_tags = ["database"] + target_tags = ["database"] + } -resource "google_compute_firewall" "ssh_firewall" { - name = "ssh" - network = google_compute_network.vpc.id - allow { - protocol = "tcp" - ports = ["22"] - } - source_ranges = ["0.0.0.0/0"] - target_tags = ["ssh"] -} \ No newline at end of file + diff --git a/terraform/modules/network/outputs.tf b/terraform/modules/network/outputs.tf index 4e72520..481db39 100644 --- a/terraform/modules/network/outputs.tf +++ b/terraform/modules/network/outputs.tf @@ -1,19 +1,17 @@ -# output "instance_ip" { -# value = google_compute_instance.main.network_interface[0].access_config[0].nat_ip -# } - output "vpc_terraform" { description = "ID du VPC créé" value = google_compute_network.vpc.id + } + output "subnet_ids" { description = "Map des IDs des sous-réseaux" value = { - frontend = google_compute_subnetwork.frontend.id - backend = google_compute_subnetwork.backend.id - database = google_compute_subnetwork.database.id + frontend = google_compute_subnetwork.frontend_network.id + backend = google_compute_subnetwork.backend_network.id + database = google_compute_subnetwork.database_network.id } -} \ No newline at end of file +} diff --git a/terraform/modules/network/variables.tf b/terraform/modules/network/variables.tf index 69e28db..2a74cdb 100644 --- a/terraform/modules/network/variables.tf +++ b/terraform/modules/network/variables.tf @@ -1,37 +1,36 @@ -# variable "project_id" { -# description = "ID du projet GCP" -# type = string -# default = "mon-projet" -# } - variable "project_name" { - description = "Nom du projet cidr" type = string + description = "but3-iac" + } variable "region" { - description = "region du cidr" 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 = "ssh_source_range du projet cidr" + description = "Plages d’adresses autorisées à se connecter en SSH" type = string + + } - -