forked from pierront/but3-iac
6.3 KiB
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 minusculesupper(string): Convertit en majusculesformat("vm-%s", name): Formate une chaîne
Fonctions de Collection
length(list): Longueur d'une listeconcat(list1, list2): Concatène des listesmerge(map1, map2): Fusionne des maps
Fonctions de Fichier
file("path/to/file"): Lit un fichierfileexists("path"): Vérifie l'existencetemplatefile("tpl", {}): Traite un template
6. Modules
Structure de Base d'un Module
main.tf: Ressources principalesvariables.tf: Variables d'entréeoutputs.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 principalesvariables.tf: Définitions des variablesoutputs.tf: Définitions des outputsversions.tf: Configuration des providersterraform.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, stagingproject: nom du projetrole: web, app, dbmanaged-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
- Solution : Exécutez
- "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