<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: mustafa fakhruddin</title>
    <description>The latest articles on Forem by mustafa fakhruddin (@mustafafakhruddin).</description>
    <link>https://forem.com/mustafafakhruddin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3874153%2F4318354b-6a80-4314-a20c-a70629b05316.png</url>
      <title>Forem: mustafa fakhruddin</title>
      <link>https://forem.com/mustafafakhruddin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mustafafakhruddin"/>
    <language>en</language>
    <item>
      <title>Mon premier terraform apply — et la galère du Free Tier</title>
      <dc:creator>mustafa fakhruddin</dc:creator>
      <pubDate>Sat, 18 Apr 2026 22:26:20 +0000</pubDate>
      <link>https://forem.com/mustafafakhruddin/mon-premier-terraform-apply-et-la-galere-du-free-tier-5b41</link>
      <guid>https://forem.com/mustafafakhruddin/mon-premier-terraform-apply-et-la-galere-du-free-tier-5b41</guid>
      <description>&lt;h2&gt;
  
  
  Où j'en suis
&lt;/h2&gt;

&lt;p&gt;Dans l'article précédent, je racontais pourquoi je me lance dans le DevOps. J'ai créé mon compte AWS, compris les bases du cloud, et j'ai dit que la prochaine étape serait Terraform.&lt;/p&gt;

&lt;p&gt;On y est. Et comme prévu, ça n'a pas été un long fleuve tranquille.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installer Terraform sous Windows (avec Git Bash)
&lt;/h2&gt;

&lt;p&gt;Je travaille sous Windows au quotidien, mais avec Git Bash comme terminal — ça me donne un environnement proche de Linux. J'adore éditer les fichier avec vi. Voilà ce que j'ai fait :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Téléchargé Terraform depuis le site officiel HashiCorp&lt;/li&gt;
&lt;li&gt;Extrait le &lt;code&gt;terraform.exe&lt;/code&gt; dans &lt;code&gt;C:\tools\terraform\&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ajouté ce dossier au PATH Windows&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Même chose pour AWS CLI — version MSI installer, installation classique.&lt;/p&gt;

&lt;p&gt;Vérification dans Git Bash :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;terraform &lt;span class="nt"&gt;--version&lt;/span&gt;
Terraform v1.14.8
on windows_amd64

&lt;span class="nv"&gt;$ &lt;/span&gt;aws &lt;span class="nt"&gt;--version&lt;/span&gt;
aws-cli/2.34.32 Python/3.14.4 Windows/11 exe/AMD64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ça roule.&lt;/p&gt;




&lt;h2&gt;
  
  
  Connecter Terraform à mon compte AWS
&lt;/h2&gt;

&lt;p&gt;Ici j'ai appris un truc important : &lt;strong&gt;on n'utilise jamais son compte root pour Terraform&lt;/strong&gt;. La bonne pratique c'est de créer un utilisateur IAM dédié avec des droits limités.&lt;/p&gt;

&lt;p&gt;Dans la console AWS → IAM → Users → Create user → j'ai créé &lt;code&gt;terraform-admin&lt;/code&gt; avec la policy &lt;code&gt;AdministratorAccess&lt;/code&gt;. Ensuite je lui ai généré des clés d'accès (Access Key ID + Secret Access Key).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;C'est comme sudo en Linux : tu ne bosses pas en root, tu as un user normal avec les droits nécessaires.&lt;/em&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Puis :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure
&lt;span class="c"&gt;# Access Key ID : ...&lt;/span&gt;
&lt;span class="c"&gt;# Secret Access Key : ...&lt;/span&gt;
&lt;span class="c"&gt;# Default region : eu-west-3&lt;/span&gt;
&lt;span class="c"&gt;# Default output format : json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;aws sts get-caller-identity
&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"UserId"&lt;/span&gt;: &lt;span class="s2"&gt;"AIDA..."&lt;/span&gt;,
    &lt;span class="s2"&gt;"Account"&lt;/span&gt;: &lt;span class="s2"&gt;"***"&lt;/span&gt;,
    &lt;span class="s2"&gt;"Arn"&lt;/span&gt;: &lt;span class="s2"&gt;"arn:aws:iam::***:user/terraform-admin"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parfait, Terraform peut maintenant parler à AWS en mon nom.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mon premier fichier &lt;code&gt;main.tf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Voici ce que j'ai écrit (avec plein de questions en tête sur chaque ligne) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hashicorp/aws"&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 5.0"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eu-west-3"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"aws_ami"&lt;/span&gt; &lt;span class="s2"&gt;"ubuntu"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;most_recent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;owners&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"099720109477"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;
    &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"mon_premier_serveur"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_ami&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ubuntu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"lecon01-premier-serveur"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Les questions que je me suis posées
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"C'est quoi cet AMI ID ?"&lt;/strong&gt; Une AMI (Amazon Machine Image) c'est l'équivalent d'un ISO pour monter une VM. Sauf qu'AWS en a des milliers pré-faits et prêts à démarrer. Chaque AMI a un identifiant unique par région.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;"Pourquoi &lt;code&gt;owners = ["099720109477"]&lt;/code&gt; ?"&lt;/strong&gt; Ce numéro, c'est l'identifiant du compte AWS de Canonical, l'éditeur d'Ubuntu. N'importe qui peut publier une AMI avec un nom qui ressemble à Ubuntu — donc filtrer par owner, c'est la garantie que l'image vient bien de la source officielle. Sécurité de base.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Pourquoi passer par un bloc &lt;code&gt;data&lt;/code&gt; au lieu de mettre l'AMI ID en dur ?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Là j'ai dû m'arrêter et comprendre. En fait il y a deux concepts différents en Terraform :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;resource&lt;/code&gt; → "je veux que Terraform CRÉE ça pour moi" (une EC2, un VPC, un bucket S3...)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data&lt;/code&gt; → "je veux LIRE une info qui existe déjà quelque part" (l'AMI publiée par Canonical, un VPC créé par un collègue, etc.)
Si je mets un AMI ID en dur dans mon code, je suis coincé avec cette version précise. Dans 3 mois, Canonical publie une mise à jour de sécurité d'Ubuntu : nouvelle AMI avec un nouvel ID. L'ancienne existe encore (AWS la garde pour ne pas casser les déploiements), mais elle ne reçoit plus de patches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour bien visualiser le problème, voilà un exemple concret :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version 1 — avec l'ID en dur :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"serveur"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-025ddada2a5392251"&lt;/span&gt;   &lt;span class="c1"&gt;# Ubuntu 24.04 du 9 avril&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trois mois plus tard, Canonical publie &lt;code&gt;ami-abc123fresh456&lt;/code&gt; qui contient les derniers correctifs de sécurité. Mon code continue de déployer l'ancienne AMI. Pour mettre à jour :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Quelqu'un doit aller chercher manuellement le nouvel ID&lt;/li&gt;
&lt;li&gt;Modifier le code&lt;/li&gt;
&lt;li&gt;Faire une PR, la faire valider, la merger&lt;/li&gt;
&lt;li&gt;Et si personne n'y pense, ça reste vulnérable pendant des mois
&lt;strong&gt;Version 2 — avec un bloc &lt;code&gt;data&lt;/code&gt; :&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"aws_ami"&lt;/span&gt; &lt;span class="s2"&gt;"ubuntu"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;most_recent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;owners&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"099720109477"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;
    &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"serveur"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_ami&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ubuntu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;À chaque &lt;code&gt;terraform apply&lt;/code&gt;, Terraform va demander à AWS : "donne-moi la plus récente AMI Ubuntu 24.04 signée Canonical" et l'utilise. Aucun travail humain nécessaire.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Nuance que j'ai découverte : en production, ce comportement peut poser problème — si une nouvelle AMI sort entre deux déploiements, Terraform peut vouloir recréer l'instance (et donc avoir un downtime). Il y a un arbitrage à faire entre "toujours à jour" et "reproductibilité". Pour mon apprentissage, &lt;code&gt;most_recent = true&lt;/code&gt; fait très bien l'affaire.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;"Et le &lt;code&gt;~&amp;gt; 5.0&lt;/code&gt; ?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Terraform utilise le versionnement sémantique — chaque version a 3 chiffres : &lt;code&gt;MAJEUR.MINEUR.PATCH&lt;/code&gt;. Par exemple &lt;code&gt;5.100.0&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un changement &lt;strong&gt;MAJEUR&lt;/strong&gt; (5 → 6) peut casser le code existant&lt;/li&gt;
&lt;li&gt;Un changement &lt;strong&gt;MINEUR&lt;/strong&gt; (5.99 → 5.100) ajoute des fonctionnalités sans casser&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;PATCH&lt;/strong&gt; (5.100.0 → 5.100.1) corrige juste des bugs
Le &lt;code&gt;~&amp;gt;&lt;/code&gt; est un opérateur spécial qui dit : "accepte les mises à jour compatibles, mais bloque les majeures".&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Syntaxe&lt;/th&gt;
&lt;th&gt;Ce que ça accepte&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;= 5.100.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exactement cette version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~&amp;gt; 5.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.x uniquement (5.0 jusqu'à 5.999, mais &lt;strong&gt;pas 6.0&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~&amp;gt; 5.100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.100.x uniquement (bloque aussi 5.101)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;= 5.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tout à partir de 5.0 (y compris 6.x, 7.x...)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Un exemple réel qui m'a fait comprendre l'importance :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Entre la v4 et la v5 du provider AWS, HashiCorp a supprimé l'argument &lt;code&gt;s3_force_path_style&lt;/code&gt; des buckets S3 (remplacé par &lt;code&gt;s3_use_path_style&lt;/code&gt; dans le bloc provider). Imagine que tu avais ce code qui tournait nickel en v4 :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eu-west-3"&lt;/span&gt;
  &lt;span class="nx"&gt;s3_force_path_style&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;   &lt;span class="c1"&gt;# Valide en v4&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sans contrainte de version, tu fais un &lt;code&gt;terraform init&lt;/code&gt; un matin, il télécharge la v5 toute fraîche, et ton apply plante avec :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="nx"&gt;Error&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Unsupported&lt;/span&gt; &lt;span class="nx"&gt;argument&lt;/span&gt;
  &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tf&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;in&lt;/span&gt; &lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;   &lt;span class="nx"&gt;s3_force_path_style&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;An&lt;/span&gt; &lt;span class="nx"&gt;argument&lt;/span&gt; &lt;span class="nx"&gt;named&lt;/span&gt; &lt;span class="s2"&gt;"s3_force_path_style"&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;expected&lt;/span&gt; &lt;span class="nx"&gt;here&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ton infra de prod s'arrête. Tu passes 2h à comprendre, à migrer ton code, et tu te fais engueuler.&lt;/p&gt;

&lt;p&gt;Avec &lt;code&gt;~&amp;gt; 4.0&lt;/code&gt; dans ton &lt;code&gt;required_providers&lt;/code&gt;, Terraform refuse de télécharger la v5 et reste sur la v4.x. Tu as le temps de planifier la migration tranquillement.&lt;/p&gt;

&lt;p&gt;La double protection réelle c'est : &lt;code&gt;~&amp;gt; 5.0&lt;/code&gt; dans le &lt;code&gt;main.tf&lt;/code&gt; (la plage acceptable) + le &lt;code&gt;.terraform.lock.hcl&lt;/code&gt; qui verrouille la version exacte pour que tous les devs de l'équipe utilisent la même.&lt;/p&gt;




&lt;h2&gt;
  
  
  La séquence des 3 commandes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;terraform init&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;terraform init
Initializing provider plugins...
- Installing hashicorp/aws v5.100.0...
Terraform has been successfully initialized!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform a téléchargé le provider AWS (une sorte de plugin qui sait parler à AWS). Il a aussi créé un fichier &lt;code&gt;.terraform.lock.hcl&lt;/code&gt; qui verrouille la version exacte du plugin — pour que mon code marche pareil même si AWS publie une nouvelle version demain. Exactement le même principe qu'un &lt;code&gt;package-lock.json&lt;/code&gt; ou un &lt;code&gt;gradle.lock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Et oui c'est important pour que tous les développeurs puisse avoir la même version du plugin change, les développeurs travailleront tous sur la même version inscrite dans le fichier lock&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;terraform plan&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Ça, c'est la commande qui m'a rassuré. Elle me montre &lt;strong&gt;ce qui va se passer&lt;/strong&gt; avant de faire quoi que ce soit :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Plan: 1 to add, 0 to change, 0 to destroy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un truc à créer, rien à modifier, rien à supprimer. Le &lt;code&gt;+ create&lt;/code&gt; devant chaque ligne = ça va créer. Et plein de &lt;code&gt;(known after apply)&lt;/code&gt; — parce que des valeurs comme l'IP publique du serveur n'existent pas encore. Toutes ces choses ne seront connus que lorsque l'instance sera créé.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;terraform apply&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Le moment de vérité. Je tape &lt;code&gt;yes&lt;/code&gt;, j'appuie sur Entrée.&lt;/p&gt;

&lt;p&gt;Et là... &lt;strong&gt;ERREUR&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mon premier mur : le Free Tier qui a changé
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: creating EC2 Instance: InvalidParameterCombination: 
The specified instance type is not eligible for Free Tier.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;J'avais mis &lt;code&gt;t2.micro&lt;/code&gt; — parce que c'est ce qu'on voit partout dans les tutos. Sauf qu'AWS a fait évoluer son Free Tier, et dans certaines régions (dont Paris), c'est &lt;code&gt;t3.micro&lt;/code&gt; qui est gratuit maintenant.&lt;/p&gt;

&lt;p&gt;Comment j'ai trouvé le bon ? AWS CLI a la réponse :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;aws ec2 describe-instance-types &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--filters&lt;/span&gt; &lt;span class="s2"&gt;"Name=free-tier-eligible,Values=true"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"InstanceTypes[].InstanceType"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; text

t4g.small  c7i-flex.large  t3.micro  t4g.micro  t3.small ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En fait le t3.micro c'est mieux — processeurs plus récents, 2 vCPU au lieu de 1, et même prix. AWS pousse la migration depuis 2018.&lt;/p&gt;

&lt;p&gt;Donc &lt;code&gt;t3.micro&lt;/code&gt;. Je modifie le &lt;code&gt;main.tf&lt;/code&gt;, je relance &lt;code&gt;terraform apply&lt;/code&gt;, et :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws_instance.mon_premier_serveur: Creating...
aws_instance.mon_premier_serveur: Still creating... [00m10s elapsed]
aws_instance.mon_premier_serveur: Creation complete after 13s

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;13 secondes.&lt;/strong&gt; Un serveur Ubuntu 24.04 dans un datacenter à Paris, provisionné en 13 secondes à partir d'un fichier texte. Comparé aux délais habituels pour avoir un serveur au boulot, c'est assez fou.&lt;/p&gt;




&lt;h3&gt;
  
  
  Ma ceinture de sécurité : le budget alert
&lt;/h3&gt;

&lt;p&gt;Premier réflexe d'un DevOps : ne jamais faire confiance à sa propre mémoire pour éteindre des ressources. J'ai configuré une alerte budget :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Console AWS → Billing → Budgets → Create budget&lt;/li&gt;
&lt;li&gt;Template &lt;strong&gt;"Zero spend budget"&lt;/strong&gt; (alerte dès 0.01$)&lt;/li&gt;
&lt;li&gt;Email sur mon adresse perso
À partir de maintenant, si ma facture commence à grimper pour n'importe quelle raison, je reçois un mail. Ça me laisse le temps d'intervenir avant que ça devienne sérieux.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;À savoir : AWS peut mettre jusqu'à 24h à détecter une dépense. L'alerte budget est une sécurité, pas une excuse pour laisser traîner des ressources.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Le réflexe de fin : &lt;code&gt;terraform destroy&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Avant de fermer mon terminal, une dernière commande cruciale :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pourquoi ? Parce que même si le serveur est dans le Free Tier, il vaut mieux prendre l'habitude de ne pas laisser traîner des ressources. Un &lt;code&gt;terraform destroy&lt;/code&gt; et tout ce qui a été créé est supprimé.&lt;/p&gt;

&lt;p&gt;C'est d'ailleurs l'un des gros avantages du Infrastructure as Code : le cycle "je crée / je teste / je détruis" devient trivial. Chez moi avant, créer un environnement de test prenait une journée. Ici c'est 13 secondes pour créer, 30 pour détruire.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ce que j'ai appris aujourd'hui
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Installer Terraform et AWS CLI sur Windows via Git Bash&lt;/li&gt;
&lt;li&gt;Configurer un utilisateur IAM dédié (jamais utiliser le compte root)&lt;/li&gt;
&lt;li&gt;Écrire un premier fichier &lt;code&gt;main.tf&lt;/code&gt; avec provider, data source et resource&lt;/li&gt;
&lt;li&gt;Comprendre &lt;code&gt;terraform init&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Utiliser &lt;code&gt;data "aws_ami"&lt;/code&gt; pour ne pas hardcoder des IDs qui vont vieillir&lt;/li&gt;
&lt;li&gt;Gérer ma première erreur Terraform (le Free Tier qui évolue)&lt;/li&gt;
&lt;li&gt;Utiliser &lt;code&gt;aws ec2 describe-instance-types&lt;/code&gt; pour trouver l'info directement via l'API&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prochaine étape
&lt;/h2&gt;

&lt;p&gt;Dans le prochain article : comprendre les réseaux AWS (VPC, subnets, security groups). Parce que créer un serveur, c'est bien. Pouvoir s'y connecter et lui donner un rôle dans une architecture, c'est mieux.&lt;/p&gt;

&lt;p&gt;Si tu es dans la même aventure que moi — développeur qui bascule vers le DevOps — n'hésite pas à suivre la série. Et si tu as des retours ou des conseils, je suis preneur en commentaires.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>terraform</category>
      <category>aws</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Journal d'un dev Java qui veut devenir DevOps</title>
      <dc:creator>mustafa fakhruddin</dc:creator>
      <pubDate>Sat, 11 Apr 2026 22:04:06 +0000</pubDate>
      <link>https://forem.com/mustafafakhruddin/mon-premier-jour-dans-le-cloud-aws-journal-dun-dev-java-qui-veut-devenir-devops-5ahl</link>
      <guid>https://forem.com/mustafafakhruddin/mon-premier-jour-dans-le-cloud-aws-journal-dun-dev-java-qui-veut-devenir-devops-5ahl</guid>
      <description>&lt;h2&gt;
  
  
  Pourquoi cet article ?
&lt;/h2&gt;

&lt;p&gt;Je m'appelle Mustafa. Je suis développeur sur une application Java legacy — Tomcat, Apache, Jenkins, Gradle. Le genre de stack où tu passes tes journées à débugger des problèmes de cookies, des certificats SSL, et des pipelines Jenkins capricieux.&lt;/p&gt;

&lt;p&gt;J'aime ce que je fais. Mais j'ai réalisé un truc : les parties de mon boulot que je préfère, ce n'est pas le code Java. C'est le &lt;strong&gt;déploiement&lt;/strong&gt;, l'&lt;strong&gt;automatisation&lt;/strong&gt;, le &lt;strong&gt;debugging d'infrastructure&lt;/strong&gt;. Quand je passe une journée à écrire un &lt;code&gt;Dockerfile&lt;/code&gt;, à configurer un pipeline CI/CD, ou à diagnostiquer pourquoi le serveur refuse de démarrer — c'est là que je suis dans mon élément.&lt;/p&gt;

&lt;p&gt;Alors j'ai décidé de devenir &lt;strong&gt;ingénieur DevOps&lt;/strong&gt;. Et de documenter chaque étape du parcours ici, sur Dev.to.&lt;/p&gt;

&lt;p&gt;Aujourd'hui, c'est le &lt;strong&gt;Jour 0&lt;/strong&gt; : pas de code, pas d'outil. Juste comprendre le terrain de jeu.&lt;/p&gt;




&lt;h2&gt;
  
  
  C'est quoi le cloud, concrètement ?
&lt;/h2&gt;

&lt;p&gt;Avant de plonger dans AWS, Terraform et Kubernetes, il faut répondre à une question toute bête : &lt;strong&gt;pourquoi le cloud existe ?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Le problème (que je vis tous les jours)
&lt;/h3&gt;

&lt;p&gt;Au boulot, quand on a besoin d'un nouveau serveur, voilà ce qui se passe :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On fait une demande&lt;/li&gt;
&lt;li&gt;On attend que quelqu'un le provisionne&lt;/li&gt;
&lt;li&gt;On le configure à la main (ou presque)&lt;/li&gt;
&lt;li&gt;S'il tombe en panne un vendredi soir, c'est la galère&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Et si on a besoin de &lt;strong&gt;3 environnements&lt;/strong&gt; identiques (dev, staging, prod) ? On recommence 3 fois. Et si la config diverge entre les environnements ? Bon courage pour débugger le fameux &lt;em&gt;"ça marche sur mon poste"&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  La solution cloud
&lt;/h3&gt;

&lt;p&gt;Le cloud, c'est simple : &lt;strong&gt;tu loues des ressources informatiques à la demande, et tu paies ce que tu consommes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L'analogie qui m'a aidé à comprendre :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tu ne construis pas ta propre centrale électrique pour alimenter ta maison. Tu branches ta prise et tu paies EDF. Le cloud, c'est pareil — mais pour les serveurs, le réseau et le stockage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tu veux un serveur ? Tu cliques (ou tu tapes une commande), et en &lt;strong&gt;30 secondes&lt;/strong&gt; il existe. Tu n'en as plus besoin ? Tu le supprimes et tu arrêtes de payer. Pas de matériel à gérer, pas de datacenter à refroidir.&lt;/p&gt;




&lt;h2&gt;
  
  
  Les 3 géants du cloud
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Entreprise&lt;/th&gt;
&lt;th&gt;Part de marché&lt;/th&gt;
&lt;th&gt;Ce qu'il faut retenir&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon&lt;/td&gt;
&lt;td&gt;~31%&lt;/td&gt;
&lt;td&gt;Le leader, le plus d'offres d'emploi en France&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;~25%&lt;/td&gt;
&lt;td&gt;Très présent dans les grandes entreprises et ESN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;~11%&lt;/td&gt;
&lt;td&gt;Fort en data et machine learning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;J'ai choisi de commencer par &lt;strong&gt;AWS&lt;/strong&gt; pour une raison pragmatique : c'est celui qui revient le plus souvent dans les offres DevOps en Île-de-France. Mais les concepts sont les mêmes partout — et les outils comme Terraform fonctionnent avec les trois.&lt;/p&gt;




&lt;h2&gt;
  
  
  Les 5 services AWS que je vais utiliser
&lt;/h2&gt;

&lt;p&gt;AWS a des centaines de services. C'est terrifiant au début. Mais la réalité, c'est que &lt;strong&gt;90% des DevOps en utilisent moins de 20&lt;/strong&gt;. Et pour mon premier projet, j'en ai besoin de seulement 5.&lt;/p&gt;

&lt;p&gt;Voici comment je les ai compris en les comparant à ce que je connais déjà :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service AWS&lt;/th&gt;
&lt;th&gt;En une phrase&lt;/th&gt;
&lt;th&gt;Mon équivalent actuel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EC2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Un serveur virtuel&lt;/td&gt;
&lt;td&gt;Mon serveur de qualif au boulot, mais créé en 30 secondes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Un réseau privé dans le cloud&lt;/td&gt;
&lt;td&gt;Le réseau interne de ma boîte, avec ses sous-réseaux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RDS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Une base de données managée&lt;/td&gt;
&lt;td&gt;Ma base PostgreSQL, mais AWS gère les backups et mises à jour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;S3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Du stockage de fichiers illimité&lt;/td&gt;
&lt;td&gt;Un disque dur géant accessible de partout via une URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;La gestion des droits et accès&lt;/td&gt;
&lt;td&gt;Les users Linux + sudo, mais en version cloud avancée&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Le truc rassurant : ce ne sont pas des concepts nouveaux. Ce sont les mêmes briques que je manipule déjà — serveurs, réseau, stockage, droits — mais dans un autre emballage.&lt;/p&gt;




&lt;h2&gt;
  
  
  Et pourquoi "Infrastructure as Code" ?
&lt;/h2&gt;

&lt;p&gt;Dernière pièce du puzzle. AWS a une interface web (la "console") où tu peux tout créer en cliquant. Alors pourquoi s'embêter à écrire du code ?&lt;/p&gt;

&lt;p&gt;Imagine ce scénario :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tu crées un serveur en cliquant dans la console&lt;/li&gt;
&lt;li&gt;3 mois plus tard, un collègue te demande : &lt;em&gt;"c'est quoi la config exacte ?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Tu fouilles dans l'interface... et tu ne retrouves plus tous les réglages&lt;/li&gt;
&lt;li&gt;Tu dois recréer la même chose pour un autre client — tu recommences tout à la main&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maintenant imagine l'alternative :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.tf — mon serveur en 5 lignes&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-0c55b159cbfafe1f0"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mon-premier-serveur"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ce fichier texte &lt;strong&gt;est&lt;/strong&gt; ta documentation. Il est dans Git, versionné, relu en code review. Tu veux le même serveur pour un autre client ? &lt;code&gt;terraform apply&lt;/code&gt;. Tu veux 10 serveurs ? Tu changes un chiffre. Tu veux revenir en arrière ? &lt;code&gt;git revert&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;C'est exactement le même principe que Docker : au lieu de configurer un serveur à la main, tu écris un &lt;code&gt;Dockerfile&lt;/code&gt;. L'Infrastructure as Code, c'est pareil mais pour &lt;strong&gt;tout le reste&lt;/strong&gt; — le réseau, les bases de données, les droits d'accès, le load balancer...&lt;/p&gt;

&lt;p&gt;Si tu viens du monde Java/Jenkins comme moi, pense-y comme ça : le &lt;code&gt;Jenkinsfile&lt;/code&gt; a remplacé la configuration manuelle des jobs Jenkins. Terraform, c'est le &lt;code&gt;Jenkinsfile&lt;/code&gt; de ton infrastructure cloud.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ce que j'ai fait aujourd'hui
&lt;/h2&gt;

&lt;p&gt;✅ Créé mon compte &lt;strong&gt;AWS Free Tier&lt;/strong&gt; (gratuit pendant 12 mois sur plein de services)&lt;br&gt;&lt;br&gt;
✅ Choisi la région &lt;strong&gt;eu-west-3 (Paris)&lt;/strong&gt; — le datacenter le plus proche&lt;br&gt;&lt;br&gt;
✅ Activé le &lt;strong&gt;MFA&lt;/strong&gt; sur mon compte root (première règle de sécurité cloud)&lt;br&gt;&lt;br&gt;
✅ Fait un tour dans la console AWS — c'est impressionnant le nombre de services, mais je ne me laisse pas intimider  &lt;/p&gt;




&lt;h2&gt;
  
  
  Prochaine étape
&lt;/h2&gt;

&lt;p&gt;Dans le prochain article, j'installe &lt;strong&gt;Terraform&lt;/strong&gt; sur ma machine et je crée mon tout premier serveur EC2 — en code. Mon premier &lt;code&gt;terraform apply&lt;/code&gt;. J'ai hâte de voir ce que ça donne.&lt;/p&gt;

&lt;p&gt;Si tu es dans la même situation que moi — dev qui veut évoluer vers le DevOps — suis cette série. On apprend ensemble, étape par étape.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cet article fait partie de la série *&lt;/em&gt;"De Dev à DevOps — Mon parcours"*&lt;em&gt;. Chaque article correspond à une leçon pratique avec du vrai code et un vrai projet portfolio à la clé.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tu as des questions ou des conseils ? Je suis preneur en commentaires !&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>beginners</category>
      <category>career</category>
    </item>
  </channel>
</rss>
