Stocker l’état de Terraform dans le stockage Azure

Terraform permet la définition, l’aperçu et le déploiement d’une infrastructure cloud. Terraform vous permet de créer des fichiers de configuration à l’aide de la syntaxe HCL. La syntaxe HCL vous permet de spécifier un fournisseur de services cloud, tel qu’Azure, et les éléments qui composent votre infrastructure cloud. Après avoir créé vos fichiers de configuration, vous créez un plan d’exécution qui vous permet d’afficher un aperçu de vos modifications d’infrastructure avant leur déploiement. Une fois que vous avez vérifié les modifications, vous appliquez le plan d’exécution pour déployer l’infrastructure.

L’état Terraform est utilisé pour rapprocher des ressources déployées avec les configurations de Terraform. L’état permet à Terraform de savoir quelles ressources Azure ajouter, mettre à jour ou supprimer.

Par défaut, l’état de Terraform est stocké localement, ce qui n’est pas idéal pour les raisons suivantes :

  • L’état local ne fonctionne pas correctement dans une équipe ou un environnement de collaboration.
  • L’état Terraform peut inclure des informations sensibles.
  • Le stockage de l’état localement augmente les risques de suppression accidentelle.

Dans cet article, vous apprendrez comment :

  • Créer un compte de stockage Azure
  • Utiliser le stockage Azure pour stocker l’état de Terraform à distance
  • Comprendre le verrouillage de l’état
  • Comprendre le chiffrement au repos

1. Configurer votre environnement

  • Abonnement Azure : Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

2. Configurer le compte de stockage de l’état à distance

Avant d’utiliser le stockage Azure comme back-end, vous devez créer un compte de stockage.

Exécutez la configuration ou les commandes suivantes pour créer un conteneur et un compte de stockage Azure :

#!/bin/bash

RESOURCE_GROUP_NAME=tfstate
STORAGE_ACCOUNT_NAME=tfstate$RANDOM
CONTAINER_NAME=tfstate

# Create resource group
az group create --name $RESOURCE_GROUP_NAME --location eastus

# Create storage account
az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob

# Create blob container
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME

Points essentiels :

  • Les comptes de stockage Azure nécessitent un nom globalement unique. Pour en savoir plus sur la résolution des problèmes liés aux noms de compte de stockage, consultez Résoudre les erreurs liées aux noms de compte de stockage.
  • L’état Terraform est stocké en texte brut et peut contenir des secrets. Si l’état est correctement sécurisé, un accès non autorisé aux systèmes et à la perte de données peut entraîner une perte de données.
  • Dans cet exemple, Terraform s’authentifie auprès du compte de stockage Azure à l’aide d’une clé d’accès. Dans un déploiement de production, il est recommandé d’évaluer les options d’authentification disponibles prises en charge par le back-end azurerm et d’utiliser l’option la plus sécurisée pour votre cas d’usage.
  • Dans cet exemple, l’accès au réseau public est autorisé à ce compte de stockage Azure. Dans un déploiement de production, il est recommandé de restreindre l’accès à ce compte de stockage à l’aide d’un pare-feu de stockage, d’un point de terminaison de service ou d’un point de terminaison privé.

3. Configurer l’état du back-end Terraform

Pour configurer l’état du back-end, vous avez besoin des informations suivantes concernant le stockage Azure :

  • storage_account_name : nom du compte de stockage Azure.
  • container_name : nom du conteneur d’objets blob.
  • key : nom du fichier de magasin d’état à créer.
  • access_key : clé d’accès de stockage.

Chacune de ces valeurs peut être spécifiée dans le fichier de configuration Terraform ou sur la ligne de commande. Nous vous recommandons d’utiliser une variable d’environnement pour la valeur access_key. Utiliser une variable d’environnement empêche la clé d’être écrite dans le disque.

Exécutez les commandes suivantes pour obtenir la clé d’accès de stockage et la stocker en tant que variable d’environnement :

ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)
export ARM_ACCESS_KEY=$ACCOUNT_KEY

Points essentiels :

  • Pour mieux protéger la clé d’accès du compte de stockage Azure, stockez-la dans Azure Key Vault. La variable d’environnement peut ensuite être définie à l’aide d’une commande semblable à ce qui suit. Pour plus d’informations sur Azure Key Vault, consultez la documentation concernant Azure Key Vault.

    export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)
    

Créez une configuration Terraform avec un bloc de configuration backend.

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
  backend "azurerm" {
      resource_group_name  = "tfstate"
      storage_account_name = "<storage_account_name>"
      container_name       = "tfstate"
      key                  = "terraform.tfstate"
  }

}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "state-demo-secure" {
  name     = "state-demo"
  location = "eastus"
}

Remplacez <storage_account_name> par le nom de votre compte de stockage Azure.

Exécutez la commande suivante pour initialiser la configuration :

terraform init

Exécutez la commande suivante pour lancer la configuration :

terraform apply

Vous pouvez maintenant trouver le fichier d’état dans Azure Storage Blob.

4. Comprendre le verrouillage de l’état

Les objets blob Azure Storage Blob sont automatiquement verrouillés avant toute opération d’écriture de l’état. Ce modèle empêche les opérations d’état simultanées, lesquelles peuvent entraîner un endommagement.

Pour plus d’informations, consultez Verrouillage de l’état dans la documentation Terraform.

Vous pouvez voir le verrou quand vous examinez l’objet blob via le portail Azure ou d’autres outils de gestion Azure.

Azure blob with lock

5. Comprendre le chiffrement au repos

Les données stockées dans un objet blob Azure sont chiffrées avant d’être conservées. Si nécessaire, Terraform récupère l’état du back-end et le stocke dans la mémoire locale. Si vous utilisez ce modèle, l’état n’est jamais écrit sur votre disque local.

Pour plus d’informations sur le chiffrement du stockage Azure, consultez Chiffrement du service de stockage Azure pour les données au repos.

Résoudre les problèmes liés à Terraform sur Azure

Résoudre les problèmes courants liés à l’utilisation de Terraform sur Azure

Étapes suivantes