Files
but3-iac_RH/cheat-sheet-terraform.md

6.3 KiB

Terraform GCP Cheatsheet

1. Commandes Terraform de Base

Initialisation et Configuration

Commande Description
terraform init Initialise un projet Terraform
terraform fmt Formate les fichiers .tf
terraform validate Vérifie la syntaxe
terraform plan Montre les changements prévus
terraform apply Applique les changements
terraform destroy Détruit l'infrastructure
terraform output Affiche les outputs
terraform show Montre l'état actuel

2. Blocs de Base Terraform

Provider Configuration

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

provider "google" {
  project = var.project_id
  region  = var.region
}

Variables et Outputs

Déclaration de variable :

variable "project_id" {
  description = "ID du projet GCP"
  type        = string
  default     = "mon-projet"
}

Output :

output "instance_ip" {
  value = google_compute_instance.main.network_interface[0].access_config[0].nat_ip
}

3. Ressources GCP Communes

Réseau VPC

# VPC
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"
}

Règles de Pare-feu

resource "google_compute_firewall" "allow_http" {
  name    = "allow-http"
  network = google_compute_network.vpc.id

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

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

Instances de Calcul

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"
  }
}

4. Types de Données et Expressions

Types de Variables

# String
variable "machine_type" {
  type = string
}

# Number
variable "disk_size" {
  type = number
}

# Boolean
variable "enable_public_ip" {
  type = bool
}

# List
variable "allowed_ports" {
  type = list(number)
}

# Map
variable "labels" {
  type = map(string)
}

# Object
variable "disk_config" {
  type = object({
    size  = number
    type  = string
    image = string
  })
}

Expressions Courantes

# Interpolation
name = "${var.project_name}-instance"

# Condition
count = var.environment == "prod" ? 2 : 1

# For expression
dynamic "allowed_ports" {
  for_each = var.ports
  content {
    port = allowed_ports.value
  }
}

5. Fonctions Utiles

Fonctions de String

  • lower(string) : Convertit en minuscules
  • upper(string) : Convertit en majuscules
  • format("vm-%s", name) : Formate une chaîne

Fonctions de Collection

  • length(list) : Longueur d'une liste
  • concat(list1, list2) : Concatène des listes
  • merge(map1, map2) : Fusionne des maps

Fonctions de Fichier

  • file("path/to/file") : Lit un fichier
  • fileexists("path") : Vérifie l'existence
  • templatefile("tpl", {}) : Traite un template

6. Modules

Structure de Base d'un Module

  • main.tf : Ressources principales
  • variables.tf : Variables d'entrée
  • outputs.tf : Valeurs exposées

Déclaration d'un Module

module "network" {
  source = "./modules/network"
  
  # Variables d'entrée
  project_name = var.project_name
  region       = var.region
  
  # Autres variables spécifiques au module
  cidr_range   = "10.0.0.0/16"
}

Référence des Outputs

# Utilisation d'un output de module
resource "google_compute_instance" "vm" {
  network = module.network.vpc_id
}

# Output d'un module
output "vpc_id" {
  value = module.network.vpc_id
}

Sources de Modules

Module local :

module "vpc" {
  source = "./modules/vpc"
}

Module du registry :

module "bucket" {
  source  = "terraform-google-modules/cloud-storage/google"
  version = "3.4.0"
}

Module Git :

module "network" {
  source = "git::https://example.com/network.git?ref=v1.2.0"
}

Dépendances Entre Modules

module "database" {
  source = "./modules/database"
  
  # Dépendance explicite
  depends_on = [module.network]
  
  # Utilisation des outputs d'autres modules
  subnet_id = module.network.private_subnet_id
  vpc_id    = module.network.vpc_id
}

7. Bonnes Pratiques

Organisation du Code

Structure recommandée project/ :

  • main.tf : Ressources principales
  • variables.tf : Définitions des variables
  • outputs.tf : Définitions des outputs
  • versions.tf : Configuration des providers
  • terraform.tfvars : Valeurs des variables

Conventions de Nommage

  • Utilisez des tirets (-) pour les ressources
  • Utilisez des underscores (_) pour les variables
  • Préfixez les ressources avec leur type

Tags à Utiliser

  • environment: prod, dev, staging
  • project: nom du projet
  • role: web, app, db
  • managed-by: terraform

8. Debugging

Logging et Debug

# Active les logs détaillés
export TF_LOG=DEBUG
export TF_LOG_PATH=terraform.log

# Vérifie l'état d'une ressource spécifique
terraform state show google_compute_instance.vm

Gestion d'État

Commande Action
terraform state list Liste les ressources
terraform state rm ADDR Supprime de l'état
terraform import ADDR ID Importe une ressource
terraform state mv SRC DEST Déplace une ressource

9. Messages d'Erreur Communs

  • "Error: Provider configuration not present"
    • Solution : Exécutez terraform init
  • "Error: No valid credential sources found"
    • Solution : Configurez l'authentification GCP
  • "Error: Resource already exists"
    • Solution : Importez la ressource ou changez son nom
  • "Error: Configuration directory not empty"
    • Solution : Initialisez dans un nouveau répertoire