Débloquer un fichier d'état Terraform utilisant un backend Azure

Débloquer un fichier d'état Terraform utilisant un backend Azure

Il peut arriver que le fichier d'état soit verrouillé voici comment se débloquer

Introduction

Lorsque vous travaillez avec Terraform, l'un des éléments clés est le fichier d'état. Ce fichier joue un rôle crucial dans le suivi de l'état actuel de votre infrastructure et dans la détermination des modifications à apporter pour atteindre l'état désiré.

Cependant, lors de l'exécution de Terraform en parallèle ou dans des environnements d'équipe, il peut arriver que le fichier d'état soit verrouillé, empêchant ainsi d'autres opérations de Terraform de s'exécuter simultanément.

Dans cet article, nous allons explorer comment utiliser Azure CLI pour libérer un fichier d'état de Terraform verrouillé dans un compte de stockage Azure. Cette technique est particulièrement utile dans les situations où un processus Terraform est interrompu ou échoue, laissant le fichier d'état dans un état verrouillé.

Azure CLI script

Ce script Azure CLI est utilisé pour libérer un lease sur un blob dans un compte de stockage Azure.

# Définissez vos variables
ACCOUNT_NAME="<your_account_name>"
RESOURCE_GROUP="<your_resource_group>"
SUBSCRIPTION_ID="<your_subscription_id>"
BLOB_NAME="<state_filename>"
STORAGE_ACCOUNT_NAME="<your_storage_account_name>"
CONTAINER_NAME="<blob_container_name>"

# Obtenez la clé de stockage Azure
AZURE_STORAGE_KEY=$(az storage account keys list \
    --account-name "${ACCOUNT_NAME}" \
    --resource-group "${RESOURCE_GROUP}" \
    --subscription "${SUBSCRIPTION_ID}" \
    --query "[0].value" \
    --output tsv
)

# Casser le lease sur le blob
az storage blob lease break \
    --blob-name "${BLOB_NAME}" \
    --account-name "${STORAGE_ACCOUNT_NAME}" \
    --account-key "${AZURE_STORAGE_KEY}" \
    --container-name "${CONTAINER_NAME}" \
    --subscription "${SUBSCRIPTION_ID}" || true
  1. La première partie, permet de définir un ensemble de variables lié à votre contexte d'exécution.

  2. Ensuite, il récupère la clé de stockage Azure pour le compte spécifié en utilisant la commande az storage account keys list.

  3. Enfin, il utilise la commande az storage blob lease break pour libérer le lease sur le blob spécifié.

💡
Si la commande échoue pour une raison quelconque, le script continue à s'exécuter grâce à l'opérateur || true.

Azure PowerShell

Si des fois, vous préférez le PowerShell voici une alternative au script précédent:

# Définissez vos variables
$ACCOUNT_NAME="<your_account_name>"
$RESOURCE_GROUP="<your_resource_group>"
$SUBSCRIPTION_ID="<your_subscription_id>"
$BLOB_NAME="<state_filename>"
$STORAGE_ACCOUNT_NAME="<your_storage_account_name>"
$CONTAINER_NAME="<blob_container_name>"

# Sélectionnez le bon abonnement
Select-AzSubscription -SubscriptionId $SUBSCRIPTION_ID

# Obtenez la clé de stockage Azure
$AZURE_STORAGE_KEY = (Get-AzStorageAccountKey -ResourceGroupName $RESOURCE_GROUP -AccountName $ACCOUNT_NAME).Value[0]

# Casser le lease sur le blob
$context = New-AzStorageContext -StorageAccountName $STORAGE_ACCOUNT_NAME -StorageAccountKey $AZURE_STORAGE_KEY
$blob = Get-AzStorageBlob -Container $CONTAINER_NAME -Blob $BLOB_NAME -Context $context
$leaseStatus = $blob.ICloudBlob.Properties.LeaseStatus

if ($leaseStatus -eq 'Locked') {
    $blob.ICloudBlob.BreakLease()
}

Pipeline YAML Azure DevOps

Azure DevOps offre une puissante fonctionnalité appelée "Pipelines" qui permet aux développeurs de définir et de gérer leurs processus de CI/CD (Intégration Continue / Déploiement Continu) directement dans leur code source. L'un des formats pris en charge pour définir ces pipelines est le YAML (Yet Another Markup Language).
Ce chapitre va vous aider à intégrer le code précédent dans une tâche Azure DevOps.

  1. Tâche Azure CLI
steps:
- task: AzureCLI@2
  inputs:
    azureSubscription: '<AzureServiceConnection>'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # Write your commands here
  displayName: 'Run Azure CLI commands'
  condition: succeededOrFailed()
  1. Tâche Azure PowerShell
steps:
- task: AzurePowerShell@5
  inputs:
    azureSubscription: '<AzureServiceConnection>'
    azurePowerShellVersion: LatestVersion
    ScriptType: 'InlineScript'
    Inline: |
      # Write your commands here
  displayName: 'Run Azure PowerShell commands'
  condition: succeededOrFailed()
💡
condition: succeededOrFailed() la condition précédente vous permet d'exécuter cette tâche quel que soit le résultat des tâches précédentes.

Conclusion

Dans cet article, nous avons exploré comment utiliser Azure CLI ou PowerShell pour briser un lease sur un blob dans un compte de stockage Azure, ce qui permet de libérer le fichier d'état de Terraform et de reprendre les opérations normales.

Il est important de noter que bien que cette technique soit utile dans certaines situations, elle doit être utilisée avec prudence. La rupture d'un lease sur un blob peut avoir des conséquences inattendues si le blob est actuellement utilisé par un autre processus. Par conséquent, il est recommandé de mettre en place des mécanismes de surveillance et d'alerte pour détecter et résoudre rapidement les problèmes liés aux fichiers d'état de Terraform.

En fin de compte, la gestion efficace des fichiers d'état de Terraform est une compétence essentielle pour tout développeur ou administrateur système travaillant avec Terraform et Azure.

En maîtrisant les techniques présentées dans cet article, vous serez mieux équipé pour gérer les défis qui peuvent survenir lors de l'utilisation de Terraform à grande échelle.


Liens utiles:

Did you find this article valuable?

Support Antoine LOIZEAU's Blog by becoming a sponsor. Any amount is appreciated!