
Le bloc ephemeral crée des ressources temporaires que Terraform ne stocke jamais dans le state ni dans le plan. Contrairement à sensitive = true qui masque l’affichage mais conserve la valeur dans le state, une ressource éphémère existe uniquement pendant l’opération Terraform en cours. Elle est ouverte au début, éventuellement renouvelée, puis fermée. Le cas d’usage principal : générer un mot de passe ou récupérer un secret pour le passer à un argument write-only, sans laisser de trace.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Déclarer une ressource éphémère : syntaxe du bloc
ephemeral - Comprendre le lifecycle : open → renew → close
- Savoir où les utiliser : contextes autorisés et interdits
- Déclarer une variable éphémère :
ephemeral = truesur une variable - Utiliser les meta-arguments :
count,for_each,precondition
Prérequis
Section intitulée « Prérequis »- sensitive compris (sensitive : masquer les valeurs)
- Terraform ≥ 1.11 installé (installer Terraform)
L’idée derrière les valeurs éphémères
Section intitulée « L’idée derrière les valeurs éphémères »Pensez à une note autocollante que vous lisez puis détruisez :
# Valeur classique : stockée dans un fichierwith open("state.json", "w") as f: json.dump({"password": "S3cr3t!"}, f) # reste sur le disque
# Valeur éphémère : en mémoire seulementpassword = generate_password()use_password(password)del password # disparue, jamais écrite sur disqueephemeral c’est la variable locale qui n’est jamais sérialisée. Terraform la crée en mémoire, l’utilise pendant l’opération, puis la libère. Aucun fichier (state, plan, logs) ne contient cette valeur.
Pourquoi sensitive ne suffit pas
Section intitulée « Pourquoi sensitive ne suffit pas »Avec sensitive = true, un mot de passe reste lisible dans le state :
terraform show -json | python3 -c "import sys, jsond = json.load(sys.stdin)for k, v in d['values']['outputs'].items(): print(f'{k}: {v[\"value\"]}')"db_password: S3cr3t!P@ssw0rdLe state est le fichier que Terraform utilise pour suivre l’état de votre infrastructure. Toute personne ayant accès au state (fichier local, bucket S3, workspace HCP Terraform) voit le secret en clair. Les ressources éphémères résolvent ce problème : Terraform ne les écrit tout simplement pas dans le state.
Le bloc ephemeral
Section intitulée « Le bloc ephemeral »La syntaxe ressemble à un bloc resource, mais avec le mot-clé ephemeral :
ephemeral "random_password" "db_password" { length = 16 override_special = "!#$%&*()-_=+[]{}<>:?"}On référence la valeur avec ephemeral.<TYPE>.<NOM>.<ATTRIBUT> :
ephemeral.random_password.db_password.resultLe lifecycle : open → renew → close
Section intitulée « Le lifecycle : open → renew → close »Contrairement aux ressources classiques (create → read → update → delete), une ressource éphémère suit un cycle différent :
| Phase | Moment | Ce qui se passe |
|---|---|---|
| open | Début du plan ou de l’apply | Le provider crée la valeur temporaire |
| renew | Si la ressource a un TTL | Le provider renouvelle le bail avant expiration |
| close | Fin de l’opération Terraform | Le provider libère la ressource, Terraform oublie la valeur |
En pratique, vous verrez ce cycle dans la sortie Terraform :
ephemeral.random_password.db_password: Opening...ephemeral.random_password.db_password: Opening complete after 0sephemeral.random_password.db_password: Closing...ephemeral.random_password.db_password: Closing complete after 1sOù peut-on utiliser une valeur éphémère ?
Section intitulée « Où peut-on utiliser une valeur éphémère ? »Terraform restreint l’usage des valeurs éphémères à des contextes qui ne persistent pas les données :
| Contexte autorisé | Exemple |
|---|---|
Arguments write-only d’un resource | password_wo = ephemeral.random_password.db.result |
Autre bloc ephemeral | Un ephemeral qui référence un autre ephemeral |
locals | local.conn = "user:${ephemeral.random_password.db.result}@host" |
Variables ephemeral = true | Passer une valeur éphémère en entrée d’un module |
| Configuration d’un provider | Credentials éphémères dans un bloc provider |
| Provisioners | local-exec qui utilise la valeur pendant l’apply |
| Contexte interdit | Pourquoi |
|---|---|
Attributs classiques d’un resource | Terraform les stockerait dans le state |
Outputs du module racine (sans ephemeral = true) | La valeur serait persistée |
Bloc data | Le résultat est stocké dans le state |
Exemple : générer un mot de passe éphémère
Section intitulée « Exemple : générer un mot de passe éphémère »Cet exemple utilise uniquement le provider random, testable localement sans infrastructure cloud.
Configuration
Section intitulée « Configuration »Créez versions.tf :
terraform { required_version = ">= 1.11.0"
required_providers { random = { source = "hashicorp/random" version = "~> 3.0" } null = { source = "hashicorp/null" version = "~> 3.0" } }}Créez variables.tf :
variable "password_length" { description = "Longueur du mot de passe éphémère" type = number default = 16}Créez main.tf :
ephemeral "random_password" "db_password" { length = var.password_length override_special = "!#$%&*()-_=+[]{}<>:?"}
locals { db_connection = "postgres://admin:${ephemeral.random_password.db_password.result}@db:5432"}
resource "null_resource" "use_ephemeral" { triggers = { always = timestamp() }
provisioner "local-exec" { command = "echo 'Password length: ${var.password_length} — connection configured'" }}Vérification
Section intitulée « Vérification »terraform initterraform planVous verrez le lifecycle éphémère dans la sortie :
ephemeral.random_password.db_password: Opening...ephemeral.random_password.db_password: Opening complete after 0sephemeral.random_password.db_password: Closing...ephemeral.random_password.db_password: Closing complete after 1sAppliquez et vérifiez l’absence dans le state :
terraform apply -auto-approveterraform show -json | python3 -c "import sys, jsond = json.load(sys.stdin)outputs = d.get('values', {}).get('outputs', {})for k, v in outputs.items(): print(f'{k}: {v[\"value\"]}')"password_length: 16Le mot de passe éphémère n’apparaît nulle part dans le state. Seul password_length, qui est une variable normale, est stocké.
Les variables éphémères
Section intitulée « Les variables éphémères »Depuis Terraform 1.11, vous pouvez déclarer une variable comme éphémère avec ephemeral = true :
variable "api_token" { description = "Token d'API temporaire" type = string sensitive = true ephemeral = true}Une variable éphémère :
- n’est pas stockée dans le state ni dans le plan ;
- ne peut être utilisée que dans les contextes autorisés (write-only, locals, provider config, etc.) ;
- se combine naturellement avec
sensitive = truepour masquer aussi l’affichage CLI.
Les outputs éphémères (modules enfants)
Section intitulée « Les outputs éphémères (modules enfants) »Dans un module enfant, vous pouvez déclarer un output éphémère :
output "db_password" { description = "Mot de passe éphémère pour la base" value = ephemeral.random_password.db.result ephemeral = true}Le module parent peut alors utiliser module.credentials.db_password dans un contexte éphémère (write-only, provider config, etc.).
Meta-arguments supportés
Section intitulée « Meta-arguments supportés »Les blocs ephemeral supportent les mêmes meta-arguments que les blocs resource :
| Meta-argument | Usage avec ephemeral |
|---|---|
count | Créer N instances éphémères |
for_each | Itérer sur un ensemble de clés |
depends_on | Forcer l’ordre avec d’autres ressources |
provider | Choisir un alias de provider |
lifecycle | precondition et postcondition uniquement |
Exemple avec for_each
Section intitulée « Exemple avec for_each »variable "environments" { type = set(string) default = ["dev", "staging", "prod"]}
ephemeral "random_password" "per_env" { for_each = var.environments length = 20 override_special = "!#$%&*()-_=+[]{}<>:?"}Chaque environnement obtient son propre mot de passe éphémère, accessible via ephemeral.random_password.per_env["dev"].result.
Exemple avec precondition
Section intitulée « Exemple avec precondition »ephemeral "random_password" "validated" { length = var.password_length override_special = "!#$%&*()-_=+[]{}<>:?"
lifecycle { precondition { condition = var.password_length >= 12 error_message = "Le mot de passe doit faire au moins 12 caractères." } }}Anatomie
Section intitulée « Anatomie »| Concept | Bloc resource classique | Bloc ephemeral |
|---|---|---|
| Stocké dans le state | Oui | Non |
| Stocké dans le plan | Oui | Non |
| Lifecycle | create → read → update → delete | open → renew → close |
| Référence | resource_type.name.attr | ephemeral.type.name.attr |
| Meta-arguments | Tous | count, for_each, depends_on, provider, lifecycle (precondition/postcondition) |
Bonnes pratiques
Section intitulée « Bonnes pratiques »1. Préférer ephemeral à sensitive pour les secrets dynamiques
Section intitulée « 1. Préférer ephemeral à sensitive pour les secrets dynamiques »Si le secret est généré pendant l’opération Terraform (mot de passe, token, certificat), utilisez une ressource éphémère plutôt qu’une resource classique avec sensitive = true.
2. Combiner sensitive + ephemeral sur les variables d’entrée
Section intitulée « 2. Combiner sensitive + ephemeral sur les variables d’entrée »Pour un secret passé par l’utilisateur ou le CI/CD, déclarez la variable avec les deux attributs :
variable "vault_token" { type = string sensitive = true ephemeral = true}3. Utiliser les valeurs éphémères avec les arguments write-only
Section intitulée « 3. Utiliser les valeurs éphémères avec les arguments write-only »Le pattern complet est : ephemeral génère la valeur → write-only la transmet au provider → rien n’est stocké. La page suivante détaille ce mécanisme.
4. Ne pas contourner les restrictions de référence
Section intitulée « 4. Ne pas contourner les restrictions de référence »Si Terraform refuse d’utiliser une valeur éphémère dans un attribut de ressource, c’est pour une bonne raison : cet attribut serait persisté dans le state. Trouvez l’argument write-only correspondant ou repensez l’architecture.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Invalid use of ephemeral value | Valeur éphémère dans un attribut de ressource classique | Utiliser un argument write-only ou un provisioner |
Ephemeral output not allowed | Output ephemeral = true dans le module racine | Déplacer dans un module enfant ou supprimer ephemeral |
Le lifecycle n’affiche pas renew | La ressource éphémère n’a pas de TTL | Normal pour random_password — le renew concerne les connexions temporaires |
Provider does not support ephemeral resources | Version du provider trop ancienne | Mettre à jour le provider (random ≥ 3.7.0 pour ephemeral "random_password") |
À retenir
Section intitulée « À retenir »ephemeralcrée des ressources temporaires qui n’existent que pendant l’opération Terraform en cours.- Le lifecycle est différent des ressources classiques : open → renew → close au lieu de create → update → delete.
- Les valeurs éphémères ne peuvent être utilisées que dans des contextes qui ne persistent pas : write-only, locals, provider config, provisioners.
- Les variables éphémères (
ephemeral = true) permettent de passer un secret en entrée sans qu’il soit stocké dans le state. - Les outputs éphémères ne fonctionnent que dans les modules enfants, pas dans le module racine.