Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Providers, resources et data sources dans Terraform

8 min de lecture

logo terraform

Tout projet Terraform repose sur trois concepts : le provider (la connexion à une API), la resource (ce que Terraform crée), et la data source (ce que Terraform lit sans créer). Comprendre la distinction entre ces trois briques suffit pour lire et écrire n’importe quel projet Terraform.

  • Ce qu’est un provider : le plugin qui connecte Terraform à une API (libvirt, AWS, GitHub…)
  • Déclarer une resource : la syntaxe resource "type" "nom" et ses attributs
  • Utiliser une data source : lire une ressource existante sans la créer
  • Référencer entre ressources : libvirt_volume.disk.path et la gestion des dépendances

Un provider est un plugin qui permet à Terraform de communiquer avec une technologie particulière. Il traduit vos déclarations HCL en appels API.

Il en existe des centaines : libvirt, AWS, Azure, GCP, Kubernetes, GitHub, Cloudflare, Vault

terraform {
required_providers {
libvirt = {
source = "dmacvicar/libvirt"
version = "~> 0.8"
}
}
}
provider "libvirt" {
uri = "qemu:///system"
}

Deux blocs distincts :

  • required_providers (dans terraform {}) : déclare la source du provider et sa contrainte de version. Obligatoire.
  • provider "nom" {} : configure le provider (URL, région, credentials…). Optionnel si les valeurs par défaut conviennent.

Les providers sont publiés sur le Terraform Registry. C’est là que Terraform les télécharge lors de terraform init.

Pour trouver le source d’un provider : namespace/nom. Exemples :

  • hashicorp/aws
  • dmacvicar/libvirt
  • hashicorp/kubernetes

Un projet peut utiliser plusieurs providers simultanément :

terraform {
required_providers {
libvirt = {
source = "dmacvicar/libvirt"
version = "~> 0.8"
}
local = {
source = "hashicorp/local"
version = "~> 2.5"
}
}
}

Une resource représente un objet d’infrastructure que Terraform gère : une VM, un réseau, un disque, un bucket, un enregistrement DNS

resource "TYPE" "NOM_LOCAL" {
attribut1 = valeur1
attribut2 = valeur2
}
  • TYPE : identifie le provider et le type d’objet (ex: libvirt_domain, aws_instance, kubernetes_deployment).
  • NOM_LOCAL : nom interne au projet Terraform, utilisé pour référencer la resource ailleurs dans le code. Il n’apparaît pas dans l’infrastructure.
resource "libvirt_volume" "disk_ubuntu" {
name = "ubuntu-01.qcow2"
pool = "default"
target = {
format = { type = "qcow2" }
}
create = {
content = {
url = "/home/bob/images/ubuntu-24.04-cloudimg.img"
}
}
}
resource "libvirt_domain" "vm_web" {
name = "web-01"
type = "kvm"
memory = 1024
memory_unit = "MiB"
vcpu = 2
devices = {
disks = [
{
source = {
file = { file = libvirt_volume.disk_ubuntu.path }
}
target = { dev = "vda", bus = "virtio" }
}
]
interfaces = [
{
model = { type = "virtio" }
source = { network = { network = "default" } }
}
]
}
}

Pour utiliser un attribut d’une resource dans une autre, la syntaxe est :

TYPE.NOM_LOCAL.ATTRIBUT

Dans l’exemple ci-dessus :

file = libvirt_volume.disk_ubuntu.path

Terraform comprend automatiquement la dépendance : il créera libvirt_volume.disk_ubuntu avant libvirt_domain.vm_web.

Une data source permet de lire des informations sur une ressource qui existe déjà — sans la créer ni la gérer.

Cas d’usage typiques :

  • Récupérer l’ID d’un réseau existant pour y connecter une VM
  • Lire une AMI AWS par ses critères (plutôt que son ID qui change)
  • Consulter un secret dans Vault
data "TYPE" "NOM_LOCAL" {
filtre = valeur
}
data "libvirt_pool" "images" {
name = "default"
}
resource "libvirt_volume" "disk" {
name = "test.qcow2"
pool = data.libvirt_pool.images.name
# ...
}

La syntaxe pour référencer une data source :

data.TYPE.NOM_LOCAL.ATTRIBUT

Relation entre provider, resource et data source dans Terraform

Certains attributs d’une resource ne sont connus qu’après création (adresse IP, ID généré, chemin de volume…). Dans le plan, ils s’affichent ainsi :

+ id = (known after apply)
+ path = (known after apply)

On peut quand même les utiliser dans d’autres resources — Terraform résout les dépendances automatiquement.

  • Un provider est un plugin qui connecte Terraform à une API. Il se déclare dans required_providers et se configure dans provider {}.
  • Une resource est un objet créé et géré par Terraform. Elle est référencée par TYPE.NOM.ATTRIBUT.
  • Une data source lit un objet existant sans le créer ni le modifier. Ses valeurs sont stockées dans le state, mais terraform destroy ne détruit pas l’objet distant. Référence : data.TYPE.NOM.ATTRIBUT.
  • Les dépendances entre resources sont résolues automatiquement dès qu’on référence un attribut d’une resource depuis une autre.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn