<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rémi Collignon-Ducret, Author at Clever Cloud</title>
	<atom:link href="https://www.clever.cloud/fr/blog/author/remi-collignon-ducretclever-cloud-com/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>From Code to Product</description>
	<lastBuildDate>Tue, 03 Nov 2026 14:00:39 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://cdn.clever-cloud.com/uploads/2023/03/cropped-cropped-favicon-32x32.png</url>
	<title>Rémi Collignon-Ducret, Author at Clever Cloud</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>De la Console à Terraform : importer votre infrastructure Clever Cloud existante en Infrastructure as Code (IaC)</title>
		<link>https://www.clever.cloud/fr/blog/engineering-fr/2026/11/03/terraform-import-infrastructure-as-code/</link>
		
		<dc:creator><![CDATA[Rémi Collignon-Ducret]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 13:59:03 +0000</pubDate>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[terraform]]></category>
		<guid isPermaLink="false">https://www.clever.cloud/?p=25949</guid>

					<description><![CDATA[<p><img width="2400" height="1065" src="https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="2026.11.03 Clever Cloud Bannière Blog Import Terraform FR" decoding="async" fetchpriority="high" srcset="https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr.png 2400w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-300x133.png 300w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-1024x454.png 1024w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-768x341.png 768w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-1536x682.png 1536w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-2048x909.png 2048w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-1368x607.png 1368w" sizes="(max-width: 2400px) 100vw, 2400px" /></p><!-- wp:paragraph -->
<p>C'est précisément le moment où l'Infrastructure as Code (l’IaC, le fait de définir ses ressources sous forme de fichiers que l’on peut versionner et qui font office d'autorité) devient une évidence, et où l'on découvre que Terraform ne sait rien de ce qui existe déjà.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Jusqu'ici, rattraper ce retard coûtait cher : une commande <code>terraform import</code> par ressource, un bloc HCL à écrire à la main pour chacune, attribut par attribut, et un <code>plan</code> qui propose de tout détruire à la moindre ligne oubliée. Quarante ressources, une journée perdue. Clever Tools 5.3 et la version 3.0 de <a href="https://www.clever.cloud/fr/product/terraform/">notre provider Terraform</a> ramènent l'opération à trois commandes, <code>clever features</code>, <code>clever terraform generate</code> et <code>terraform plan</code>. Voici comment les enchaîner, et surtout ce qu'il faut vérifier avant d'appliquer.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Ce dont vous avez besoin</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Trois outils suffisent : Terraform 1.5 ou plus récent (ou <a href="https://www.clever.cloud/fr/blog/engineering-fr/2026/03/25/opentofu-le-fork-open-source-de-terraform/">OpenTofu</a> 1.6, le fork de Terraform, ou plus récent, qui implémente les fameux blocs d'import (import blocks)), Clever Tools 5.3 et le provider Clever Cloud en version 3.0. La commande qui nous intéresse est encore en bêta, il faut donc l'activer explicitement :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>npm install -g clever-tools@latest
clever login
clever features enable terraform</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Un mot sur notre provider</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Open source dès ses débuts, publié sur les registries Terraform et OpenTofu, il couvre aujourd'hui l'essentiel de la plateforme : les runtimes, les bases de données et les add-ons managés, le <a href="https://www.clever.cloud/fr/product/stockage-objet-cellar/">stockage objet</a> et les FS Buckets, les drains de logs, les <a href="https://www.clever.cloud/fr/product/network-groups/">Network Groups</a>, les <a href="https://www.clever.cloud/fr/clever-kubernetes-engine/">clusters Kubernetes</a> et jusqu'aux consumers OAuth. Au-delà du provisionnement, il sait déployer votre code depuis un dépôt Git et épingler un commit, lier une application à ses add-ons comme le fait <code>clever service link-addon</code>, lire l'adresse du load balancer pour vos entrées DNS ou parcourir les sauvegardes d'une base. Depuis la version 3.0, il accepte un token d'API pour s'intégrer à une CI, et avec Terraform 1.14 et plus, ses actions redémarrent une application, exécutent une requête SQL sur un PostgreSQL ou envoient des fichiers dans un FS Bucket sans sortir d'un <code>terraform apply</code>. 48 ressources, deux data sources, trois actions : de quoi décrire une organisation entière, et pas seulement l'importer.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Étape 1 : déclarer le provider Terraform Clever Cloud</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Dans un répertoire vide, un fichier <code>provider.tf</code> :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>terraform {
  required_providers {
    clevercloud = {
      source  = "CleverCloud/clevercloud"
      version = "~&gt; 3.0"
    }
  }
}
 
provider "clevercloud" {}</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Le bloc provider reste vide : après un <code>clever login</code>, le provider réutilise les identifiants du profil actif de Clever Tools. Il ne lui manque que l'organisation à cibler, passée par une variable d'environnement (un identifiant <code>user_…</code> fonctionne aussi pour un espace personnel) :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>export CC_ORGANISATION="orga_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
terraform init</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Étape 2 : générer les blocs import avec clever terraform generate</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>C'est ici qu'intervient la nouveauté de Clever Tools 5.3. La commande <code>clever terraform</code> generate parcourt une organisation et écrit, pour chaque application et chaque add-on, le bloc <code>import</code> que Terraform attend :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>clever terraform generate --org orga_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx &gt; imports.tf</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Le fichier obtenu ressemble à ceci :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code># mon-api
import {
  to = clevercloud_nodejs.mon-api
  id = "app_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
 
# ma-base
import {
  to = clevercloud_postgresql.ma-base
  id = "postgresql_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Chaque application est rattachée à la ressource de son runtime (<code>clevercloud_nodejs</code>, <code>clevercloud_php</code>, <code>clevercloud_docker</code>, <code>clevercloud_java_maven</code>…), chaque add-on à la sienne (<code>clevercloud_postgresql</code>, <code>clevercloud_redis</code>, <code>clevercloud_cellar</code>…).</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>La commande fait aussi le tri à votre place. Un Keycloak, un Matomo, un Metabase ou un Otoroshi provisionnent leur propre application et leurs propres bases ; un Elasticsearch vient avec son Kibana. Ces ressources apparaissent dans votre organisation comme les autres, mais elles appartiennent à l'add-on qui les gère : les importer reviendrait à les confier à Terraform, qui se mettrait à les modifier en parallèle. <code>clever terraform generate</code> les ignore et le signale sur la sortie d'erreur, comme il signale les quelques runtimes qui n'ont pas encore d'équivalent dans le provider. Rien n'est écarté en silence.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Les noms Terraform sont dérivés de ceux de vos ressources : passés en minuscules, débarrassés des caractères spéciaux, préfixés d’un _ s’ils commencent par un chiffre. Deux ressources de même type et de même nom, deux applications « demo » par exemple, ne peuvent pas cohabiter dans une configuration : la seconde reçoit un suffixe tiré de son identifiant (<code>demo-11ced66e</code>), et la sortie d’erreur le signale (« Name collision on nodejs.demo: suffixing with 11ced66e »). Ces noms ne sont que des étiquettes dans votre code : renommez-les à votre convenance dans <code>imports.tf</code> avant l’étape 3, Terraform générera la configuration sous le nouveau nom.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Pour une adoption progressive, vous pouvez limiter la génération à une seule application, ou aux ressources portant un tag :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>clever terraform generate --app mon-api &gt; imports.tf
clever terraform generate --tag env:staging &gt; imports.tf</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Étape 3 : générer la configuration HCL avec terraform plan</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Depuis sa version 1.5, Terraform sait rédiger lui-même la configuration des ressources déclarées dans des blocs <code>import</code> :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>terraform plan -generate-config-out=generated.tf</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Terraform lit chaque ressource sur la plateforme, en écrit le bloc HCL dans <code>generated.tf</code> (le fichier ne doit pas exister au préalable) et affiche le plan correspondant, sans rien écrire dans le state. Le fichier contient les vraies valeurs : nom, région, nombre d'instances, flavors, plan de l'add-on, dépendances.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Ce point mérite une précision. Sur une application, <code>min_instance_count</code>, <code>max_instance_count</code>, <code>smallest_flavor</code> et <code>biggest_flavor</code> sont obligatoires, comme plan sur un add-on, et le provider ne les déduira jamais tout seul. Ces attributs déterminent ce que la ressource coûte : nous refusons qu'une configuration reste muette à leur sujet et adopte, sans le dire, ce que la plateforme fait tourner. C'est aussi la raison de préférer les blocs import à la commande <code>terraform import</code>, qui écrit directement dans le state et vous laisse rédiger la configuration complète, sous peine d'un <code>Missing required argument</code> au <code>plan</code> suivant.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Secrets et variables d’environnement : le piège de l’import Terraform</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>C'est l'étape où il faut ralentir. Terraform ne recopie jamais dans une configuration générée une valeur que le provider déclare sensible, et les variables d'environnement d'une application en font partie. Le fichier généré contient donc, pour chaque application :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>resource "clevercloud_nodejs" "mon-api" {
  name               = "mon-api"
  region             = "par"
  min_instance_count = 1
  max_instance_count = 2
  smallest_flavor    = "XS"
  biggest_flavor     = "M"
  environment        = null # sensitive
}</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p><strong>Appliquer ce fichier tel quel supprimerait toutes les variables d'environnement de l'application.</strong> Le provider offre une variable d'environnement pour contourner ce comportement le temps de la génération :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>BYPASS_SENSITIVE_IMPORTS=true terraform plan -generate-config-out=generated.tf</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Les attributs sensibles sont alors écrits comme les autres, et <code>environment</code> contient toutes vos variables, en clair. Et pas seulement dans le fichier : tant que la variable est définie, la sortie de <code>terraform plan</code> affiche elle aussi ces valeurs en clair. Lancez cette étape depuis votre poste, jamais dans un pipeline de CI dont les logs sont conservés.  C'est exactement ce que nous voulions, et c'est aussi ce qui demande de la vigilance : clés d'API, mots de passe de bases de données externes, tokens de services tiers, tout ce que vous aviez confié à <code>clever env set</code> se retrouve dans un fichier <code>.tf</code> que vous vous apprêtez à versionner.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Avant le premier commit, passez ces variables en revue. Les valeurs de configuration ordinaires (<code>NODE_ENV</code>, un port, une URL publique) peuvent rester dans le code. Les secrets doivent en sortir, vers l'outil que votre équipe utilise déjà : HashiCorp Vault ou OpenBao, les variables protégées de votre CI, un fichier chiffré avec SOPS, ou au minimum des variables Terraform marquées <code>sensitive</code> et fournies au moment de l'exécution :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>variable "stripe_api_key" {
  type      = string
  sensitive = true
}
 
resource "clevercloud_nodejs" "mon-api" {
  # ...
  environment = {
    NODE_ENV       = "production"
    STRIPE_API_KEY = var.stripe_api_key
  }
}</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce remplacement devient visible au <code>plan</code> suivant : Terraform annonce une mise à jour d'environnement, alors que la valeur n’a pas changé. Il enregistre seulement dans le state que cette valeur est désormais sensible. Le provider, lui, compare les valeurs et non leur statut : identiques, elles ne déclenchent aucun redémarrage de l’application.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Retirez <code>BYPASS_SENSITIVE_IMPORTS</code> dès que <code>generated.tf</code> est écrit : la configuration reste valide sans elle, et le provider affiche l’avertissement « Sensitive attributes are not redacted » à chaque commande tant que la variable est définie. Quant au state Terraform, il contient toujours ces valeurs, quel que soit votre choix : son stockage mérite la même attention que les secrets eux-mêmes.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Étape 4 : vérifier le plan, puis appliquer</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Une fois <code>generated.tf</code> relu et nettoyé, un <code>terraform plan</code> sans la variable de contournement doit annoncer autant d'imports que de ressources, et aucune autre modification que les <code>environment</code> que vous venez de déclarer secret :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>terraform plan
# Plan: 2 to import, 0 to add, 1 to change, 0 to destroy.
# ~ environment = (sensitive value) valeur inchangée, statut sensible enregistré
terraform apply</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Tout autre changement signale qu’un attribut de la configuration diverge de ce que la plateforme fait tourner : lisez-le avant de confirmer.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>L’<code>apply</code> inscrit alors les ressources dans le state et, pour les secrets passés en variables, y note leur statut sensible ; il ne touche à rien sur la plateforme. Un dernier <code>terraform plan</code> doit répondre « No changes » : votre infrastructure est désormais décrite dans du code, et les blocs <code>import</code> peuvent être supprimés.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Le déploiement du code reste votre décision</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Un import ne remplit jamais le bloc <code>deployment</code> d'une application. Le provider ne peut pas deviner si vous souhaitez que Terraform gère aussi vos déploiements, et l'ajout de ce bloc déclenche un déploiement au premier <code>apply</code>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Trois options s'offrent à vous. Ne rien ajouter : Terraform gère la configuration, vous continuez à déployer avec <code>git push</code> ou <code>clever deploy</code>, et un changement de variable redémarre l'application comme aujourd'hui. Déclarer <code>commit = "github_hook"</code> si l'application est liée à un dépôt GitHub : les déploiements restent entre les mains de GitHub, le provider ne pousse jamais de code. Ou confier le déploiement à Terraform avec <code>repository</code> et, si vous le souhaitez, un <code>commit</code> précis. Dans ce dernier cas, un token d'API (<code>clever tokens create</code>) ne suffit pas, car il ne peut pas pousser sur Git : le provider a besoin des identifiants OAuth du profil Clever Tools.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Après l'import</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>generated.tf</code> est un point de départ, pas une configuration finie. Quelques gestes le rendent durable : découper le fichier par service ou par environnement, remplacer les identifiants en dur du champ <code>dependencies</code> par des références (<code>clevercloud_postgresql.ma-base.id</code>), extraire en variables ce qui diffère entre staging et production. Et puisque la commande est en bêta, vos retours sont les bienvenus sur le <a href="https://github.com/CleverCloud/clever-tools/issues">dépôt GitHub de Clever Tools</a> : c'est ainsi qu'elle sortira du mode expérimental.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Reste la question du state, que vous confiez aujourd'hui à un bucket S3 ou à un backend tiers. Nous n'en dirons pas plus pour l'instant, sinon qu'il pourrait bientôt ne plus avoir à quitter Clever Cloud.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">FAQ</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">L'import modifie-t-il mes applications ?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Non. Les blocs <code>import</code> n’écrivent que dans le state. La seule mise à jour attendue porte sur <code>environment</code> lorsque vous avez remplacé un secret par une variable <code>sensitive</code> : la valeur est identique et le provider ne redémarre pas l’application. Le seul risque réel est d'appliquer une configuration où <code>environment</code> vaut <code>null</code> : c'est tout l'objet de la section sur les secrets.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Puis-je n'importer qu'une partie de mon organisation ?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Oui, avec <code>--app</code> pour une application ou <code>--tag</code> pour les ressources portant un tag. Rien n'oblige à tout migrer en une fois.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading"><strong>Pourquoi certaines ressources manquent-elles dans imports.tf ?</strong></h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Soit elles sont gérées par un add-on (l'application d'un Keycloak, le Kibana d'un Elasticsearch) et Terraform ne doit pas les prendre en charge, soit leur runtime n'a pas encore de ressource dans le provider. Dans les deux cas, la commande l'indique sur la sortie d'erreur.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Cela fonctionne-t-il avec OpenTofu, le fork de Terraform ?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Oui. OpenTofu implémente les blocs <code>import</code> et l'option <code>-generate-config-out</code> depuis sa version 1.6, et notre provider est disponible sur son registry.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Faut-il conserver les blocs import ?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Non. Une fois les ressources dans le state, ils ne servent plus et peuvent être supprimés.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><em>Clever Tools 5.3 est open source sur</em> <a href="https://github.com/CleverCloud/clever-tools"><em>GitHub</em></a><em>, disponible sur</em> <a href="https://www.npmjs.com/package/clever-tools"><em>npm</em></a> <em>et dans nos dépôts de paquets. Le provider Clever Cloud est publié sur le</em> <a href="https://registry.terraform.io/providers/CleverCloud/clevercloud/latest"><em>Terraform Registry</em></a><em>, son code est sur</em> <a href="https://github.com/CleverCloud/terraform-provider-clevercloud"><em>GitHub</em></a><em>, et la documentation complète est disponible sur</em> <a href="https://www.clever.cloud/developers/doc/tools/terraform/"><em>www.clever.cloud/developers</em></a><em>.</em></p>
<!-- /wp:paragraph -->]]></description>
										<content:encoded><![CDATA[<p><img width="2400" height="1065" src="https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="2026.11.03 Clever Cloud Bannière Blog Import Terraform FR" decoding="async" srcset="https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr.png 2400w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-300x133.png 300w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-1024x454.png 1024w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-768x341.png 768w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-1536x682.png 1536w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-2048x909.png 2048w, https://cdn.clever-cloud.com/uploads/2026/11/2026-11-03-clever-cloud-banniere-blog-import-terraform-fr-1368x607.png 1368w" sizes="(max-width: 2400px) 100vw, 2400px" /></p><!-- wp:paragraph -->
<p>C'est précisément le moment où l'Infrastructure as Code (l’IaC, le fait de définir ses ressources sous forme de fichiers que l’on peut versionner et qui font office d'autorité) devient une évidence, et où l'on découvre que Terraform ne sait rien de ce qui existe déjà.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Jusqu'ici, rattraper ce retard coûtait cher : une commande <code>terraform import</code> par ressource, un bloc HCL à écrire à la main pour chacune, attribut par attribut, et un <code>plan</code> qui propose de tout détruire à la moindre ligne oubliée. Quarante ressources, une journée perdue. Clever Tools 5.3 et la version 3.0 de <a href="https://www.clever.cloud/fr/product/terraform/">notre provider Terraform</a> ramènent l'opération à trois commandes, <code>clever features</code>, <code>clever terraform generate</code> et <code>terraform plan</code>. Voici comment les enchaîner, et surtout ce qu'il faut vérifier avant d'appliquer.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Ce dont vous avez besoin</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Trois outils suffisent : Terraform 1.5 ou plus récent (ou <a href="https://www.clever.cloud/fr/blog/engineering-fr/2026/03/25/opentofu-le-fork-open-source-de-terraform/">OpenTofu</a> 1.6, le fork de Terraform, ou plus récent, qui implémente les fameux blocs d'import (import blocks)), Clever Tools 5.3 et le provider Clever Cloud en version 3.0. La commande qui nous intéresse est encore en bêta, il faut donc l'activer explicitement :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>npm install -g clever-tools@latest
clever login
clever features enable terraform</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Un mot sur notre provider</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Open source dès ses débuts, publié sur les registries Terraform et OpenTofu, il couvre aujourd'hui l'essentiel de la plateforme : les runtimes, les bases de données et les add-ons managés, le <a href="https://www.clever.cloud/fr/product/stockage-objet-cellar/">stockage objet</a> et les FS Buckets, les drains de logs, les <a href="https://www.clever.cloud/fr/product/network-groups/">Network Groups</a>, les <a href="https://www.clever.cloud/fr/clever-kubernetes-engine/">clusters Kubernetes</a> et jusqu'aux consumers OAuth. Au-delà du provisionnement, il sait déployer votre code depuis un dépôt Git et épingler un commit, lier une application à ses add-ons comme le fait <code>clever service link-addon</code>, lire l'adresse du load balancer pour vos entrées DNS ou parcourir les sauvegardes d'une base. Depuis la version 3.0, il accepte un token d'API pour s'intégrer à une CI, et avec Terraform 1.14 et plus, ses actions redémarrent une application, exécutent une requête SQL sur un PostgreSQL ou envoient des fichiers dans un FS Bucket sans sortir d'un <code>terraform apply</code>. 48 ressources, deux data sources, trois actions : de quoi décrire une organisation entière, et pas seulement l'importer.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Étape 1 : déclarer le provider Terraform Clever Cloud</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Dans un répertoire vide, un fichier <code>provider.tf</code> :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>terraform {
  required_providers {
    clevercloud = {
      source  = "CleverCloud/clevercloud"
      version = "~&gt; 3.0"
    }
  }
}
 
provider "clevercloud" {}</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Le bloc provider reste vide : après un <code>clever login</code>, le provider réutilise les identifiants du profil actif de Clever Tools. Il ne lui manque que l'organisation à cibler, passée par une variable d'environnement (un identifiant <code>user_…</code> fonctionne aussi pour un espace personnel) :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>export CC_ORGANISATION="orga_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
terraform init</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Étape 2 : générer les blocs import avec clever terraform generate</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>C'est ici qu'intervient la nouveauté de Clever Tools 5.3. La commande <code>clever terraform</code> generate parcourt une organisation et écrit, pour chaque application et chaque add-on, le bloc <code>import</code> que Terraform attend :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>clever terraform generate --org orga_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx &gt; imports.tf</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Le fichier obtenu ressemble à ceci :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code># mon-api
import {
  to = clevercloud_nodejs.mon-api
  id = "app_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
 
# ma-base
import {
  to = clevercloud_postgresql.ma-base
  id = "postgresql_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Chaque application est rattachée à la ressource de son runtime (<code>clevercloud_nodejs</code>, <code>clevercloud_php</code>, <code>clevercloud_docker</code>, <code>clevercloud_java_maven</code>…), chaque add-on à la sienne (<code>clevercloud_postgresql</code>, <code>clevercloud_redis</code>, <code>clevercloud_cellar</code>…).</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>La commande fait aussi le tri à votre place. Un Keycloak, un Matomo, un Metabase ou un Otoroshi provisionnent leur propre application et leurs propres bases ; un Elasticsearch vient avec son Kibana. Ces ressources apparaissent dans votre organisation comme les autres, mais elles appartiennent à l'add-on qui les gère : les importer reviendrait à les confier à Terraform, qui se mettrait à les modifier en parallèle. <code>clever terraform generate</code> les ignore et le signale sur la sortie d'erreur, comme il signale les quelques runtimes qui n'ont pas encore d'équivalent dans le provider. Rien n'est écarté en silence.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Les noms Terraform sont dérivés de ceux de vos ressources : passés en minuscules, débarrassés des caractères spéciaux, préfixés d’un _ s’ils commencent par un chiffre. Deux ressources de même type et de même nom, deux applications « demo » par exemple, ne peuvent pas cohabiter dans une configuration : la seconde reçoit un suffixe tiré de son identifiant (<code>demo-11ced66e</code>), et la sortie d’erreur le signale (« Name collision on nodejs.demo: suffixing with 11ced66e »). Ces noms ne sont que des étiquettes dans votre code : renommez-les à votre convenance dans <code>imports.tf</code> avant l’étape 3, Terraform générera la configuration sous le nouveau nom.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Pour une adoption progressive, vous pouvez limiter la génération à une seule application, ou aux ressources portant un tag :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>clever terraform generate --app mon-api &gt; imports.tf
clever terraform generate --tag env:staging &gt; imports.tf</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Étape 3 : générer la configuration HCL avec terraform plan</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Depuis sa version 1.5, Terraform sait rédiger lui-même la configuration des ressources déclarées dans des blocs <code>import</code> :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>terraform plan -generate-config-out=generated.tf</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Terraform lit chaque ressource sur la plateforme, en écrit le bloc HCL dans <code>generated.tf</code> (le fichier ne doit pas exister au préalable) et affiche le plan correspondant, sans rien écrire dans le state. Le fichier contient les vraies valeurs : nom, région, nombre d'instances, flavors, plan de l'add-on, dépendances.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Ce point mérite une précision. Sur une application, <code>min_instance_count</code>, <code>max_instance_count</code>, <code>smallest_flavor</code> et <code>biggest_flavor</code> sont obligatoires, comme plan sur un add-on, et le provider ne les déduira jamais tout seul. Ces attributs déterminent ce que la ressource coûte : nous refusons qu'une configuration reste muette à leur sujet et adopte, sans le dire, ce que la plateforme fait tourner. C'est aussi la raison de préférer les blocs import à la commande <code>terraform import</code>, qui écrit directement dans le state et vous laisse rédiger la configuration complète, sous peine d'un <code>Missing required argument</code> au <code>plan</code> suivant.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Secrets et variables d’environnement : le piège de l’import Terraform</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>C'est l'étape où il faut ralentir. Terraform ne recopie jamais dans une configuration générée une valeur que le provider déclare sensible, et les variables d'environnement d'une application en font partie. Le fichier généré contient donc, pour chaque application :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>resource "clevercloud_nodejs" "mon-api" {
  name               = "mon-api"
  region             = "par"
  min_instance_count = 1
  max_instance_count = 2
  smallest_flavor    = "XS"
  biggest_flavor     = "M"
  environment        = null # sensitive
}</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p><strong>Appliquer ce fichier tel quel supprimerait toutes les variables d'environnement de l'application.</strong> Le provider offre une variable d'environnement pour contourner ce comportement le temps de la génération :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>BYPASS_SENSITIVE_IMPORTS=true terraform plan -generate-config-out=generated.tf</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Les attributs sensibles sont alors écrits comme les autres, et <code>environment</code> contient toutes vos variables, en clair. Et pas seulement dans le fichier : tant que la variable est définie, la sortie de <code>terraform plan</code> affiche elle aussi ces valeurs en clair. Lancez cette étape depuis votre poste, jamais dans un pipeline de CI dont les logs sont conservés.  C'est exactement ce que nous voulions, et c'est aussi ce qui demande de la vigilance : clés d'API, mots de passe de bases de données externes, tokens de services tiers, tout ce que vous aviez confié à <code>clever env set</code> se retrouve dans un fichier <code>.tf</code> que vous vous apprêtez à versionner.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Avant le premier commit, passez ces variables en revue. Les valeurs de configuration ordinaires (<code>NODE_ENV</code>, un port, une URL publique) peuvent rester dans le code. Les secrets doivent en sortir, vers l'outil que votre équipe utilise déjà : HashiCorp Vault ou OpenBao, les variables protégées de votre CI, un fichier chiffré avec SOPS, ou au minimum des variables Terraform marquées <code>sensitive</code> et fournies au moment de l'exécution :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>variable "stripe_api_key" {
  type      = string
  sensitive = true
}
 
resource "clevercloud_nodejs" "mon-api" {
  # ...
  environment = {
    NODE_ENV       = "production"
    STRIPE_API_KEY = var.stripe_api_key
  }
}</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Ce remplacement devient visible au <code>plan</code> suivant : Terraform annonce une mise à jour d'environnement, alors que la valeur n’a pas changé. Il enregistre seulement dans le state que cette valeur est désormais sensible. Le provider, lui, compare les valeurs et non leur statut : identiques, elles ne déclenchent aucun redémarrage de l’application.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Retirez <code>BYPASS_SENSITIVE_IMPORTS</code> dès que <code>generated.tf</code> est écrit : la configuration reste valide sans elle, et le provider affiche l’avertissement « Sensitive attributes are not redacted » à chaque commande tant que la variable est définie. Quant au state Terraform, il contient toujours ces valeurs, quel que soit votre choix : son stockage mérite la même attention que les secrets eux-mêmes.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Étape 4 : vérifier le plan, puis appliquer</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Une fois <code>generated.tf</code> relu et nettoyé, un <code>terraform plan</code> sans la variable de contournement doit annoncer autant d'imports que de ressources, et aucune autre modification que les <code>environment</code> que vous venez de déclarer secret :</p>
<!-- /wp:paragraph -->

<!-- wp:html -->
<div style="
    max-width: 780px;
    margin: 1.5rem auto;
    padding: 16px 20px;
    background: #0f172a;
    color: #e5eefc;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 12px;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI',
      Roboto, 'Helvetica Neue', Arial, sans-serif;
    font-size: 15px;
    line-height: 1.7;
  ">
  <pre style="
      margin: 0;
      overflow-x: auto;
      white-space: pre-wrap;
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
        'Liberation Mono', 'Courier New', monospace;
    "><code>terraform plan
# Plan: 2 to import, 0 to add, 1 to change, 0 to destroy.
# ~ environment = (sensitive value) valeur inchangée, statut sensible enregistré
terraform apply</code></pre>
</div>
<!-- /wp:html -->

<!-- wp:paragraph -->
<p>Tout autre changement signale qu’un attribut de la configuration diverge de ce que la plateforme fait tourner : lisez-le avant de confirmer.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>L’<code>apply</code> inscrit alors les ressources dans le state et, pour les secrets passés en variables, y note leur statut sensible ; il ne touche à rien sur la plateforme. Un dernier <code>terraform plan</code> doit répondre « No changes » : votre infrastructure est désormais décrite dans du code, et les blocs <code>import</code> peuvent être supprimés.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Le déploiement du code reste votre décision</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Un import ne remplit jamais le bloc <code>deployment</code> d'une application. Le provider ne peut pas deviner si vous souhaitez que Terraform gère aussi vos déploiements, et l'ajout de ce bloc déclenche un déploiement au premier <code>apply</code>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Trois options s'offrent à vous. Ne rien ajouter : Terraform gère la configuration, vous continuez à déployer avec <code>git push</code> ou <code>clever deploy</code>, et un changement de variable redémarre l'application comme aujourd'hui. Déclarer <code>commit = "github_hook"</code> si l'application est liée à un dépôt GitHub : les déploiements restent entre les mains de GitHub, le provider ne pousse jamais de code. Ou confier le déploiement à Terraform avec <code>repository</code> et, si vous le souhaitez, un <code>commit</code> précis. Dans ce dernier cas, un token d'API (<code>clever tokens create</code>) ne suffit pas, car il ne peut pas pousser sur Git : le provider a besoin des identifiants OAuth du profil Clever Tools.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Après l'import</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>generated.tf</code> est un point de départ, pas une configuration finie. Quelques gestes le rendent durable : découper le fichier par service ou par environnement, remplacer les identifiants en dur du champ <code>dependencies</code> par des références (<code>clevercloud_postgresql.ma-base.id</code>), extraire en variables ce qui diffère entre staging et production. Et puisque la commande est en bêta, vos retours sont les bienvenus sur le <a href="https://github.com/CleverCloud/clever-tools/issues">dépôt GitHub de Clever Tools</a> : c'est ainsi qu'elle sortira du mode expérimental.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Reste la question du state, que vous confiez aujourd'hui à un bucket S3 ou à un backend tiers. Nous n'en dirons pas plus pour l'instant, sinon qu'il pourrait bientôt ne plus avoir à quitter Clever Cloud.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">FAQ</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">L'import modifie-t-il mes applications ?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Non. Les blocs <code>import</code> n’écrivent que dans le state. La seule mise à jour attendue porte sur <code>environment</code> lorsque vous avez remplacé un secret par une variable <code>sensitive</code> : la valeur est identique et le provider ne redémarre pas l’application. Le seul risque réel est d'appliquer une configuration où <code>environment</code> vaut <code>null</code> : c'est tout l'objet de la section sur les secrets.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Puis-je n'importer qu'une partie de mon organisation ?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Oui, avec <code>--app</code> pour une application ou <code>--tag</code> pour les ressources portant un tag. Rien n'oblige à tout migrer en une fois.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading"><strong>Pourquoi certaines ressources manquent-elles dans imports.tf ?</strong></h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Soit elles sont gérées par un add-on (l'application d'un Keycloak, le Kibana d'un Elasticsearch) et Terraform ne doit pas les prendre en charge, soit leur runtime n'a pas encore de ressource dans le provider. Dans les deux cas, la commande l'indique sur la sortie d'erreur.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Cela fonctionne-t-il avec OpenTofu, le fork de Terraform ?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Oui. OpenTofu implémente les blocs <code>import</code> et l'option <code>-generate-config-out</code> depuis sa version 1.6, et notre provider est disponible sur son registry.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Faut-il conserver les blocs import ?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Non. Une fois les ressources dans le state, ils ne servent plus et peuvent être supprimés.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><em>Clever Tools 5.3 est open source sur</em> <a href="https://github.com/CleverCloud/clever-tools"><em>GitHub</em></a><em>, disponible sur</em> <a href="https://www.npmjs.com/package/clever-tools"><em>npm</em></a> <em>et dans nos dépôts de paquets. Le provider Clever Cloud est publié sur le</em> <a href="https://registry.terraform.io/providers/CleverCloud/clevercloud/latest"><em>Terraform Registry</em></a><em>, son code est sur</em> <a href="https://github.com/CleverCloud/terraform-provider-clevercloud"><em>GitHub</em></a><em>, et la documentation complète est disponible sur</em> <a href="https://www.clever.cloud/developers/doc/tools/terraform/"><em>www.clever.cloud/developers</em></a><em>.</em></p>
<!-- /wp:paragraph -->]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
