1. Les blocs #
La structure d'une configuration.
Exemple #
terraform {
required_version = ">= 1.7"
required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } }
}
provider "aws" { region = var.region }
variable "region" {
type = string
default = "eu-west-3"
}
variable "environnement" {
type = string
validation {
condition = contains(["recette", "prod"], var.environnement)
error_message = "recette ou prod uniquement."
}
}
locals {
etiquettes = { environnement = var.environnement, gere_par = "terraform" }
}
data "aws_availability_zones" "zones" { state = "available" }
resource "aws_s3_bucket" "rapports" {
bucket = "rapports-${var.environnement}-${random_id.suffixe.hex}"
tags = local.etiquettes
}
resource "random_id" "suffixe" { byte_length = 4 }
output "bucket" { value = aws_s3_bucket.rapports.bucket }2. Répéter des ressources #
count, for_each, dynamic.
count ou for_each ? #
| Méta-argument | Quand l'utiliser |
|---|---|
count | N copies identiques ; adressées par index (fragile si on retire un élément du milieu) |
for_each | Une ressource par clé d'une map ou d'un set : adresses stables |
variable "files" { default = { facturation = 3, expedition = 5 } }
resource "aws_sqs_queue" "file" {
for_each = var.files
name = "commandes-${each.key}"
visibility_timeout_seconds = each.value * 10
}
resource "aws_security_group" "web" {
name = "web"
dynamic "ingress" {
for_each = [80, 443]
content {
from_port = ingress.value
to_port = ingress.value
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
}3. Expressions et fonctions #
Calculer des valeurs.
Utiles #
| Besoin | Exemple |
|---|---|
| Conditionnelle | var.env == "prod" ? 3 : 1 |
| Boucle for | [for z in data.aws_availability_zones.zones.names : upper(z)] |
| Fusion de maps | merge(local.etiquettes, { role = "web" }) |
| Encodage | jsonencode({...}), yamldecode(file("x.yaml")) |
| Modèle de fichier | templatefile("init.sh.tftpl", { port = 8080 }) |
terraform console
> cidrsubnet("10.0.0.0/16", 8, 2)
"10.0.2.0/24"
> [for i in range(3) : "web-${i}"]Mon suivi
Connectez-vous pour suivre votre progression et prendre des notes. Se connecter
Articles recommandés
Terraform : principes, architecture et flux de travail
Comprendre Terraform : infrastructure as code déclarative, architecture (cœur, fournisseurs, état...
L'état Terraform : backends distants, verrouillage, import et refactorisation
Gérer l'état Terraform : rôle du fichier d'état, données sensibles, backends distants (S3, azurer...
Les modules Terraform : concevoir, versionner et réutiliser
Structurer Terraform avec des modules : module racine et modules enfants, entrées et sorties, sou...
Tester et sécuriser Terraform : validate, terraform test, tflint, Checkov et politiques
Garantir la qualité du code Terraform : fmt et validate, tests natifs terraform test avec fournis...
Terraform multi-environnements, workspaces et organisation des dépôts
Organiser Terraform pour plusieurs environnements : dossiers par environnement, fichiers tfvars, ...
Terraform en CI/CD : pipelines, revue du plan, OIDC et GitOps
Automatiser Terraform : pipeline plan sur demande de fusion et apply après approbation, publicati...
Terraform sur plusieurs clouds : AWS, Azure, Google Cloud, OVHcloud et Kubernetes
Utiliser Terraform avec les principaux fournisseurs : aws, azurerm, google, ovh et openstack, kub...
Préparer la certification HashiCorp Certified: Terraform Associate
Guide de préparation au Terraform Associate : format, objectifs officiels (concepts de l'IaC, flu...
Bonnes pratiques Terraform : structure, état, sécurité, revue et maintenance
Les bonnes pratiques Terraform en équipe : structure des dépôts, nommage, versions épinglées, éta...