Comment utiliser Terraform pour déployer une infrastructure cloud automatisée?

Actu

À l’ère du cloud, l’automatisation de votre infrastructure est essentielle pour rester compétitif et efficace. Terraform se distingue comme un outil open source incontournable, vous permettant de gérer et de déployer votre infrastructure cloud comme du code. Que vous soyez novice ou expert, cet article vous guidera à travers les étapes essentielles pour utiliser Terraform et automatiser votre infrastructure sur des plateformes comme Azure et Google Cloud.

Les bases de Terraform : De l’infrastructure comme du code

Terraform est un outil puissant pour la gestion d’infrastructure. Il permet de définir, provisionner et gérer des infrastructures cloud via des fichiers de configuration en utilisant une syntaxe simple et lisible. Cette approche "infrastructure as code" (IaC) offre une multitude d’avantages, notamment en termes de versioning, de contrôle des modifications et de collaborations d’équipe.

Les configurations dans Terraform sont uniques car elles utilisent un langage de description appelé HashiCorp Configuration Language (HCL). Ce langage simplifié permet de décrire de manière déclarative les composants de votre infrastructure (réseaux, machines virtuelles, bases de données, etc.). Terraform lit ces fichiers de configuration et se charge de créer et de gérer les ressources définies.

Une des forces de Terraform réside dans son état, qui garde la trace des ressources gérées par votre configuration. Cela permet à Terraform de comprendre les modifications nécessaires pour atteindre l’état souhaité de l’infrastructure.

Déployer une infrastructure sur Azure avec Terraform

Azure est l’une des nombreuses plateformes compatibles avec Terraform. Pour commencer, vous aurez besoin de quelques éléments :

  • Un compte Azure
  • Terraform installé sur votre machine
  • Un fichier de configuration

Préparation de l’environnement

Tout d’abord, assurez-vous que Terraform est bien installé. Vous pouvez le faire en téléchargeant la dernière version depuis le site officiel de HashiCorp. Ensuite, connectez-vous à votre compte Azure en utilisant l’outil de ligne de commande Azure CLI et créez un principal de service pour donner à Terraform les permissions nécessaires à la gestion des ressources.

az login
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/<SUBSCRIPTION_ID>"

Ce command vous fournira des détails cruciaux comme le client_id, client_secret, tenant_id et subscription_id, que vous devrez inclure dans votre fichier de configuration Terraform.

Configuration de Terraform pour Azure

Créez un dossier de projet et un fichier principal de configuration appelé main.tf. Ce fichier contiendra la définition des ressources que vous souhaitez déployer.

provider "azurerm" {
  features {}

  subscription_id = "<SUBSCRIPTION_ID>"
  client_id       = "<CLIENT_ID>"
  client_secret   = "<CLIENT_SECRET>"
  tenant_id       = "<TENANT_ID>"
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

resource "azurerm_virtual_network" "example" {
  name                = "example-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_subnet" "example" {
  name                 = "example-subnet"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_network_interface" "example" {
  name                = "example-nic"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.example.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_virtual_machine" "example" {
  name                  = "example-machine"
  location              = azurerm_resource_group.example.location
  resource_group_name   = azurerm_resource_group.example.name
  network_interface_ids = [azurerm_network_interface.example.id]
  vm_size               = "Standard_DS1_v2"

  storage_os_disk {
    name              = "osdisk"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }

  storage_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }

  os_profile {
    computer_name  = "example-machine"
    admin_username = "adminuser"
    admin_password = "MyP@ssword!"
  }

  os_profile_linux_config {
    disable_password_authentication = false
  }
}

Après avoir configuré le fichier main.tf, vous pouvez exécuter les commandes suivantes pour initialiser et déployer votre infrastructure :

terraform init
terraform apply

Google Cloud : Une autre dimension avec Terraform

Google Cloud offre également une intégration harmonieuse avec Terraform. Pour commencer, assurez-vous d’avoir un compte Google Cloud et que vous avez installé gcloud et Terraform sur votre machine.

Configuration initiale

Connectez-vous à votre compte Google Cloud et configurez les permissions nécessaires. Créez un fichier de configuration main.tf adapté à Google Cloud.

provider "google" {
  project = "<PROJECT_ID>"
  region  = "us-central1"
  credentials = file("<PATH_TO_CREDENTIALS_JSON>")
}

resource "google_compute_network" "vpc_network" {
  name = "terraform-network"
}

resource "google_compute_instance" "vm_instance" {
  name         = "terraform-instance"
  machine_type = "f1-micro"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    network = google_compute_network.vpc_network.name
    access_config { }
  }
}

Exécutez ensuite les commandes suivantes pour appliquer les configurations :

terraform init
terraform apply

La gestion d’infrastructure avec Terraform

La gestion de l’infrastructure via Terraform ne se limite pas simplement à la création de ressources. Vous pouvez également versionner votre configuration, ce qui permet de suivre les modifications au sein de votre infrastructure au fil du temps. Terraform Cloud et Terraform Enterprise offrent des fonctionnalités avancées pour la collaboration et la gestion des états.

Versioning et collaboration

En utilisant des systèmes de contrôle de version comme Git, vous pouvez suivre les modifications apportées à vos fichiers de configuration. Cela permet une collaboration efficace entre les membres de l’équipe. En cas de problème, vous pouvez facilement revenir à une version antérieure de votre configuration.

Gestion de l’état Terraform

L’état Terraform est essentiel pour maintenir une synchronisation entre la configuration décrite dans les fichiers et les ressources réelles sur le cloud. Cet état peut être stocké localement ou sur des solutions de stockage distant comme Terraform Cloud, Amazon S3, ou Google Cloud Storage. Cela permet une gestion centralisée de l’état et une collaboration fluide entre les équipes.

terraform {
  backend "gcs" {
    bucket  = "<BUCKET_NAME>"
    prefix  = "terraform/state"
  }
}

Terraform a révolutionné la manière dont nous gérons les infrastructures cloud. En permettant de traiter l’infrastructure comme du code, il simplifie le déploiement, la gestion et la versioning des ressources. Que vous travailliez avec Azure, Google Cloud ou d’autres fournisseurs, Terraform offre une flexibilité et une efficacité sans précédent.

En intégrant Terraform dans votre workflow, vous pouvez automatiser les tâches répétitives, réduire les erreurs humaines et améliorer la collaboration entre les équipes. Cette approche moderne et agile vous prépare pour l’avenir du cloud computing.

Avec Terraform, vous avez entre les mains un outil puissant pour déployer et gérer votre infrastructure cloud, vous permettant de concentrer votre énergie sur ce qui compte vraiment : l’innovation et la croissance de votre entreprise.