Skip to content

Comandi principali Terraform

Terraform - Workflow

Comando Descrizione
terraform init Inizializza il progetto, scarica provider e moduli.
terraform init -upgrade Aggiorna provider e moduli all'ultima versione compatibile.
terraform validate Verifica la sintassi e la validità della configurazione.
terraform fmt Formatta automaticamente tutti i file .tf.
terraform plan Mostra le modifiche che verranno applicate.
terraform apply Applica le modifiche.
terraform apply -auto-approve Applica senza chiedere conferma.
terraform destroy Elimina tutte le risorse gestite.
terraform destroy -target=aws_s3_bucket.logs Elimina solo una specifica risorsa.

Terraform - State

Comando Descrizione
terraform state list Elenca tutte le risorse presenti nello state.
terraform state show <risorsa> Mostra il dettaglio di una risorsa nello state.
terraform state mv <src> <dst> Sposta una risorsa nello state (refactoring, cambio modulo, rename).
terraform state rm <risorsa> Rimuove una risorsa dallo state senza eliminarla su AWS.
terraform state pull Scarica lo state remoto.
terraform state pull > backup.tfstate Esegue il backup dello state.
terraform state push backup.tfstate Ripristina uno state precedentemente salvato.

Terraform - Output

Comando Descrizione
terraform output Mostra tutti gli output.
terraform output vpc_id Mostra un singolo output.
terraform output -json Restituisce gli output in formato JSON.
terraform output -json \| jq Visualizza gli output in formato leggibile.

Terraform - Provider e Moduli

Comando Descrizione
terraform providers Elenca provider richiesti da root, moduli e state.
terraform providers lock Aggiorna il lock file dei provider.
terraform version Mostra la versione di Terraform e dei provider installati.

Terraform - Workspace

Comando Descrizione
terraform workspace list Elenca i workspace.
terraform workspace new dev Crea un nuovo workspace.
terraform workspace select dev Seleziona un workspace.
terraform workspace show Mostra il workspace corrente.
terraform workspace delete dev Elimina un workspace.

Terraform - Import

Comando Descrizione
terraform import aws_s3_bucket.logs mio-bucket Importa una risorsa AWS nello state.
terraform import module.vpc.aws_vpc.this[0] vpc-xxxxxxxx Importa una risorsa direttamente in un modulo.

Terraform - Console

Comando Descrizione
terraform console Apre una console interattiva per testare espressioni Terraform.

Terraform - Utility

Comando Descrizione
terraform graph Genera il grafo delle dipendenze.
terraform graph \| dot -Tpng > graph.png Esporta il grafo delle dipendenze in PNG (richiede Graphviz).
terraform fmt -recursive Formatta ricorsivamente tutto il progetto.
terraform plan -out=tfplan Salva il piano su file.
terraform apply tfplan Applica un piano precedentemente salvato.

Comandi utili GitLab Backend

Comando Descrizione
terraform state pull > backup-$(date +%F-%H%M).tfstate Backup dello state remoto prima di modifiche importanti.
terraform state push backup.tfstate Ripristina il backup dello state remoto.
terraform init -reconfigure Reinizializza il backend dopo modifiche alla configurazione.

Comandi consigliati durante lo sviluppo

terraform fmt -recursive
terraform validate
terraform plan

Comandi consigliati prima di modificare lo State

terraform state pull > backup.tfstate
terraform state list
terraform plan

Comandi consigliati dopo un refactoring

terraform state mv ...
terraform plan
terraform apply

Migrazione State tra Root Module

Questa procedura serve quando una parte delle risorse viene spostata da uno stack Terraform a un altro, per esempio da prod a prod/network.

L'obiettivo e spostare la gestione delle risorse tra state diversi senza eliminare o ricreare risorse reali.

Comando Descrizione
terraform state pull > /home/fabio/prod.tfstate Scarica lo state remoto corrente in un file locale.
terraform state list -state=/home/fabio/prod.tfstate Mostra le risorse presenti nello state locale.
terraform state rm -state=/home/fabio/prod.tfstate '<risorsa>' Rimuove una risorsa dal file state locale senza eliminarla su AWS.
terraform -chdir=<nuova-root> init -reconfigure Inizializza la nuova root Terraform con il backend corretto.
terraform -chdir=<nuova-root> state push /home/fabio/prod.tfstate Carica lo state locale nel backend remoto della nuova root.
terraform -chdir=<nuova-root> state list Verifica che il backend remoto nuovo contenga le risorse migrate.
terraform -chdir=<nuova-root> plan Verifica che la configurazione e lo state siano allineati.

Esempio Migrazione Network

Scenario:

State sorgente: accounts/prod        -> aws
State destinazione: accounts/prod/network -> aws-network

Estrarre lo state sorgente:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod state pull > /home/fabio/prod.tfstate

Verificare il file:

ls -lh /home/fabio/prod.tfstate
head -n 5 /home/fabio/prod.tfstate

Elencare le risorse nel file locale:

cd /tmp
terraform state list -state=/home/fabio/prod.tfstate

Rimuovere dal file locale le risorse che non devono entrare nello state network:

terraform state rm \
  -state=/home/fabio/prod.tfstate \
  'aws_key_pair.web_ec2'

Verificare che nello state locale siano rimaste solo risorse network:

terraform state list -state=/home/fabio/prod.tfstate

Risorse attese nello state network:

module.vpc...
module.web_security_group...
module.ssh_security_group...

Risorse da non tenere nello state network:

aws_key_pair...
module.web_ec2...

Inizializzare la root di destinazione:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network init -reconfigure

Caricare lo state locale nel backend remoto della root network:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network state push /home/fabio/prod.tfstate

Verificare lo state remoto appena aggiornato:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network state list

Eseguire il plan di controllo:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network plan

Il risultato atteso e:

No changes.

Rinominare Address nello State

Se durante il refactoring cambia l'address Terraform di una risorsa, usare terraform state mv.

Esempio: una risorsa passa da senza count a con count.

Address precedente:

module.vpc.aws_main_route_table_association.main

Address nuovo:

module.vpc.aws_main_route_table_association.main[0]

Comando:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network state mv \
  'module.vpc.aws_main_route_table_association.main' \
  'module.vpc.aws_main_route_table_association.main[0]'

Poi verificare:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network plan

Pulizia State Sorgente

Dopo aver verificato che il nuovo state e corretto, aggiornare lo state sorgente rimuovendo le risorse migrate.

Creare una copia del backup originale:

cp /home/fabio/prod-before-network-split.tfstate /home/fabio/prod-remaining.tfstate

Rimuovere dallo state remaining le risorse migrate:

terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_vpc.this[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_subnet.intra[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_subnet.public[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route_table.intra[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route_table.public[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route_table_association.intra[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route_table_association.public[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_internet_gateway.this[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route.public_internet_gateway[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.web_security_group.module.security_group.aws_security_group.this[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.ssh_security_group.module.security_group.aws_security_group.this[0]'

Controllare cosa rimane:

terraform state list -state=/home/fabio/prod-remaining.tfstate

Caricare lo state remaining nel backend sorgente:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod state push /home/fabio/prod-remaining.tfstate

Verificare:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod state list
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod plan

Eliminare uno State Remoto GitLab

Prima di eliminare uno state remoto, fare sempre un backup:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod state pull > /home/fabio/prod-old-before-delete.tfstate

Verificare che le risorse siano gia gestite dagli state nuovi:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network plan
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/compute plan

Non usare terraform destroy per eliminare uno state remoto: destroy elimina le risorse reali.

Con backend HTTP GitLab, eliminare lo state remoto dalla UI GitLab:

Project -> Operate / Infrastructure -> Terraform states -> seleziona state -> Delete

Dopo l'eliminazione, verificare che gli state rimasti continuino a essere allineati:

terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network plan
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/compute plan