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

Dynamic credentials, tfe_outputs et run triggers

12 min de lecture

logo terraform

Stocker des clés cloud longue durée dans HCP Terraform fonctionne, mais pose un risque de sécurité : ces clés ne changent pas et peuvent fuiter. Les dynamic provider credentials résolvent ce problème en générant des tokens temporaires via OIDC à chaque run. Ce guide couvre aussi le partage d’état entre workspaces (tfe_outputs) et le chaînage automatique de runs (run triggers).

  • Le fonctionnement des dynamic credentials (OIDC workload identity)
  • Comment configurer les dynamic credentials pour AWS
  • Comment partager des outputs entre workspaces avec tfe_outputs
  • Comment chaîner l’exécution de workspaces avec les run triggers

Sans dynamic credentials, vous stockez des clés cloud (AWS access key, GCP service account key) dans des variables d’environnement du workspace. Ces clés :

  • ont une durée de vie longue (mois, voire années),
  • doivent être rotées manuellement,
  • sont identiques entre les runs (pas d’isolation),
  • constituent un risque si elles sont exfiltrées.

Les dynamic credentials fonctionnent avec OIDC (OpenID Connect) :

  1. Au début d’un run, HCP Terraform génère un workload identity token — un JWT signé qui identifie le workspace et le run.
  2. Ce token est envoyé au provider cloud (AWS, GCP, Azure) qui le vérifie.
  3. Le provider cloud échange le token contre des credentials temporaires, valides pour la durée du plan ou de l’apply en cours.
  4. Terraform utilise ces credentials temporaires pour le plan et l’apply.
  5. À la fin du run, les credentials expirent automatiquement.

Les providers supportés :

ProviderMécanisme côté cloud
AWSIAM OIDC identity provider + rôle IAM avec trust policy
GCPWorkload Identity Federation + service account
AzureFederated identity credential sur un App Registration
VaultJWT auth method
KubernetesOIDC provider sur le cluster

La configuration se fait en deux endroits : côté AWS (une seule fois) et côté HCP Terraform (par workspace ou variable set).

  1. Créez un OIDC identity provider dans IAM

    Dans la console AWS → IAMIdentity providersAdd provider :

    ChampValeur
    Provider typeOpenID Connect
    Provider URLhttps://app.terraform.io
    Audienceaws.workload.identity
  2. Créez un rôle IAM avec une trust policy

    Le rôle autorise HCP Terraform à assumer le rôle via le token OIDC :

    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Principal": {
    "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/app.terraform.io"
    },
    "Action": "sts:AssumeRoleWithWebIdentity",
    "Condition": {
    "StringEquals": {
    "app.terraform.io:aud": "aws.workload.identity"
    },
    "StringLike": {
    "app.terraform.io:sub": "organization:stephrobert-terraform-labs:project:*:workspace:*:run_phase:*"
    }
    }
    }
    ]
    }

    Le champ sub filtre les workspaces autorisés. Cet exemple de lab autorise tous les workspaces de l’organisation. En production, ciblez au moins l’organisation, le project, le workspace, et séparez si possible les rôles plan et apply.

  3. Attachez les permissions nécessaires au rôle

    Attachez une policy IAM qui donne les droits nécessaires (ex : AmazonEC2FullAccess pour un lab, ou des permissions minimales en production).

Ajoutez les variables d’environnement suivantes dans le workspace ou un variable set — c’est la configuration minimale viable :

VariableValeurType
TFC_AWS_PROVIDER_AUTHtrueEnvironment variable
TFC_AWS_RUN_ROLE_ARNarn:aws:iam::ACCOUNT_ID:role/terraform-hcp-roleEnvironment variable

Pensez aussi à définir la région AWS via l’argument region du provider ou via la variable AWS_REGION.

C’est tout pour le cas simple. Au prochain run, HCP Terraform génère automatiquement un token OIDC, assume le rôle AWS et utilise les credentials temporaires. Aucune clé statique n’est stockée.

Partager des données entre workspaces : tfe_outputs

Section intitulée « Partager des données entre workspaces : tfe_outputs »

Vos workspaces sont isolés par conception : le workspace « réseau » crée un VPC et le workspace « application » a besoin de l’ID de ce VPC pour déployer ses instances. Comment passer cette information ?

Le data source tfe_outputs lit les outputs d’un autre workspace de la même organisation. Il nécessite un provider tfe correctement authentifié :

data "tfe_outputs" "network" {
organization = "stephrobert-terraform-labs"
workspace = "production-networking"
}
resource "aws_instance" "app" {
subnet_id = data.tfe_outputs.network.nonsensitive_values.subnet_id
# ...
}

Pour que tfe_outputs fonctionne :

  • Le workspace source doit avoir des outputs définis et appliqués.
  • Le workspace consommateur doit disposer d’un provider tfe authentifié avec un token valide (TFE_TOKEN en variable d’environnement) et les permissions de lecture sur le workspace source. Les règles classiques de remote state sharing ne s’appliquent pas à tfe_outputs — c’est le token du provider tfe qui contrôle l’accès.
  • Les outputs marqués sensitive = true sont accessibles mais restent masqués dans les logs.

Workspace « réseau » — crée le VPC et expose l’ID :

output "vpc_id" {
value = aws_vpc.main.id
description = "ID du VPC principal"
}
output "subnet_ids" {
value = aws_subnet.private[*].id
description = "IDs des subnets privés"
}

Workspace « application » — consomme les outputs du workspace « réseau » :

data "tfe_outputs" "network" {
organization = "stephrobert-terraform-labs"
workspace = "production-networking"
}
resource "aws_instance" "app" {
ami = "ami-0abcdef1234567890"
instance_type = "t3.micro"
subnet_id = data.tfe_outputs.network.nonsensitive_values.subnet_ids[0]
tags = {
VPC = data.tfe_outputs.network.nonsensitive_values.vpc_id
}
}

Quand le workspace « réseau » change un subnet, le workspace « application » doit recalculer son plan pour vérifier que tout est cohérent. Sans automatisation, il faut penser à lancer manuellement un run dans chaque workspace dépendant.

Un run trigger configure une relation « quand le workspace source termine un apply, le workspace dépendant démarre automatiquement un run ».

Dans le workspace dépendant (celui qui doit réagir) :

  1. Allez dans Settings → Run Triggers.
  2. Ajoutez le workspace source (celui qui déclenche).

Quand le workspace source termine un apply avec succès, le workspace dépendant démarre automatiquement un run.

Workspace sourceWorkspace dépendantCe qui se passe
production-networkingproduction-appUn apply du réseau déclenche un plan de l’application
production-networkingproduction-monitoringUn apply du réseau déclenche un plan du monitoring
  • Les run triggers déclenchent un plan (pas un apply direct). Par défaut, l’apply nécessite une approbation si le workspace est en manual apply.
  • Il existe un réglage dédié Auto-apply run triggers dans les settings du workspace, indépendant du réglage principal d’auto-apply. Activez-le si vous voulez que les runs déclenchés par trigger s’appliquent automatiquement.
  • Évitez les chaînes circulaires : A déclenche B qui déclenche A → boucle infinie.
  • Un workspace peut avoir jusqu’à 20 run triggers en source.

En pratique, les dynamic credentials, tfe_outputs et les run triggers s’utilisent ensemble :

MécanismeCe qu’il résout
Dynamic credentialsS’authentifier auprès du cloud sans clés statiques
tfe_outputsLire les données produites par un autre workspace
Run triggersDéclencher automatiquement un recalcul quand une dépendance change

Exemple de chaîne complète :

  1. Le workspace networking s’authentifie via dynamic credentials et crée un VPC.
  2. Le workspace app lit le VPC ID via tfe_outputs et déploie les instances.
  3. Un run trigger garantit que tout changement dans networking déclenche un nouveau plan dans app.
SymptômeCause probableSolution
Error: could not assume role lors du planTrust policy AWS mal configuréeVérifiez le champ sub et l’ARN du provider OIDC
Error: Unauthorized sur tfe_outputsToken tfe manquant ou insuffisantVérifiez que TFE_TOKEN est défini dans le workspace consommateur avec les bonnes permissions
Le run trigger ne se déclenche pasLe workspace source a fait un plan sans applyLes run triggers ne se déclenchent que sur un apply réussi
Credentials temporaires expiréesRun trop longAugmentez la durée de session dans la trust policy AWS
tfe_outputs retourne des valeurs videsLe workspace source n’a pas encore fait d’applyLancez un apply dans le workspace source d’abord
Boucle infinie de run triggersChaîne circulaire A → B → ASupprimez le trigger circulaire
  • Les dynamic credentials génèrent des tokens temporaires via OIDC à chaque run — plus besoin de clés cloud statiques. Disponibles en édition gratuite.
  • Côté AWS, la configuration nécessite un OIDC identity provider et un rôle IAM avec trust policy. Vérifiez toujours aud et l’organisation dans le sub. Côté HCP Terraform, deux variables d’environnement suffisent pour un cas simple.
  • tfe_outputs lit les outputs d’un autre workspace via le provider tfe authentifié (token TFE_TOKEN). Préférez-le à terraform_remote_state pour limiter l’exposition.
  • Les run triggers chaînent les runs entre workspaces : un apply dans le workspace source déclenche un plan dans le workspace dépendant. Le réglage Auto-apply run triggers permet l’apply automatique.
  • Ces trois mécanismes se combinent naturellement : credentials sans clé, partage de données, déclenchement automatique.
  • Évitez les chaînes circulaires de run triggers.

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