Terraform — Provider Azure

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Provider Terraform pour le cloud public
Provider hashicorp/azurerm
Auth recommandée identité managée / service principal OIDC, pas de secret en dur
Backend de state Storage Account + conteneur blob
Voir aussi Azure · Terraform — Concepts fondamentaux · Terraform — Provider AWS · Terraform — Provider GCP

Cette page couvre le provider Terraform azurerm : authentification, ressources typiques et backend de state sur Azure Storage. Pour une présentation générale d'Azure (CLI, groupes de ressources, supervision), voir la page dédiée. Pour les notions transverses de state et de verrouillage, voir Terraform — Concepts fondamentaux.

Déclaration du provider

terraform {
  required_version = ">= 1.6"
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.100"
    }
  }
}

provider "azurerm" {
  features {}
}

Authentification

Comme rappelé sur la page Azure, un mot de passe/secret d'application (appId + password issus de az ad sp create-for-rbac) ne doit jamais figurer en dur dans le code Terraform. Le provider azurerm se configure préférentiellement sans secret statique :

  1. identité managée (managed identity) attachée à la ressource qui exécute Terraform (VM Azure, Azure DevOps agent hébergé sur Azure, Azure Container Instance) — aucun secret à gérer ;
  2. service principal + fédération OIDC depuis une CI externe (GitLab CI, GitHub Actions) — le pipeline échange un jeton OIDC court contre un jeton Azure AD, sans mot de passe stocké ;
  3. à défaut, service principal avec secret ou certificat stocké dans un coffre (Key Vault, variable protégée CI) — solution de repli, pas la cible.
provider "azurerm" {
  features {}

  use_oidc        = true
  client_id       = "00000000-0000-0000-0000-000000000000"
  tenant_id       = "00000000-0000-0000-0000-000000000000"
  subscription_id = "00000000-0000-0000-0000-000000000000"
}

Les GUID ci-dessus sont des identifiants d'exemple (à zéros), comme sur la page Azure — jamais de vrai appId/secret dans le code ou un dépôt.

Ressources typiques

resource "azurerm_resource_group" "app" {
  name     = "rg-exemple-prod"
  location = "westeurope"
}

resource "azurerm_virtual_network" "app" {
  name                = "vnet-exemple"
  address_space       = ["10.10.0.0/16"]
  location            = azurerm_resource_group.app.location
  resource_group_name = azurerm_resource_group.app.name
}

resource "azurerm_linux_virtual_machine" "web" {
  name                = "vm-web-01"
  resource_group_name = azurerm_resource_group.app.name
  location            = azurerm_resource_group.app.location
  size                = "Standard_B2s"
  admin_username      = "azureuser"

  admin_ssh_key {
    username   = "azureuser"
    public_key = file("~/.ssh/id_ed25519.pub")
  }

  # network_interface_ids, os_disk, source_image_reference : omis pour la lisibilité
}
  • azurerm_resource_group — groupe de ressources, notion structurante côté Azure (voir la page Azure : pas d'équivalent direct chez AWS).
  • azurerm_virtual_network — réseau virtuel, prérequis courant avant toute VM.
  • azurerm_linux_virtual_machine — machine virtuelle (l'équivalent conceptuel de l'instance EC2 côté AWS).

Backend de state : Storage Account + conteneur blob

Le backend recommandé pour Azure stocke le state comme un blob dans un conteneur d'un Storage Account. Le verrouillage s'appuie sur le mécanisme de bail (lease) natif du stockage Blob, sans composant additionnel (contrairement à AWS, qui nécessite une table DynamoDB séparée pour le verrouillage historique).

terraform {
  backend "azurerm" {
    resource_group_name = "rg-tfstate"
    storage_account_name = "sttfstateexempleprod"
    container_name        = "tfstate"
    key                    = "infra/network.tfstate"
  }
}

Prérequis à créer une seule fois (hors Terraform, ou via un bootstrap séparé) :

resource "azurerm_resource_group" "tfstate" {
  name     = "rg-tfstate"
  location = "westeurope"
}

resource "azurerm_storage_account" "tfstate" {
  name                     = "sttfstateexempleprod"
  resource_group_name     = azurerm_resource_group.tfstate.name
  location                = azurerm_resource_group.tfstate.location
  account_tier             = "Standard"
  account_replication_type = "LRS"

  blob_properties {
    versioning_enabled = true
  }
}

resource "azurerm_storage_container" "tfstate" {
  name                  = "tfstate"
  storage_account_name = azurerm_storage_account.tfstate.name
  container_access_type = "private"
}

Le nom d'un Storage Account doit être globalement unique sur Azure (entre 3 et 24 caractères alphanumériques en minuscules) ; sttfstateexempleprod est un exemple, pas un identifiant réel.

Voir aussi