Experiment: devops29 avril 2026

Terraform - GCP VM

Création d'une structure de base sur GCP avec Terraform (VM) pour un Hackaton étudiant

Terraform  - GCP VM

Terraform - GCP VM Hackaton

L'objectfi de ce LAB étais d'allier les compétences de mes étudiants avec les miennes. Le but principal étais pour moi de déployer une toute petite infrastrcuture avec Google Cloud project composer de 3 VM Linux sous débian 12 grace a Terraform, d'attribuer de créer un utilisateur IAM et de lui attribuer les bon droit pour pouvoir garder l'environement des VM sécuriser pour mes étudiants et pour moi même. J'ai du rajouter également des règles réseaux pour autoriser les connexion ssh, HTTP, HTTPs pour pouvoir afficher le résulat du Hackaton. J'ai également rediriger les DNS de 3 nom de domaine différents vers l'IP publique des VM respectives.

L'objectif de mes étudiants étais de se connecter a ses VM avec la clef ssh fournie et de déployer une petite application Frontend,, de configurer un reverse proxy en utilisant Caddy, de sécuriser également le server avec les règles de base bloquer tout les port sauf ce utilse (80,443,22...) et également d'installer un Fail2ban.

Pour les plus motiver, l'idée étais de pouvoir également installer un Database de type Mariadb sur le server de créer un petit script PHP également qui affiche la date du jours et récupère quelques informations de la base de données et les affiche dans l'application Frontend.

Voici les éléments que j'ai pu fournir à mes étudiants :

  • Une clef SSH pour pouvoir se connecter a ses VM.
  • Un PDF avec les pistes pour reussir le LAB.
  • 3 Nom de domaines pointant vers les VM respectives.

Objectif pédagogique du projet

L'objectif étais avant tout de permetre a des étudiants de première année de découvrir un enviroment de production professionel de manière a comprendre comment fonctionne les serveurs, et de découvrir l'envers du décors également. Et également de pouvoir mettre a profis leur connaisance sur la mise en place d'outils tiers grace au documentations, IA et au projets devops qu'il on pue avoir au part avant.

Infrastructure deployer

Pour ce faire j'ai du configurer une petite infrastructure sur Google Cloud avec Terraform.

Voici le code terraform que j'ai utilisé :

Provider.tf

terraform {
required_providers {
google = {
source  = "hashicorp/google"
version = "~> 5.0"
}
}
}

provider "google" {
project = "sys-hack-2026"
region  = "europe-west9"
zone    = "europe-west9-a"
}

Ce fichier de configuration simple me permet de dire a terraform que je veux travailler avec Google Cloud et que je veux utiliser le provider google. La region et la zone sont défini pour que terraform sache ou déployer les ressources.

variables.tf

Déclaration des variables utilisées dans le projet. On y trouve l'utilisateur SSH et le chemin de la clé SSH.

variable "ssh_user" {
type    = string
default = "debian"
}

variable "ssh_pub_key_path" {
type    = string
default = "~/.ssh/hackaton_epitech.pub"
}

main.tf

Ce fichier main retrace toute les ressources necessaire au deployement de l'infrastructure.

On y retrouve les 3 VM linux, leurs service account respectif avec les permissions necessaire pour que les étudiants puissent travailler sur les VM.

esource "google_compute_instance" "default" {
count        = 3
name         = "vm-${count.index + 1}"
machine_type = "e2-micro"
zone         = "europe-west9-b"
tags         = ["web-server"]

boot_disk {
initialize_params {
image = "debian-cloud/debian-12"
}
}

network_interface {
network = "default"
access_config {}
}

metadata = {
ssh-keys = "${var.ssh_user}:${file(var.ssh_pub_key_path)}"
}

service_account {
email  = google_service_account.vm_sa.email
scopes = ["cloud-platform"]
}
}

resource "google_service_account" "vm_sa" {
account_id   = "vm-service-account"
display_name = "Custom VM Service Account"
}

resource "google_project_iam_member" "vm_sa_logging" {
project = "sys-hack-2026"
role    = "roles/logging.logWriter"
member  = "serviceAccount:${google_service_account.vm_sa.email}"
}

resource "google_compute_firewall" "allow_http_https" {
name    = "allow-http-https"
network = "default"

allow {
protocol = "tcp"
ports    = ["80", "443"]
}

source_ranges = ["0.0.0.0/0"]
target_tags   = ["web-server"]
}

output "instance_names" {
value = google_compute_instance.default[*].name
}

output "instance_ips" {
value = google_compute_instance.default[*].network_interface[0].access_config[0].nat_ip
}
Fin d'expérimentationKernelLab / 2026