Torna al Blog
#Terraform
#GCP
#InfrastructureAsCode
#CloudArchitecture
#WIF
#CloudStorage
#DevSecOps

Migrazione Terraform State: da Terraform Cloud a Google Cloud Storage con WIF

•Autore: Enzo Carlettini
Migrazione Terraform State: da Terraform Cloud a Google Cloud Storage con WIF

Il file di stato di Terraform (terraform.tfstate) è il cuore pulsante di qualsiasi infrastruttura gestita come codice (IaC). Contiene la mappatura esatta tra le definizioni dichiarative dei manifest .tf e le risorse reali attive nel Cloud provider (ID risorse, indirizzi IP, chiavi e metadati sensibili).

Per molti team che utilizzano Google Cloud Platform (GCP), mantenere il backend remoto su piattaforme SaaS terze (come Terraform Cloud/HCP) può introdurre complessità di governance, costi crescenti di licenza e la necessità di gestire chiavi API esterne.

In questo articolo approfondiamo la strategia e i comandi pratici per migrare in sicurezza il backend di Terraform da Terraform Cloud a un bucket dedicato Google Cloud Storage (GCS), sfruttando la Workload Identity Federation (WIF) per eliminare qualsiasi credenziale statica dalle pipeline CI/CD.


1. Perché Google Cloud Storage (GCS) come Backend Terraform?

La migrazione a GCS offre vantaggi architetturali immediati:

  1. Governance & Sovranità dei Dati: I file di stato risiedono all’interno dell’organizzazione GCP aziendale, protetti dalle stesse policy di sicurezza, VPC Service Controls e crittografia (CMEK o Google-managed keys).
  2. State Locking Nativo Automatico: GCS implementa la concorrenza forte e lo state locking integrato (sfruttando le generazioni di oggetti GCS), impedendo corruzioni dello stato causate da terraform apply simultanei.
  3. Object Versioning e Rollback Istantaneo: Abilitando il versionamento sul bucket, ogni modifica allo stato crea una nuova versione immutabile, consentendo di ripristinare uno stato precedente in pochi secondi in caso di disastri.
  4. Zero Costi Nascosti: Nessun costo per workspace o limitazioni sul numero di risorse gestite.

2. Preparazione del Bucket GCS con Versioning e Restrizioni

Prima della migrazione, creiamo e proteggiamo il bucket GCS di destinazione:

# 1. Creazione del bucket in regione europea protetta
gcloud storage buckets create gs://pc-terraform-state-prod \
  --project=my-gcp-project-id \
  --location=europe-west1 \
  --uniform-bucket-level-access

# 2. Abilitazione tassativa del versioning degli oggetti
gcloud storage buckets update gs://pc-terraform-state-prod \
  --versioning

# 3. Prevenzione dell'accesso pubblico (Public Access Prevention)
gcloud storage buckets update gs://pc-terraform-state-prod \
  --public-access-prevention

3. Autenticazione Passwordless in CI/CD con WIF (Workload Identity Federation)

Uno dei rischi maggiori nella gestione IaC è il salvataggio di chiavi JSON Service Account a lunga scadenza nei secret di GitHub Actions o GitLab CI.

Con GCP Workload Identity Federation (WIF), la pipeline scambia un token OIDC a breve durata emesso da GitHub con un token federato GCP di durata limitata (1 ora):

# Step di autenticazione GitHub Actions con WIF
- name: Authenticate to Google Cloud via WIF
  uses: google-github-actions/auth@v2
  with:
    workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/github-pool/providers/github-provider'
    service_account: 'terraform-deployer@my-gcp-project-id.iam.gserviceaccount.com'

- name: Setup Terraform
  uses: hashicorp/setup-terraform@v3

Il Service Account dedicato necessita esclusivamente del ruolo roles/storage.objectAdmin limitato al solo bucket del tfstate.


4. Procedura di Migrazione dello Stato Passo-Passo

La migrazione da Terraform Cloud (blocco cloud {}) a Google Cloud Storage (blocco backend "gcs" {}) si effettua in tre semplici step:

Step 1: Backup Preventivo dello Stato

# Eseguiamo il pull dello stato attuale da Terraform Cloud
terraform state pull > backup-pre-migration.tfstate

Step 2: Aggiornamento della Configurazione Backend

Sostituiamo la definizione del backend nel file versions.tf o backend.tf:

# Configurazione Precedente (Terraform Cloud)
# terraform {
#   cloud {
#     organization = "mia-azienda"
#     workspaces {
#       name = "prod-infrastructure"
#     }
#   }
# }

# Nuova Configurazione Protetta su GCS
terraform {
  backend "gcs" {
    bucket = "pc-terraform-state-prod"
    prefix = "infrastructure/prod"
  }
}

Step 3: Inizializzazione con Migrazione di Stato

Eseguiamo il comando init con il flag -migrate-state:

terraform init -migrate-state

Terraform rileverà il cambio di backend, chiederà conferma per copiare lo stato esistente da Terraform Cloud al nuovo bucket GCS e completerà il trasferimento in modo atomico.


5. Best Practice Post-Migrazione

  • Locking dei Permessi IAM: Rimuovere i permessi di lettura/scrittura sul bucket a tutti gli utenti umani e riservarli esclusivamente al Service Account WIF della CI/CD.
  • Lifecycle Policy: Configurare una regola di lifecycle sul bucket GCS per eliminare le versioni non correnti degli oggetti più vecchie di 90 o 180 giorni, ottimizzando lo storage.