Dans ce chapitre, nous allons créer une VM avec Compute Engine et la rendre disponible publiquement à travers le pare-feu Google.

Notez que cet exemple est à but pédagogique et se veut simple. Sinon ce n’est pas une bonne pratique d’exposer une VM directement sur Internet. La bonne démarche est d’utiliser un Load Balancer (et si possible un WAF pour filtrer les attaques Web).

Un VPC et un sous-réseau

Pour rappel, un VPC est un réseau virtuel isolé de tous les autres projets sur le cloud public GCP.

Dans ce réseau virtuel, on doit créer au moins un sous-réseau dont l’utilité est principalement de dédier une plage d’adresses IP privées.

# vpc.tf

resource "google_compute_network" "sws-gce-vpc" {
  name                    = "gce-vpc"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "sws-gce-subnet" {
  name          = "gce-subnet"
  ip_cidr_range = "10.5.0.0/16"
  region        = var.region
  network       = google_compute_network.sws-gce-subnet.id
}

Une instance de VM Debian avec un serveur Nginx

On crée une VM qui se base sur le modèle prédéfini de Debian 12 proposé par Google.

# Create a single Compute Engine instance
resource "google_compute_instance" "default" {
  name         = "sws-vm"
  machine_type = "e2-micro"
  zone         = var.zone
  tags         = ["web"]

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

  # Install Nginx
  metadata = {
    startup-script = <<-EOF
  sudo apt update
  sudo apt install -yq nginx
  sudo echo 'Hello world' > /usr/share/nginx/html/index.html"
  EOF
  }

  network_interface {
    subnetwork = google_compute_subnetwork.default.id
      access_config { }
  }
}

Une règle firewall pour laisser passer le port 80

resource "google_compute_firewall" "sws" {
  name    = "static-website-firewall"
  network = google_compute_network.sws-gce-vpc.id

  allow {
    protocol = "tcp"
    ports    = ["80"]
  }
  source_ranges = ["0.0.0.0/0"]
}

Montrer l’adresse publique et tester

output "public-ip" {
  value = google_compute_instance.default.network_interface.0.access_config.0.nat_ip
}

Il ne reste plus qu’à regarder :

http://w.x.y.z