Aller au contenu

Maütriser Terraform pour provisionner votre infrastructure cloud 🌐

Mise Ă  jour :

logo terraform

Terraform, dĂ©veloppĂ© par HashiCorp et lancĂ© en 2014, a rĂ©volutionnĂ© le concept d’Infrastructure as Code (IAC). Son Ă©mergence a Ă©tĂ© motivĂ©e par la complexitĂ© croissante des architectures informatiques et la nĂ©cessitĂ© d’une gestion plus agile et efficace des ressources dans le cloud.

Avant Terraform, la gestion de l’infrastructure Ă©tait souvent fragmentĂ©e et dĂ©pendante de multiples outils spĂ©cifiques Ă  chaque fournisseur de cloud ou Ă  chaque technologie. Cette approche cloisonnĂ©e gĂ©nĂ©rait des dĂ©fis significatifs en termes de portabilitĂ© et d’efficacitĂ© opĂ©rationnelle. Les administrateurs systĂšmes faisaient face Ă  des processus manuels sujets aux erreurs, entraĂźnant des dĂ©ploiements lents et des inconsistances.

Terraform qu’est-ce que c’est ?

Mitchell Hashimoto et Armon Dadgar, les fondateurs de HashiCorp, ont perçu ces dĂ©fis comme une opportunitĂ© pour crĂ©er un outil unifiĂ© qui simplifierait la gestion de l’infrastructure. Terraform a Ă©tĂ© conçu pour permettre aux utilisateurs de dĂ©finir et de provisionner l’infrastructure Ă  l’aide d’un langage de configuration simple et dĂ©claratif. Cette approche visait Ă  rendre les configurations reproductibles et Ă  faciliter la gestion de versions, un Ă©lĂ©ment indispensable.

L’Évolution de Terraform

L’histoire de Terraform est une histoire de croissance, d’adaptation et d’innovation constantes depuis sa premiĂšre introduction par HashiCorp en 2014. Dans ce chapitre, nous explorerons en dĂ©tail l’évolution de Terraform, en mettant en lumiĂšre les principales Ă©tapes de son dĂ©veloppement.

Versions et Mises Ă  Jour Majeures

Terraform a connu de nombreuses versions au fil des ans, chacune introduisant de nouvelles fonctionnalités et améliorations significatives. Parmi les versions les plus notables :

  • Terraform 0.6 : Cette version a introduit le support des modules, permettant aux utilisateurs de rĂ©utiliser et de partager des morceaux de code d’infrastructure. Cela a favorisĂ© la crĂ©ation d’une bibliothĂšque de modules Terraform, facilitant la mise en place de bonnes pratiques et la rĂ©duction de la duplication de code.
  • Terraform 0.12 : L’une des mises Ă  jour les plus importantes, Terraform 0.12 a amĂ©liorĂ© la syntaxe HCL (HashiCorp Configuration Language) et a introduit des fonctionnalitĂ©s telles que les boucles, les conditions et les expressions plus puissantes. Cela a rendu les fichiers de configuration Terraform plus lisibles et plus flexibles.
  • Terraform 0.13 : Cette version a amĂ©liorĂ© la gestion des modules et a introduit le concept de “providers” pour une meilleure extensibilitĂ©. Elle a Ă©galement contribuĂ© Ă  rendre Terraform plus efficace et plus Ă©volutif.
  • Terraform 1.0 : Cette version 1.0 de Terraform a marquĂ© une Ă©tape importante dans l’histoire de cet outil d’infrastructure en tant que code (IaC). Elle a Ă©tĂ© annoncĂ©e par HashiCorp en juin 2021 et a apportĂ© une stabilitĂ© et une maturitĂ© significatives Ă  Terraform.
  • Terraform 1.6 : En 2023, Terraform a changĂ© sa licence de l’open-source Mozilla Public License (MPL 2.0) Ă  la Business Source License (BSL). Ce changement a Ă©tĂ© initiĂ© pour mieux protĂ©ger la propriĂ©tĂ© intellectuelle d’HashiCorp tout en maintenant l’accĂšs gratuit Ă  l’utilisation et aux modifications du logiciel pour la majoritĂ© des cas d’utilisation. Toutefois, cela impose des restrictions sur l’utilisation commerciale du produit.

La Contribution de la Communauté

L’une des forces de Terraform rĂ©side dans sa communautĂ© open source dynamique. Des milliers de contributeurs du monde entier ont participĂ© Ă  son dĂ©veloppement en crĂ©ant des modules, en signalant des problĂšmes, en proposant des amĂ©liorations et en partageant leurs connaissances. La communautĂ© a jouĂ© un rĂŽle essentiel dans l’expansion de l’écosystĂšme Terraform, en ajoutant de nouveaux fournisseurs de cloud, en crĂ©ant des modules rĂ©utilisables et en aidant les nouveaux utilisateurs Ă  maĂźtriser l’outil.

HCL le langage de Terraform

Dans le cas de Terraform, le langage utilisĂ© pour dĂ©finir l’infrastructure est connu sous le nom de HashiCorp Configuration Langage (HCL).

L’objectif principal de Terraform est de dĂ©clarer des ressources, qui reprĂ©sentent des objets d’infrastructure. Toutes les autres fonctionnalitĂ©s de son langage permettent de rendre la dĂ©finition des ressources plus flexible et pratique.

Les Avantages de Terraform

Terraform est un outil rĂ©volutionnaire qui se dĂ©marque par sa capacitĂ© Ă  simplifier et optimiser la gestion d’infrastructures, notamment grĂące Ă  sa portabilitĂ© multi-cloud. Contrairement aux outils propriĂ©taires limitĂ©s Ă  un seul fournisseur, Terraform permet de dĂ©ployer et de gĂ©rer des infrastructures sur des plateformes variĂ©es comme AWS, Azure, Google Cloud ou Outscale. Cette polyvalence facilite la standardisation et la migration entre fournisseurs sans nĂ©cessiter de réécrire le code.

L’approche dĂ©clarative de Terraform constitue un autre avantage majeur. PlutĂŽt que de dĂ©finir Ă©tape par Ă©tape les actions Ă  rĂ©aliser, comme le ferait un outil impĂ©ratif tel que Ansible, Terraform se concentre sur l’état final dĂ©sirĂ©. Cela simplifie la maintenance et rĂ©duit les risques d’erreurs humaines en automatisant les Ă©tapes nĂ©cessaires pour atteindre cet Ă©tat.

Terraform offre Ă©galement une reproductibilitĂ© inĂ©galĂ©e grĂące Ă  son fichier d’état (terraform.tfstate), qui conserve une trace dĂ©taillĂ©e de l’infrastructure. CombinĂ© avec des outils de contrĂŽle de version comme Git, il devient facile de recrĂ©er ou de restaurer des infrastructures Ă  des versions antĂ©rieures, ce qui est essentiel pour des Ă©quipes travaillant en collaboration. En parallĂšle, sa gestion modulaire permet de rĂ©utiliser des blocs de configuration, standardisant ainsi des Ă©lĂ©ments complexes comme des rĂ©seaux ou des bases de donnĂ©es. Cela favorise la cohĂ©rence des dĂ©ploiements et simplifie la maintenance Ă  long terme.

L’un des points forts de Terraform rĂ©side dans sa commande terraform plan, qui permet de visualiser les modifications Ă  apporter avant leur application. Cette transparence totale donne aux utilisateurs un contrĂŽle prĂ©cis et une meilleure maĂźtrise des changements, rĂ©duisant ainsi les risques de configuration erronĂ©e.

Enfin, Terraform bĂ©nĂ©ficie d’une communautĂ© open source dynamique et d’un Ă©cosystĂšme riche. La Terraform Registry offre une multitude de modules et de providers prĂȘts Ă  l’emploi, accĂ©lĂ©rant les dĂ©ploiements et intĂ©grant des bonnes pratiques. En s’interfaçant parfaitement avec d’autres outils de l’écosystĂšme DevOps tels que Gitlab CI ou Kubernetes, Terraform se positionne comme un outil clĂ© pour la crĂ©ation de pipelines CI/CD robustes et la supervision des ressources.

GrĂące Ă  ces avantages, Terraform se distingue comme un incontournable pour provisionner des infrastructures complexes avec efficacitĂ©, qu’il s’agisse de petites Ă©quipes ou de grandes entreprises cherchant Ă  standardiser leurs dĂ©ploiements.

Les concepts importants

Le registre Terraform ou registry

La Terraform Registry ↗ est une plateforme en ligne qui permet de partager, dĂ©couvrir et utiliser des providers et des modules Terraform créés par la communautĂ© ou par des entreprises. Les fournisseurs Ă©tendent les capacitĂ©s de Terraform en ajoutant des ressources spĂ©cifiques Ă  des plateformes comme AWS, Azure, Google Cloud, Outscale ou d’autres services. Les modules, quant Ă  eux, regroupent du code Terraform rĂ©utilisable pour des configurations d’infrastructure spĂ©cifiques, facilitant la gestion et le dĂ©ploiement de l’infrastructure Ă  grande Ă©chelle.

C’est une ressource puissante pour les Ă©quipes souhaitant adopter l’infrastructure as code (IaC) tout en accĂ©lĂ©rant leur dĂ©veloppement grĂące Ă  des ressources prĂȘtes Ă  l’emploi.

Les providers Terraform

Les providers dans Terraform sont des plugins qui permettent Ă  Terraform d’interagir avec diverses plateformes d’infrastructure, services cloud et API. Ils sont essentiels, car ils traduisent les commandes et configurations Terraform en actions sur les infrastructures physiques ou virtuelles, comme la crĂ©ation d’une machine virtuelle ou la gestion de bases de donnĂ©es.

Chaque provider est associé à une plateforme spécifique, telle que AWS, Azure, GCP, ou Outscale et expose des ressources et data sources que vous pouvez gérer via Terraform. Par exemple, le provider Outscale vous permet de créer et de gérer des ressources sur le cloud Outscale.

Exemples de providers courants :

  • AWS : GĂšre les ressources AWS comme EC2, S3, etc.
  • Google Cloud : GĂšre les ressources GCP comme Compute Engine et Cloud Storage.
  • AzureRM : GĂšre les ressources Azure.
  • Outscale : GĂšre les ressources dans le cloud Outscale, comme les machines virtuelles et les rĂ©seaux.

Exemple d’utilisation d’un provider :

Dans un fichier de configuration Terraform, vous devez d’abord spĂ©cifier le provider que vous utilisez avant de dĂ©finir les ressources Ă  gĂ©rer :

terraform {
required_providers {
outscale = {
source = "outscale/outscale"
version = "0.12.0"
}
}
}
provider "outscale" {
access_key = "your_access_key"
secret_key = "your_secret_key"
region = "eu-west-2"
}

Dans cet exemple, le provider Outscale est configurĂ© pour interagir avec les API du cloud Outscale, permettant ainsi de gĂ©rer les ressources dans cette infrastructure. Les providers sont le lien entre Terraform et les services sous-jacents, rendant possible l’automatisation des tĂąches d’infrastructure Ă  travers diffĂ©rents environnements cloud.

Les ressources Terraform

Les ressources dans Terraform sont des composants spécifiques de votre infrastructure, tels que des machines virtuelles, des réseaux, ou des bases de données. Chaque ressource possÚde un bloc de configuration qui définit les attributs nécessaires à sa création. Voici quelques exemples courants de ressources dans Terraform :

  • outscale_vm : Pour crĂ©er une machine virtuelle sur Outscale.
  • aws_instance : Pour crĂ©er une machine virtuelle (VM) sur AWS.
  • azurerm_virtual_network : Pour gĂ©rer les rĂ©seaux virtuels dans Azure.
  • google_compute_instance : Pour crĂ©er une instance de calcul sur Google Cloud.

Voici un exemple de configuration pour créer une machine virtuelle (VM) sur Outscale avec Terraform :

resource "outscale_vm" "example_vm" {
image_id = "ami-12345678"
vm_type = "tinav5.c1r1p2"
keypair_name = "my-keypair"
subnet_id = "subnet-12345678"
state = "running"
security_group_ids = ["sg-12345678"]
}

Dans cet exemple, la ressource outscale_vm permet de crĂ©er une VM avec des attributs comme l’identifiant de l’image, le type de machine, la clĂ© SSH, et l’ID du sous-rĂ©seau oĂč sera dĂ©ployĂ©e la VM.

Les data sources Terraform

Les data sources dans Terraform permettent d’accĂ©der Ă  des informations externes ou Ă  des ressources existantes sans les crĂ©er ni les modifier. Elles sont utilisĂ©es pour rĂ©cupĂ©rer des donnĂ©es sur des Ă©lĂ©ments dĂ©jĂ  prĂ©sents dans une infrastructure, comme des machines virtuelles, des images, ou des rĂ©seaux, et les utiliser dans une configuration Terraform.

Une data source est une façon d’extraire des informations d’un environnement cloud ou d’un systĂšme tiers. Contrairement aux ressources, qui crĂ©ent des Ă©lĂ©ments dans l’infrastructure, les data sources se contentent de rĂ©cupĂ©rer des donnĂ©es que vous pouvez utiliser dans d’autres configurations Terraform.

Les data sources sont utiles pour plusieurs raisons :

  • RĂ©cupĂ©rer des informations dynamiques ou existantes (par exemple, une image AMI spĂ©cifique).
  • RĂ©utiliser des ressources qui ont Ă©tĂ© créées manuellement ou par d’autres outils.
  • Faciliter la configuration et la gestion des dĂ©pendances dans une infrastructure complexe.

Prenons un exemple avec une data source qui récupÚre une image existante (AMI) sur Outscale :

data "outscale_images" "my_image" {
filter {
name = "image_name"
values = ["ubuntu_2204"]
}
}
resource "outscale_vm" "example_vm" {
image_id = data.outscale_images.my_image.images[0].image_id
vm_type = "tinav5.c1r1p2"
keypair_name = "my-keypair"
subnet_id = "subnet-12345678"
}

Dans cet exemple :

  • La data source outscale_images rĂ©cupĂšre une image Ubuntu 22.04 existante.
  • La ressource outscale_vm utilise l’ID de cette image pour crĂ©er une machine virtuelle basĂ©e sur cette AMI sans avoir besoin de spĂ©cifier manuellement son ID.

Le state de Terraform

La gestion de l’état est un aspect important du workflow de Terraform. L’état de l’infrastructure est stockĂ© dans un fichier d’état, gĂ©nĂ©ralement stockĂ© localement ou de maniĂšre centralisĂ©e via un backend distant. Il est important de gĂ©rer cet Ă©tat avec soin pour assurer la cohĂ©rence de l’infrastructure et Ă©viter les conflits.

Par dĂ©faut cet Ă©tat est stockĂ© dans un fichier local nommĂ© terraform.tfstate, mais il peut Ă©galement ĂȘtre stockĂ© Ă  distance, mais pas dans votre repository git, car il peut contenir des secrets.

Terraform utilise cet Ă©tat pour crĂ©er des plans et apporter des modifications Ă  votre infrastructure. Avant toute opĂ©ration, Terraform effectue un rafraĂźchissement pour mettre Ă  jour l’état avec celle de l’infrastructure rĂ©elle.

Le workflow de Terraform

Worflow Terraform

Le workflow de Terraform reposent sur cinq Ă©tapes clĂ©s : Write, Init, Plan, Apply et Destroy et sur l’enregistrement du state:

  1. Write: Vous commencez à écrire votre configuration.
  2. Init: Vous initialisez votre configuration pour installer les dépendances nécessaires.
  3. Plan: Vous auditez les changements et validez simplement si vous les acceptez.
  4. Apply: Vous appliquez les changements Ă  l’infrastructure rĂ©elle.
  5. Destroy: Vous décommissionnez toute votre infrastructure.

Ensuite, vous modifiez votre code, vous rebouclez par plan, apply et ainsi de suite. La phase de destroy n’intervenant que lorsque vous n’avez plus besoin de ces ressources.

Installer et configurer Terraform

Terraform est un outil polyvalent qui peut ĂȘtre installĂ© sur diffĂ©rentes plateformes, notamment Linux, macOS et Windows. Dans cette section, nous allons examiner comment installer Terraform en utilisant les dĂ©pĂŽts officiels d’HashiCorp pour chaque plateforme.

Pour Linux

Pour les distributions Linux, HashiCorp fournit un dĂ©pĂŽt officiel permettant d’installer Terraform avec des gestionnaires de paquets tels que apt (pour Ubuntu/Debian) et dnf (pour CentOS/RHEL).

Pour Ubuntu/Debian

Terminal window
sudo apt update && sudo apt install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

Si vous ne maitrisez pas le gestionnaire de paquets apt, je vous recommande de lire mon guide sur apt pour mieux comprendre son fonctionnement.

Pour RHEL family: Centos, Oracle Linux, Alma Linux, Rocky Linux

Terminal window
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform

Pour MacOs

Pour macOS, vous pouvez utiliser le gestionnaire de paquets Homebrew pour installer Terraform. Assurez-vous que vous avez Homebrew installĂ©. Si ce n’est pas le cas, installez-le depuis https://brew.sh ↗.

Dans une fenĂȘtre Terminal :

Terminal window
brew install terraform

Pour Windows

Sur Windows, vous pouvez utiliser le gestionnaire de paquets Chocolatey pour installer Terraform. Assurez-vous que vous avez Chocolatey installĂ©. Si ce n’est pas le cas, installez-le depuis https://chocolatey.org ↗.

Ouvrez une invite de commandes ou PowerShell en tant qu’administrateur.

Terminal window
choco install terraform

AprĂšs avoir suivi ces Ă©tapes d’installation, vous pouvez vĂ©rifier que Terraform est correctement installĂ© en exĂ©cutant la commande terraform version. Elle affichera la version de Terraform installĂ©e sur votre systĂšme.

La CLI terraform

La CLI de Terraform possĂšde les commandes suivantes :

  • init : La commande init va initialiser le rĂ©pertoire de travail et vĂ©rifier que les plugins utilisĂ©s sont correctement installĂ©s.
  • plan : La commande plan permet de crĂ©er un plan d’exĂ©cution. Terraform va indiquer quelles actions il doit effectuer pour arriver au rĂ©sultat dĂ©crit dans le fichier de configuration.
  • apply : L’infrastructure voulue est mise en place.
  • console : Cette commande permet de faire du dĂ©bogage, avant de crĂ©er un plan ou de l’appliquer.
  • destroy : L’infrastructure est dĂ©truite

Structure d’un projet Terraform

Pour un projet trĂšs simple, vous pouvez regrouper tout dans un seul fichier main.tf. Cependant, je vous conseille d’adopter une structure pour vous y retrouver facilement dans tous vos projets, voici la structure que j’ai adoptĂ©e :

  • RĂ©pertoireproject_directory
    • README.md
    • main.tf
    • variables.tf
    • outputs.tf
    • resources.tf
    • provider.tf
    • terraform.tfvars
    • RĂ©pertoiremodules:
      • RĂ©pertoiremodule1:
        • README.md
        • variables.tf
        • main.tf
        • outputs.tf
  • Le fichier main.tf qui est le fichier principal d’un projet terraform
  • Le fichier provider.tf pour y dĂ©finir les fournisseurs
  • Le fichier variables.tf pour les variables principales
  • Le fichier terraform.tfvars pour les variables secrĂštes qui ne sera pas stockĂ© dans votre repository git
  • Le fichier de variables *.auto.tfvars variables qui sont lues automatiquement
  • Le fichier outputs.tf pour y dĂ©finir tout ce qui sera affichĂ©
  • Les fichiers resources.tf pour un petit projet un simple fichier resources.tf suffira pour de plus prend vous pouvez en crĂ©er plusieurs avec des noms explicites.
  • Les modules
  • Le fichier .gitignore dont voici le contenu :
# Local .terraform directories
**/.terraform/*
# .tfstate files
*.tfstate
*.tfstate.*
# Crash log files
crash.log
# Exclude all .tfvars files, which are likely to contain sentitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
#
*.tfvars
# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json
# Include override files you do wish to add to version control using negated pattern
#
# !example_override.tf
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*
# Ignore CLI configuration files
.terraformrc
terraform.rc

L’ordre des blocs et des fichiers dans lesquels ils sont organisĂ©s ne sont gĂ©nĂ©ralement pas significatifs ; En effet Terraform utilise les relations implicites et explicites entre les ressources pour dĂ©terminer dans quel ordre les opĂ©rations vont s’exĂ©cuter.

Quelques bonnes pratiques

Voici quelques bonnes pratiques essentielles Ă  suivre avec Terraform pour garantir une gestion efficace de votre infrastructure :

Verrouillage des versions des providers

Il est essentiel de spĂ©cifier les versions des providers dans ton fichier de configuration pour garantir que ton infrastructure reste stable, mĂȘme si des mises Ă  jour sont publiĂ©es. Cela permet de maĂźtriser les changements et d’éviter les incompatibilitĂ©s inattendues. Avant de l’appliquer sur la production teste ces nouvelles versions sur un autre environnement.

Organiser le code par environnement

Il est important de sĂ©parer les environnements (dĂ©veloppement, test, production) pour Ă©viter les erreurs et garantir une isolation correcte des Ă©tats Terraform. L’utilisation de workspaces est une excellente approche pour cela.

Modularité du code

Adopter une structure modulaire permet de rĂ©utiliser et d’organiser efficacement ton code Terraform. Cela aide Ă  Ă©viter la duplication de code et Ă  simplifier la maintenance. Chaque composant de ton infrastructure, comme les rĂ©seaux ou les instances, devrait ĂȘtre encapsulĂ© dans des modules rĂ©utilisables.

Gestion centralisĂ©e de l’état

Stocker l’état Terraform de maniĂšre centralisĂ©e (par exemple, dans Terraform Cloud ou dans un backend distant comme Outscale S3) garantit que tous les membres de l’équipe accĂšdent Ă  un Ă©tat unique et Ă  jour. Cela est particuliĂšrement utile pour Ă©viter les conflits et les erreurs lors des modifications simultanĂ©es.

Protéger les secrets

Lorsque tu gĂšres des infrastructures avec Terraform, il est essentiel de sĂ©curiser les informations sensibles comme les clĂ©s API, les identifiants de base de donnĂ©es ou les mots de passe. Pour cela, il est recommandĂ© d’utiliser un outil comme HashiCorp Vault. Cet outil permet de stocker et de gĂ©rer les secrets de maniĂšre sĂ©curisĂ©e et d’y accĂ©der de maniĂšre contrĂŽlĂ©e depuis tes configurations Terraform.

Voici les bonnes pratiques à suivre pour protéger tes secrets :

  • Ne stocke jamais de secrets en clair dans ton code ou dans le fichier terraform.tfvars. Utilise des variables marquĂ©es comme sensibles.
  • IntĂšgre HashiCorp Vault pour stocker et rĂ©cupĂ©rer dynamiquement des secrets pendant le provisioning de ton infrastructure. Vault permet de sĂ©curiser les accĂšs et de gĂ©rer les rotations automatiques des secrets.
  • Évite d’ajouter les fichiers contenant des secrets dans ton dĂ©pĂŽt Git. Utilise un fichier .gitignore pour exclure les fichiers sensibles.

Pour en savoir plus sur la protection des secrets avec HashiCorp Vault, consulte cet article ici.

En appliquant ces pratiques, tu sécurises ton infrastructure et garantis que les informations sensibles sont protégées à chaque étape du déploiement. Nous reverrons tous ces points dans les chapitres suivants.

La suite

Vous pouvez poursuivre la lecture sur les billets suivants :

Plus d’infos