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