La lezione da leggere
«Terraform: Domare il Cloud con il Codice» è una lezione interattiva di Tecnologia creata con Morlex AI.
Creata da Morlex AI con Google Gemini dalla domanda di chi studia; controllata dal codice, non rivista da una persona · aggiornata il 3 novembre 2026 · Come nascono le lezioni
Imparerai
- Comprendere il concetto di Infrastructure as Code (IaC) e i suoi vantaggi rispetto alla configurazione manuale.
- Leggere e comprendere la sintassi base di un file di configurazione HCL (HashiCorp Configuration Language).
- Spiegare il ruolo dei Provider nel connettere Terraform ai diversi servizi cloud.
- Descrivere l'importanza del file di stato (state file) e come previene il disallineamento dell'infrastruttura.
- Eseguire mentalmente il ciclo di vita dei comandi principali: init, plan, apply e destroy.
Il problema dei server fatti a mano
Cosa succede se devi ricreare lo stesso identico server in tre minuti, ma l'unica persona che sa come farlo è in ferie?
Fino a pochi anni fa, creare un'infrastruttura cloud era un lavoro di pura pazienza. Entravi nella console web di AWS o Azure, cliccavi su decine di menu, selezionavi la dimensione del server, impostavi i permessi di rete e speravi di non aver dimenticato una spunta cruciale lungo la strada.
Questo approccio manuale, chiamato amichevolmente ClickOps, porta con sé tre problemi enormi:
- Zero replicabilità: Se hai bisogno di un ambiente di test identico a quello di produzione, devi rifare tutto da capo, sperando di ricordare ogni singolo clic.
- La documentazione bugiarda: I documenti di testo che descrivono come configurare i server non vengono mai aggiornati e diventano obsoleti dopo due settimane.
- L'errore invisibile: Basta un solo clic sbagliato in un sottomenu per esporre un database a tutta internet, senza che nessuno se ne accorga.
La soluzione a questo incubo si chiama Infrastructure as Code (IaC), ovvero Infrastruttura come Codice. Invece di cliccare su un'interfaccia grafica, descriviamo l'infrastruttura che desideriamo (ad esempio, il nostro web_server virtuale) all'interno di un semplice file di testo.
Terraform è lo strumento che legge questo file di testo e si occupa di parlare con i provider cloud per renderlo reale. Se il file dice che vogliamo un server, Terraform lo crea. Se lo cancelliamo dal file, Terraform lo distrugge.
Con l'IaC, il file di configurazione non è solo il foglio di istruzioni per creare il server: è la documentazione vivente, precisa e aggiornata al millisecondo di ciò che esiste davvero nel cloud.
- 1: Clic errato (può compromettere la sicurezza)
- 100%: Replicabilità (grazie ai file di testo)
- Infrastructure as Code (IaC): La pratica di gestire e configurare le risorse infrastrutturali (server, reti, database) tramite file di configurazione leggibili dalla macchina, anziché tramite configurazione manuale.
- ClickOps: Termine ironico che indica la gestione manuale dell'infrastruttura cloud cliccando direttamente sulle interfacce web dei pannelli di controllo.
Qual è il vantaggio fondamentale dell'Infrastructure as Code (IaC) rispetto alla configurazione manuale tramite console web?
Rende l'infrastruttura replicabile e documentata in modo sicuro tramite un file di testo. L'IaC trasforma la creazione dell'infrastruttura in un processo ripetibile, preciso e documentato. Non si occupa di configurare l'interno del sistema operativo (ruolo di altri strumenti come Ansible) e non azzera i costi del cloud, ma evita gli errori umani legati ai clic manuali.
La mappa concettuale di Terraform
I tre pilastri che compongono l'ecosistema di Infrastructure as Code
Terraform unisce il mondo del codice testuale con la realtà dei servizi cloud attraverso tre componenti fondamentali che lavorano insieme.
Esplora i collegamenti tra il codice scritto, i comandi del motore e le risorse reali sul cloud.
- Codice HCL: La lingua con cui descriviamo l'infrastruttura desiderata, come il nostro server web_server.
- Risorse: I singoli componenti da creare, ad esempio istanze EC2 o database.
- Parametri: Le proprietà specifiche del componente, come il tipo t2.micro.
- Motore CLI: Gli strumenti a riga di comando che traducono il nostro codice in azioni reali sul cloud.
- Init e Plan: Inizializzano l'ambiente e calcolano l'anteprima delle modifiche.
- Apply e Destroy: Eseguono i cambiamenti o ripuliscono l'intera infrastruttura.
- Realtà Cloud: L'infrastruttura effettiva ospitata dai provider e monitorata dallo stato.
- Provider: I plugin ufficiali che permettono a Terraform di comunicare con AWS o altri servizi.
- File di Stato: La memoria che collega il codice HCL alle risorse reali create su AWS.
A quale componente appartiene il file terraform.tfstate che tiene traccia delle risorse reali?
Alla Realtà Cloud e al sistema di stato. Il file di stato fa parte del pilastro della Realtà Cloud perché mappa esattamente ciò che esiste sul cloud rispetto al codice.
Dichiarare, non istruire
Se dovessi chiedere a un robot di prepararti un caffè, preferiresti elencargli ogni singolo movimento del braccio meccanico o semplicemente mostrargli la foto di una tazzina piena?
La differenza tra programmazione imperativa e dichiarativa sta tutta qui. Nei sistemi tradizionali (imperativi), scrivi uno script che dice: "Fai questo, poi fai quello, se fallisce prova quest'altro". Se un passaggio si interrompe a metà, ti ritrovi con un sistema instabile e difficile da ripristinare.
Terraform usa un approccio dichiarativo. Tu descrivi il risultato finale desiderato — la tazzina di caffè pronta — e lasci che sia il motore di Terraform a capire quali passaggi intermedi compiere.
Per farlo, usiamo l'HCL (HashiCorp Configuration Language), un linguaggio semplice e leggibile. Ecco come dichiariamo il nostro server virtuale:
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
Analizziamo questo blocco:
resource: indica a Terraform che vogliamo creare un pezzo di infrastruttura."aws_instance": è il tipo di risorsa. Dice a Terraform cosa creare (in questo caso, un server virtuale su AWS)."web_server": è il nome logico che usiamo dentro il codice per identificare questa risorsa.amieinstance_type: sono i parametri che definiscono la configurazione reale (il sistema operativo e la dimensione del server).
- Dichiarativo: Un paradigma di programmazione in cui si descrive lo stato finale desiderato del sistema, lasciando al software il compito di calcolare i passaggi per raggiungerlo.
- HCL: HashiCorp Configuration Language, il linguaggio dichiarativo e strutturato a blocchi utilizzato per scrivere le configurazioni di Terraform.
Se modifichi il valore di instance_type da "t2.micro" a "t2.small" nel tuo file di codice e avvii Terraform, cosa succede?
Terraform confronta il nuovo stato desiderato con la realtà e applica solo la variazione necessaria per aggiornare il server. Esatto! Essendo dichiarativo, Terraform non si limita a 'eseguire istruzioni', ma calcola la differenza tra ciò che esiste e ciò che hai dichiarato nel codice, modificando di conseguenza l'infrastruttura reale per farla combaciare con il tuo file.
I traduttori universali: i Provider
Come fa Terraform a parlare con qualsiasi cloud?
Terraform di per sé non sa cosa sia un server AWS, un database Google Cloud o una playlist di Spotify: è solo un motore logico vuoto.
Abbiamo visto come definire la nostra risorsa nel codice HCL. Ma chi traduce quel testo in azioni reali sulle API dei diversi provider cloud?
La risposta sono i Provider. Un provider è un plugin specifico per una determinata piattaforma, scaricato automaticamente da Terraform all'inizio di ogni progetto.
Per esempio, per dire a Terraform che vogliamo lavorare con Amazon Web Services nella regione europea di Irlanda, dichiariamo un blocco come questo:
provider "aws" {
region = "eu-west-1"
}
Grazie a questa separazione tra il motore Terraform e i plugin dei provider, lo stesso linguaggio può gestire contemporaneamente infrastrutture su AWS, Microsoft Azure, Google Cloud Platform o persino servizi SaaS di terze parti.
- 3000+: Provider disponibili (community e ufficiali)
- eu-west-1: Regione di esempio (Irlanda)
- Provider: Un plugin che traduce il codice HCL di Terraform nelle chiamate API specifiche di una determinata piattaforma cloud.
A cosa serve principalmente un blocco provider in Terraform?
A connettere il motore di Terraform alle API di uno specifico servizio cloud. Il provider agisce come un traduttore universale: permette a Terraform di comunicare con le API specifiche del cloud (come AWS o Azure) senza che il motore debba conoscerne i dettagli interni.
La memoria di Terraform: lo Stato
Cosa succede se qualcuno modifica la tua infrastruttura di nascosto, cliccando direttamente sulla console web di AWS?
Quando scrivi nel codice che desideri un server web_server di tipo t2.micro, Terraform deve associarlo a un'entità reale. Nel cloud, quel server riceverà un ID univoco generato da AWS (ad esempio, i-0a12b34c56d78e9f0). Per ricordarsi questa associazione, Terraform crea un file speciale chiamato terraform.tfstate.
Questo file di stato è l'unica fonte di verità: mappa i tuoi blocchi HCL alle risorse reali nel cloud. Se un amministratore modifica manualmente la dimensione del server sulla console di AWS (il temuto drift o disallineamento), Terraform se ne accorge al volo.
Durante ogni esecuzione, Terraform confronta tre elementi:
- Il tuo codice HCL (ciò che vuoi).
- Lo stato reale su AWS (ciò che esiste).
- Il file
terraform.tfstate(ciò che Terraform ricorda di aver fatto).
Se trova discrepanze, propone le modifiche necessarie per riportare la realtà in perfetto allineamento con il tuo codice.
Modificare manualmente il file .tfstate è il modo più rapido per corrompere l'infrastruttura. Lascia che sia sempre e solo Terraform a scriverci dentro.
- terraform.tfstate: File di Stato (Creato automaticamente nella cartella di progetto)
- Drift: Disallineamento (Rilevato al prossimo avvio)
- State File: Il file JSON in cui Terraform registra l'identità e i dettagli delle risorse reali create nel cloud.
- Drift: La discrepanza che si crea quando le risorse reali vengono modificate fuori dal controllo di Terraform (es. via browser).
Se un collega modifica manualmente la dimensione di web_server su AWS portandola a t2.large, cosa farà Terraform alla prossima esecuzione?
Rileverà il drift confrontando la realtà con lo stato e proporrà di riportare il server a t2.micro. Terraform interroga il cloud reale prima di agire. Vedendo che il server reale è diventato t2.large, ma il tuo codice HCL richiede ancora un t2.micro, rileva il drift e pianifica di ridimensionarlo per tornare alla configurazione dichiarata.
Il ciclo di vita: da zero a Cloud
Dal codice sul nostro computer al server attivo su AWS
Ora che abbiamo visto come dichiarare il nostro web_server, come fa Terraform a trasformare questo testo in un vero server cloud? Segue una rigorosa sequenza di quattro comandi fondamentali.
- 1.
terraform init: Preparare il terreno: Prima di tutto, la cartella del nostro progetto deve conoscere il cloud su cui vogliamo lavorare. Quando lanciterraform init, Terraform legge la configurazione, individua i provider necessari (come il plugin per AWS) e li scarica automaticamente nella cartella nascosta.terraform. - 2.
terraform plan: L'anteprima sicura: Non creiamo nulla alla cieca. Il comandoterraform planconfronta il tuo codice HCL con lo stato attuale del cloud e calcola la differenza esatta. Ti mostra un report dettagliato: le risorse che verranno aggiunte (segnate da un vivace ), quelle modificate o quelle rimosse. - 3.
terraform apply: La magia prende vita: Se il piano ti convince, dai il via libera conterraform apply. Terraform prende gli ordini, contatta le API di AWS e crea fisicamente la nostra istanza EC2t2.micronella regioneeu-west-1. Una volta terminato, aggiorna la memoria del sistema. - 4.
terraform destroy: Pulizia totale: Hai finito i test o non ti serve più l'infrastruttura? Invece di cancellare i server uno a uno dalla console web di AWS, lanciterraform destroy. Terraform leggerà il codice e smantellerà ogni risorsa creata, lasciando il cloud pulito e azzerando i costi.
Quale comando del ciclo di vita di Terraform dovresti lanciare per primo in una nuova cartella di progetto appena creata?
è il primo comando obbligatorio perché scarica i plugin dei provider necessari (come AWS) per permettere a Terraform di comunicare con il cloud.
Cosa succede se cambio il codice?
La differenza cruciale tra aggiornamenti indolori e ricostruzioni distruttive.
Iniziare da zero è facile. Ma cosa succede quando l'infrastruttura esiste già e decidi di cambiare le regole del gioco?
Quando modifichi il file di configurazione del nostro web_server, Terraform non cancella tutto per partito preso. Confronta il nuovo codice con lo stato reale salvato nel file terraform.tfstate e decide la strategia ottimale.
Esistono due strade che Terraform può intraprendere:
- Aggiornamento sul posto (In-Place Update): Se cambi un parametro non strutturale, come i
tags(i tag identificativi) o alcune regole di sicurezza soft, Terraform modifica solo quel dettaglio. Il server rimane acceso e attivo. Nel terminale, questo è rappresentato dal simbolo~(giallo). - Distruzione e Ricreazione (Destroy and Recreate): Se modifichi una proprietà fondamentale che il cloud provider non permette di cambiare "a caldo" — come la
availability_zone(la zona fisica del data center) o l'immagine del sistema operativo (ami) — Terraform è costretto a distruggere la risorsa esistente e crearne una nuova. Nel terminale vedrai il simbolo-/+(rosso e verde).
Questo comportamento previene configurazioni instabili, ma significa che un innocuo cambio di riga nel codice può causare un'interruzione del servizio (downtime) o la perdita di dati non salvati.
- ~: In-Place Update (Modifica senza interruzioni)
- -/+: Replace (Distruzione e ricreazione)
Hai modificato il tipo di istanza del tuo web_server da t2.micro a t2.small. AWS permette di ridimensionare un server esistente senza doverlo ricreare da zero. Cosa ti mostrerà il comando terraform plan?
Un aggiornamento in-place (~), perché la risorsa può essere modificata direttamente. Esatto! Se il provider (AWS) supporta la modifica della proprietà senza distruzione, Terraform si adegua ed effettua un aggiornamento in-place (~). L'istanza verrà semplicemente fermata, ridimensionata e riavviata, mantenendo intatti i suoi dischi.
Il bivio delle modifiche
Mettiti alla prova: ogni modifica al codice ha un impatto diverso sulla realtà.
Immagina di essere l'amministratore di sistema responsabile del nostro server web_server su AWS. Hai aperto il file di configurazione HCL e devi applicare una modifica. Scegli la mossa giusta per ogni scenario e scopri se Terraform aggiornerà il server in modo sicuro o se scatenerà una distruzione.
I vocaboli di Terraform
Metti alla prova la tua memoria sui termini chiave che abbiamo incontrato. Rigira ogni carta per verificare la definizione esatta.
- Cos'è l'Infrastructure as Code (IaC)?: L'approccio di definire e gestire l'infrastruttura IT tramite file di configurazione leggibili, invece di agire manualmente su interfacce web.
- Cosa significa HCL?: HashiCorp Configuration Language, il linguaggio dichiarativo utilizzato da Terraform per scrivere i file di configurazione.
- A cosa serve un Provider in Terraform?: È un plugin che fa da traduttore universale permettendo a Terraform di comunicare con le API di specifici servizi cloud (es. AWS, Azure, Google Cloud).
- Cos'è il file terraform.tfstate?: Il file di stato in formato JSON che mappa la configurazione HCL del nostro
web_servercon le risorse reali effettivamente create nel cloud. - Cosa fa il comando terraform init?: Inizializza la cartella di lavoro scaricando i plugin dei provider necessari e preparando l'ambiente per i comandi successivi.
- A cosa serve terraform plan?: Analizza il codice e lo stato attuale per mostrare un'anteprima dettagliata delle modifiche che verranno applicate (es. '+ 1 to create').
- Cosa fa il comando terraform apply?: Esegue concretamente le azioni pianificate per creare o modificare l'infrastruttura sul cloud, come il nostro server
web_server. - A cosa serve terraform destroy?: Elimina tutte le risorse gestite da Terraform definite nella configurazione, pulendo completamente l'ambiente cloud.
Vero o Falso su Terraform
Metti alla prova la tua comprensione smascherando i falsi miti più comuni su Terraform.
Affronta questa serie di affermazioni per verificare se hai interiorizzato i concetti chiave visti finora. Valuta ogni affermazione come vera o falsa.
Il comando terraform plan serve esclusivamente a scaricare i provider necessari all'interno della cartella di lavoro.
Falso. Falso. Scaricare i provider è il compito di terraform init. Il comando terraform plan serve invece a calcolare e mostrare in anteprima le differenze tra il codice e lo stato reale.
Se elimini accidentalmente il file terraform.tfstate, Terraform può ricrearlo scansionando automaticamente tutte le risorse esistenti nel cloud.
Falso. Falso! Il file di stato è l'unico collegamento tra il codice HCL e la realtà del cloud. Perderlo significa perdere il riferimento alle risorse esistenti, costringendo a dolorose re-importazioni manuali.
Terraform nasce principalmente per orchestrare e creare l'infrastruttura cloud, mentre per configurare i software all'interno del sistema operativo si usano solitamente altri strumenti come Ansible.
Vero. Vero. Terraform eccelle nel provisioning dell'infrastruttura (server, reti, database), mentre la configurazione interna del software è spesso delegata a strumenti di configuration management dedicati.
Terraform è uno strumento proprietario che funziona esclusivamente con i servizi del cloud AWS.
Falso. Falso! Grazie ai provider, Terraform è agnostico e può gestire risorse su decine di cloud provider diversi (come Azure, Google Cloud Platform) e persino servizi esterni come GitHub o Cloudflare.
Il comando terraform destroy elimina definitivamente tutte le risorse gestite descritte in quel momento nel codice di configurazione.
Vero. Vero. Questo comando analizza lo stato e smantella metodicamente ogni risorsa associata, liberando il cloud (e azzerando i costi).
Se un collega modifica a mano il nostro web_server direttamente dalla console web di AWS, Terraform ignorerà completamente la modifica.
Falso. Falso! Terraform rileverà il disallineamento (chiamato drift) durante l'esecuzione di terraform plan, segnalando che la realtà non corrisponde più allo stato registrato.
Con Terraform descriviamo lo stato finale desiderato dell'infrastruttura, lasciando al motore il compito di capire come raggiungerlo.
Vero. Esatto. L'approccio dichiarativo di Terraform si concentra sul 'cosa' vogliamo ottenere, a differenza dell'approccio imperativo in cui bisogna specificare ogni singolo passaggio.
Il linguaggio HCL (HashiCorp Configuration Language) utilizzato da Terraform è un linguaggio di programmazione procedurale completo di cicli e funzioni condizionali avanzate.
Falso. Falso. HCL è un linguaggio dichiarativo di configurazione, pensato per essere leggibile e strutturato a blocchi, non un linguaggio procedurale tradizionale.
Ordina il flusso di lavoro
Metti in ordine cronologico i comandi da digitare nel terminale per gestire il ciclo di vita del nostro server web su AWS, partendo da un progetto appena scaricato fino alla sua pulizia finale.
- terraform init.
- terraform plan.
- terraform apply.
- terraform destroy.
La sfida: Il piano di rilascio sicuro
Ti trovi a gestire l'infrastruttura di produzione dell'azienda. Devi rinominare la risorsa del database relazionale nel codice HCL per seguire una nuova convenzione di naming aziendale. Nel codice esistente avevi:
resource "aws_db_instance" "db"
Che hai modificato in:
resource "aws_db_instance" "database_produzione"
Lanci il comando terraform plan e l'output ti mostra una situazione critica:
Terraform will perform the following actions:
# aws_db_instance.database_produzione must be created
+ resource "aws_db_instance" "database_produzione" {
# ... parametri del db ...
}
# aws_db_instance.db must be destroyed
# (because aws_db_instance.db is not present in the new configuration)
Plan: 1 to add, 0 to change, 1 to destroy.
Se procedi con terraform apply, Terraform distruggerà il database esistente db (e con esso tutti i dati di produzione!) per crearne uno nuovo da zero chiamato database_produzione. Devi risolvere questo problema senza perdere i dati.
Perché Terraform vuole distruggere e ricreare il database invece di rinominarlo semplicemente?
Perché il nome della risorsa nel blocco HCL definisce l'indirizzo logico nello stato; cambiarlo fa credere a Terraform che la vecchia risorsa sia stata eliminata e una nuova sia stata aggiunta. Terraform associa ogni risorsa HCL a un ID univoco nel file terraform.tfstate. Cambiare l'etichetta logica (da db a database_produzione) interrompe questo legame: per Terraform la vecchia risorsa non esiste più e va rimpiazzata.
Qual è il comando ufficiale di Terraform che permette di 'spostare' o rinominare una risorsa nello stato senza toccare il cloud, evitando così la distruzione?
terraform state mv. Il comando terraform state mv aws_db_instance.db aws_db_instance.database_produzione aggiorna il file di stato mappando la vecchia risorsa sul nuovo nome logico, salvando il database dalla cancellazione.
Prima di eseguire qualsiasi operazione correttiva complessa su un database di produzione, quale buona pratica è fondamentale attivare sulla risorsa cloud per prevenire la cancellazione accidentale?
Abilitare il blocco di terminazione o la protezione da eliminazione (deletion_protection = true). La protezione da eliminazione impedisce a chiunque (incluso Terraform) di cancellare accidentalmente il database finché il flag non viene disattivato esplicitamente.
Dopo aver eseguito il comando per aggiornare lo stato, lanci nuovamente terraform plan. Quale dovrebbe essere il risultato ideale prima di dare il via libera?
Plan: 0 to add, 0 to change, 0 to destroy. Un piano pulito con zero modifiche da fare (0 to add, 0 to change, 0 to destroy) conferma che la modifica del nome è stata recepita senza alterare la realtà del cloud.