Variables et outputs
Les variables d'entrée, les outputs et les locals sont les mécanismes de paramétrage d'un projet Terraform. Bien conçus, ils rendent le code réutilisable entre environnements et entre équipes. Mal conçus, ils créent des dépendances cachées et des configurations difficiles à maintenir.
Variables d'entrée
# variables.tf
variable "instance_type" {
type = string
description = "Type d'instance EC2"
default = "t3.micro"
}
variable "allowed_cidrs" {
type = list(string)
description = "CIDRs autorisés en SSH"
default = []
}
variable "tags" {
type = map(string)
description = "Tags communs à toutes les ressources"
default = {}
}
variable "db_config" {
type = object({
engine = string
engine_version = string
instance_class = string
storage_gb = number
multi_az = bool
})
description = "Configuration de la base de données"
}Types disponibles
- Primitifs :
string,number,bool - Collections :
list(TYPE),set(TYPE),map(TYPE) - Structurés :
object({ clé = TYPE }),tuple([TYPE, TYPE]) any: pas de contrainte de type
Validation des variables
variable "environment" {
type = string
validation {
condition = contains(["prod", "staging", "dev"], var.environment)
error_message = "L'environnement doit être prod, staging ou dev."
}
}
variable "cidr_block" {
type = string
validation {
condition = can(cidrhost(var.cidr_block, 0))
error_message = "La valeur doit être un bloc CIDR valide."
}
}Locals : valeurs calculées
Les locals évitent la répétition d'expressions complexes et centralisent les calculs :
locals {
common_tags = merge(var.tags, {
ManagedBy = "terraform"
Environment = var.environment
Project = var.project_name
})
name_prefix = "${var.project_name}-${var.environment}"
is_production = var.environment == "prod"
# Calcul conditionnel
instance_type = local.is_production ? "t3.large" : "t3.micro"
}
resource "aws_instance" "web" {
instance_type = local.instance_type
tags = merge(local.common_tags, { Name = "${local.name_prefix}-web" })
}Outputs
Les outputs exposent des valeurs à l'extérieur du module ou du projet. Ils sont affichés après terraform apply et accessibles via terraform output.
# outputs.tf
output "vpc_id" {
description = "ID du VPC créé"
value = aws_vpc.main.id
}
output "public_ips" {
description = "IPs publiques des instances web"
value = aws_instance.web[*].public_ip
}
output "db_endpoint" {
description = "Endpoint de la base de données"
value = aws_db_instance.main.endpoint
sensitive = true # masqué dans les logs
}# Afficher tous les outputs
terraform output
# Afficher un output spécifique
terraform output vpc_id
# Format JSON pour parsing
terraform output -jsonVariables sensibles
variable "db_password" {
type = string
sensitive = true # masqué dans les plans et les outputs
}
Une variable marquée sensitive n'apparaît pas en clair dans la sortie de plan et apply. Elle reste visible dans le state file — raison supplémentaire de sécuriser le backend distant.