Archiviare lo stato Terraform in Archiviazione di Azure

Terraform consente di definire, visualizzare in anteprima e distribuire l'infrastruttura cloud. Con Terraform è possibile creare file di configurazione usando la sintassi HCL. La sintassi HCL consente di specificare il provider di servizi cloud, ad esempio Azure, e gli elementi che costituiscono l'infrastruttura cloud. Dopo aver creato i file di configurazione, è necessario creare un piano di esecuzione che consenta di visualizzare in anteprima le modifiche apportate all'infrastruttura prima che vengano distribuite. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.

Lo stato Terraform viene usato per risolvere le differenze tra le risorse distribuite con configurazioni Terraform. Stato consente a Terraform di individuare le risorse di Azure da aggiungere, aggiornare o eliminare.

Per impostazione predefinita, lo stato terraform viene archiviato in locale, che non è ideale per i motivi seguenti:

  • Lo stato locale non funziona correttamente in un ambiente di team o collaborazione.
  • Lo stato di Terraform può includere informazioni riservate.
  • L'archiviazione dello stato in locale aumenta le probabilità di eliminazioni accidentali.

In questo articolo vengono illustrate le operazioni seguenti:

  • Creare un account di archiviazione di Azure
  • Usare Archiviazione di Azure per archiviare lo stato terraform remoto.
  • Informazioni sul blocco dello stato
  • Informazioni sulla crittografia dei dati inattivi

1. Configurare l'ambiente

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

2. Configurare l'account di archiviazione dello stato remoto

Prima di usare Archiviazione di Azure come back-end, è necessario creare un account di archiviazione.

Eseguire i comandi o la configurazione seguenti per creare un account di archiviazione e un contenitore di 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

Punti principali:

  • Gli account di archiviazione di Azure richiedono un nome univoco globale. Per altre informazioni sulla risoluzione dei problemi relativi ai nomi degli account di archiviazione, vedere Risolvere gli errori per i nomi degli account di archiviazione.
  • Lo stato terraform viene archiviato in testo normale e può contenere segreti. Se lo stato non è protetto correttamente, l'accesso non autorizzato ai sistemi e la perdita di dati può comportare la perdita di dati.
  • In questo esempio Terraform esegue l'autenticazione all'account di archiviazione di Azure usando una chiave di accesso. In una distribuzione di produzione è consigliabile valutare le opzioni di autenticazione disponibili supportate dal back-end azurerm e usare l'opzione più sicura per il caso d'uso.
  • In questo esempio l'accesso alla rete pubblica è consentito a questo account di archiviazione di Azure. In una distribuzione di produzione è consigliabile limitare l'accesso a questo account di archiviazione usando un firewall di archiviazione, un endpoint di servizio o un endpoint privato.

3. Configurare lo stato back-end terraform

Per configurare lo stato back-end, sono necessarie le informazioni di archiviazione di Azure seguenti:

  • storage_account_name: nome dell'account Archiviazione di Azure.
  • container_name: nome del contenitore BLOB.
  • key: nome del file dell'archivio stati da creare.
  • access_key: chiave di accesso all'archiviazione.

Ognuno di questi valori può essere specificato nel file di configurazione di Terraform o nella riga di comando. È consigliabile usare una variabile di ambiente per il valore access_key. L'uso di una variabile di ambiente impedisce che la chiave venga scritta su disco.

Eseguire i comandi seguenti per ottenere la chiave di accesso all'archiviazione e archiviarla come variabile di ambiente:

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

Punti principali:

  • Per proteggere ulteriormente la chiave di accesso dell'account di Archiviazione di Azure, salvarla in Azure Key Vault. La variabile di ambiente può quindi essere impostata usando un comando simile al seguente. Per altre informazioni su Azure Key Vault, vedere la documentazione di Azure Key Vault.

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

Creare una configurazione Terraform con un backend blocco di configurazione.

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"
}

Sostituire <storage_account_name> con il nome del proprio account di archiviazione di Azure.

Eseguire il comando seguente per inizializzare la configurazione:

terraform init

Eseguire il comando seguente per eseguire la configurazione:

terraform apply

A questo punto il file dello stato si trova nel BLOB di Archiviazione di Azure.

4. Comprendere il blocco dello stato

I BLOB di Archiviazione di Azure vengono bloccati automaticamente prima di qualsiasi operazione di scrittura dello stato. Questo modello impedisce l'esecuzione simultanea di più operazioni sullo stato, che possono causare danni.

Per altre informazioni, vedere la sezione relativa al blocco dello stato nella documentazione di Terraform.

Il blocco può essere visto quando si esamina il BLOB tramite il portale di Azure o altri strumenti di gestione di Azure.

Azure blob with lock

5. Comprendere la crittografia dei dati inattivi

I dati archiviati in un BLOB di Azure vengono crittografati prima di diventare persistenti. Quando necessario, Terraform recupera lo stato dal back-end e lo archivia nella memoria locale. Se si usa questo modello, lo stato non viene mai scritto nel disco locale.

Per altre informazioni sulla crittografia di Archiviazione di Azure, vedere Crittografia del servizio Archiviazione di Azure per dati inattivi.

Risolvere i problemi di Terraform in Azure

Risolvere i problemi comuni relativi all'uso di Terraform in Azure

Passaggi successivi