<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>IA on Valérian Pyckaert</title>
    <link>https://valerian-pyckaert.dev/tags/ia/</link>
    <description>Recent content in IA on Valérian Pyckaert</description>
    <image>
      <title>Valérian Pyckaert</title>
      <url>https://valerian-pyckaert.dev/images/default-cover.svg</url>
      <link>https://valerian-pyckaert.dev/images/default-cover.svg</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 02 Jul 2026 19:17:37 +0200</lastBuildDate>
    <atom:link href="https://valerian-pyckaert.dev/tags/ia/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Claude Code avec Terraform</title>
      <link>https://valerian-pyckaert.dev/posts/terraform-claude-code/</link>
      <pubDate>Thu, 02 Jul 2026 19:17:37 +0200</pubDate>
      <guid>https://valerian-pyckaert.dev/posts/terraform-claude-code/</guid>
      <description>Mon utilisation de Claude Code pour générer du code Terraform.</description>
      <content:encoded><![CDATA[<p>Même si je n&rsquo;ai pas encore eu l&rsquo;occasion d&rsquo;écrire un article sur <a href="https://claude.com/fr/product/claude-code">Claude Code</a>, je l&rsquo;utilise depuis quelques mois sur des projets privés et également depuis plusieurs semaines en entreprise.</p>
<p>Dans cet article je vous partage mes tips &amp; tricks pour utiliser Claude Code pour un repo Terraform, nous utiliserons encore une fois le projet <a href="https://github.com/Bernedotcom2312/theforge-infra">the-forge-infra</a> comme exemple.</p>
<h2 id="claudemd--le-point-de-départ">CLAUDE.md : le point de départ</h2>
<p>La première chose à faire lorsque vous avez accès à Claude Code est de créer un fichier <code>CLAUDE.md</code> à la racine de votre projet qui servira de point d&rsquo;entrée pour Claude Code et contiendra toutes les informations nécessaires pour comprendre le projet.
C&rsquo;est un peu le <code>README.md</code> de Claude.</p>
<p>Ce fichier se doit d&rsquo;être le plus complet possible, il doit contenir toutes les informations nécessaires pour comprendre le projet, son architecture, ses dépendances, ses contraintes, etc. mais aussi d&rsquo;être relativement concis.
Si votre fichier contient 500 lignes, ces mêmes 500 lignes seront ingérées par Claude à chaque prompt et consommera ainsi beaucoup de tokens.</p>
<p>Voici un exemple minimal de structure pour écrire votre premier fichier (pour un repo Terraform) :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># CLAUDE.md
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Project overview
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Repository structure
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">-</span> <span class="sb">`main.tf`</span>: Main Terraform configuration file.
</span></span><span class="line"><span class="cl"><span class="k">-</span> <span class="sb">`variables.tf`</span>: File containing all Terraform variables.
</span></span><span class="line"><span class="cl"><span class="k">-</span> <span class="sb">`outputs.tf`</span>: File containing all Terraform outputs.
</span></span><span class="line"><span class="cl"><span class="k">-</span> <span class="sb">`modules/`</span>: Directory containing reusable Terraform modules.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### Code conventions
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Resources must be named using the following convention: <span class="sb">`&lt;resource_type&gt;_&lt;resource_name&gt;`</span>. 
</span></span><span class="line"><span class="cl">Commits must follow the conventional commit format: <span class="sb">`&lt;type&gt;(&lt;scope&gt;): &lt;description&gt;`</span>.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Forbidden actions
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">*</span> Never push directly to the main branch. Always create a feature branch and submit a pull request for review./
</span></span><span class="line"><span class="cl"><span class="k">*</span> Never use hardcoded values in Terraform files. Always use variables or data sources.
</span></span><span class="line"><span class="cl"><span class="k">*</span> Never store sensitive information in the repository. Use a secure secrets management solution instead./
</span></span></code></pre></div><h2 id="les-skills">Les skills</h2>
<p>Cette feature permet de décrire à Claude comment interagir avec notre repo pour cette tâche, en fonction du contexte il sera capable de déterminer si il doit utiliser un skill ou non, et si oui lequel.</p>
<p>Voici quelques exemples que j&rsquo;utilise sur le repo d&rsquo;infra du projet <code>TheForge</code>.</p>
<h3 id="create-module">Create-module</h3>
<p>Il n&rsquo;est pas rare d&rsquo;avoir à créer des modules Terraform, c&rsquo;est pourquoi j&rsquo;ai créé ce skill pour automatiser la partie rébarbative : création des fichiers de bases, variables, outputs, README, etc.
Claude me fournit aussi la structure de base du module sur laquelle je peux ensuite faire du fine tuning.</p>
<p><em>.claude/skills/create-module/SKILL.md</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">name: create-module
</span></span><span class="line"><span class="cl">description: Create a new Terraform module. Use this skill when user asks to create a new Terraform module with a standard file structure.
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Create a new Terraform module scaffold. The module name comes from <span class="sb">`$ARGUMENTS`</span> (kebab-case). If empty, ask the user for the name before proceeding.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Create the directory <span class="sb">`modules/&lt;name&gt;/`</span> with exactly these five files:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="ge">**</span><span class="sb">`modules/&lt;name&gt;/main.tf`</span>**
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="ge">**</span><span class="sb">`modules/&lt;name&gt;/variables.tf`</span>**
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="ge">**</span><span class="sb">`modules/&lt;name&gt;/outputs.tf`</span>**
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="ge">**</span><span class="sb">`modules/&lt;name&gt;/README.md`</span>**
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Check https://registry.terraform.io/ to fill those files with the appropriate content for a Terraform module.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You must use the latest version for the given provider if appropriate, pin the exact version (wildcard versions are not allowed). 
</span></span><span class="line"><span class="cl">Enrich the <span class="sb">`README.md`</span> with a description of the module, usage instructions, and examples.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Do not add any other files or directories beyond these five.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">After creating the files, list them with their relative paths, then remind the user to:
</span></span><span class="line"><span class="cl"><span class="k">-</span> Ensure every variable in <span class="sb">`variables.tf`</span> has both <span class="sb">`description`</span> and <span class="sb">`type`</span> set.
</span></span></code></pre></div><p>Résultat lorsqu&rsquo;on demande à Claude de créer un module via un prompt :</p>
<blockquote>
<p>crées un module google_storage_bucket
<img alt="Claude code create module skill" loading="lazy" src="/claude-code-create-module-skill.png"></p>
</blockquote>
<h3 id="create-pr">Create PR</h3>
<p>Ce skill a pour but de créer la PR à partir d&rsquo;une branche et faire un summary des changements pour faciliter la revue de mes collègues.
J&rsquo;ai également ajouté une checklist pour m&rsquo;assurer que je n&rsquo;ai rien oublié avant de créer la PR, accélérant une fois encore la boucle de feedback.</p>
<p><em>.claude/skills/create-pr/SKILL.md</em></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">name: create-pr
</span></span><span class="line"><span class="cl">description: Create a new Github Pull Request. Use this skill when user asks to create a new Github Pull Request.
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pre-requisites before creating a PR :
</span></span><span class="line"><span class="cl"><span class="k">*</span> Ensure no sensitive information is present in the code changes (e.g., passwords, API keys, secrets).
</span></span><span class="line"><span class="cl"><span class="k">*</span> Run terraform fmt, terraform validate to ensure the code is properly formatted and valid.
</span></span><span class="line"><span class="cl"><span class="k">*</span> Ensure each commit message follows the conventional commit format (e.g., feat: add new feature, fix: fix bug, docs: update documentation).
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">1.</span> Create a new Github Pull Request for the current branch. The title of the PR comes from <span class="sb">`$ARGUMENTS`</span>. If empty, ask the user for the title before proceeding.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">2.</span> The PR description should be generated based on the changes in the current branch. If <span class="sb">`$ARGUMENTS`</span> contains a description, use it instead.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">3.</span> The PR should be created against the default branch of the repository (usually <span class="sb">`main`</span> or <span class="sb">`master`</span>).
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">4.</span> After creating the PR, output the URL of the newly created PR.
</span></span></code></pre></div><blockquote>
<p>crées moi la Pull request &ldquo;add claude config&rdquo;</p>
</blockquote>
<p><img alt="claude-code-pr-created" loading="lazy" src="/claude-code-pr-created.png"></p>
<h2 id="conclusion">Conclusion</h2>
<p>Comme nous l&rsquo;avons vu, ces fichiers de configuration agentic sont de simples fichiers markdown et sont facilement partageables.
A ce titre, il existe de nombreux repository pour partager des templates de fichiers <code>CLAUDE.md</code>, notamment pour <a href="http://github.com/antonbabenko/terraform-skill/blob/master/CLAUDE.md">Terraform</a>.
Je ne les utilisent pas encore pour le moment parce que je ne souhaite pas m&rsquo;imposer de contraintes supplémentaires, je préfère mettre en place ma code base et ma stratégie et expliquer à l&rsquo;agent comment je souhaite qu&rsquo;il interagisse avec mon code.</p>
<p>Vous pouvez retrouver le repo d&rsquo;exemple que j&rsquo;ai utilisé pour cet article sur <a href="https://github.com/Bernedotcom2312/theforge-infra">GitHub</a>.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
