Terraform — Provider Azure
| 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 :
- 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 ;
- 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é ;
- à 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
- Azure — CLI, groupes de ressources, supervision
- Terraform — Concepts fondamentaux — state, backend, verrouillage
- Terraform — Provider AWS · Terraform — Provider GCP
- Terraform — Modules et variables