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:
- 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).
- 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 applysimultanei. - 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.
- 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.