Passer au contenu principal

Fondamentaux (Terraform)

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 -json

Variables 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.