Cos’è Terraform
Terraform è uno strumento open-source di Infrastructure as Code (IaC) sviluppato da HashiCorp che permette di definire, creare e gestire risorse IT attraverso file di configurazione dichiarativi. Contrariamente a quanto si possa pensare, Terraform non è limitato solo all’infrastruttura cloud, ma può gestire qualsiasi risorsa che abbia un’API REST.
Esempi di risorse gestibili con Terraform:
-
Infrastruttura cloud: server virtuali, database, reti su AWS, Azure, Google Cloud
-
Piattaforme DevOps: repository e permessi su GitLab, utenti e gruppi su GitHub
-
Gestione artefatti: repository e permessi su Artifactory, Nexus
-
Database: utenti e schemi su PostgreSQL, MySQL
-
DNS: record su Cloudflare, Route53
-
Monitoring: dashboard su Grafana, alert su Datadog
-
Security: policy su Vault, certificati su Let’s Encrypt
Invece di configurare manualmente queste risorse tramite interfacce web o comandi, Terraform consente di descrivere lo stato desiderato in codice e di automatizzarne la creazione e gestione.
Perché utilizzare Terraform: vantaggi e casi d’uso
I principali vantaggi di Terraform
Automazione dell’infrastruttura: Elimina la necessità di configurare manualmente risorse tramite interfacce grafiche, riducendo errori umani e tempi di deployment.
Riproducibilità degli ambienti: La stessa configurazione Terraform può essere utilizzata per creare ambienti identici in sviluppo, test e produzione.
Controllo versione dell’infrastruttura: Le configurazioni possono essere versionate con Git, permettendo di tracciare modifiche, collaborare in team e fare rollback.
Supporto multi-cloud e multi-provider: Terraform supporta oltre 1000 provider diversi, da AWS e Azure a Kubernetes e servizi SaaS.
Gestione intelligente dello stato: Terraform mantiene uno stato dell’infrastruttura, permettendo di rilevare modifiche esterne e pianificare aggiornamenti.
Quando e come utilizzare Terraform: casi d’uso pratici
-
Provisioning automatico di ambienti di sviluppo e test identici alla produzione
-
Deployment automatizzato di applicazioni multi-tier e microservizi
-
Gestione centralizzata di reti, firewall e politiche di sicurezza
-
Creazione e configurazione di cluster Kubernetes e container orchestration
-
Implementazione di strategie di backup e disaster recovery
-
Migrazione controllata tra diversi cloud provider
Come funziona Terraform: concetti fondamentali
File di configurazione Terraform (Configuration Files)
I file di configurazione Terraform utilizzano il linguaggio HCL (HashiCorp Configuration Language) e hanno estensione .tf
. Questi file definiscono in modo dichiarativo le risorse che si desidera creare e configurare.
Provider Terraform: connessioni ai servizi
I provider sono plugin che permettono a Terraform di comunicare con le API di servizi cloud e altri servizi. Ogni provider gestisce un set specifico di risorse. Esempi popolari: aws
, azurerm
, google
, kubernetes
, github
, gitlab
.
Resources: componenti dell’infrastruttura
Le resources rappresentano i componenti concreti dell’infrastruttura come server virtuali, database, reti, utenti, repository e molto altro.
Terraform State: gestione dello stato dell’infrastruttura
Terraform mantiene un file di stato (.tfstate
) che mappa le risorse definite nel codice con quelle reali nell’ambiente target. Lo state è fondamentale per il funzionamento di Terraform in quanto:
-
Traccia le risorse: mantiene la corrispondenza tra configurazione e risorse reali
-
Rileva modifiche: confronta lo stato attuale con quello desiderato
-
Gestisce dipendenze: comprende l’ordine di creazione/distruzione delle risorse
-
Memorizza metadati: salva informazioni non visibili nelle API (come ID interni)
Tipi di state:
-
Locale: file
.tfstate
salvato nella directory del progetto (default, adatto solo per sviluppo individuale) -
Remoto: salvato su servizi esterni come AWS S3, Azure Storage, Google Cloud Storage, Terraform Cloud, ecc. Consigliato per team e produzione per permettere collaborazione e backup automatici.
Workflow Terraform: Plan e Apply
-
terraform plan
: analizza la configurazione e mostra le modifiche che verranno applicate senza eseguirle -
terraform apply
: applica effettivamente le modifiche pianificate all’infrastruttura
Come installare Terraform: setup iniziale
Per l’installazione di Terraform, segui la guida ufficiale disponibile su terraform.io/downloads che fornisce istruzioni dettagliate per tutti i sistemi operativi.
Verifica installazione
terraform version
Tutorial Terraform: esempi pratici passo-passo
Esempio pratico 1: Creare un server EC2 su AWS con Terraform
Prima di iniziare, configura le credenziali AWS:
aws configure
Crea un file main.tf
:
# Configurazione del provider AWS
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# Configurazione della regione
provider "aws" {
region = "eu-west-1"
}
# Creazione di un'istanza EC2
resource "aws_instance" "web_server" {
ami = "ami-0c02fb55956c7d316" # Ubuntu 20.04 LTS
instance_type = "t3a.micro"
tags = {
Name = "MioWebServer"
Environment = "Development"
CreatedBy = "Terraform"
}
}
# Output dell'IP pubblico
output "public_ip" {
value = aws_instance.web_server.public_ip
}
Comandi per applicare la configurazione:
# Inizializza il progetto (scarica i provider)
terraform init
# Mostra le modifiche che verranno applicate
terraform plan
# Applica le modifiche
terraform apply
Esempio pratico 2: Come utilizzare le variabili in Terraform
Crea un file variables.tf
:
variable "region" {
description = "AWS region"
type = string
default = "eu-west-1"
}
variable "instance_type" {
description = "EC2 instance type"
type = string
default = "t2.micro"
}
variable "project_name" {
description = "Name of the project"
type = string
}
Crea un file terraform.tfvars
:
project_name = "mio-progetto-web"
instance_type = "t3a.small"
Modifica main.tf
per usare le variabili:
provider "aws" {
region = var.region
}
resource "aws_instance" "web" {
ami = "ami-0c02fb55956c7d316"
instance_type = var.instance_type
tags = {
Name = "${var.project_name}-server"
Project = var.project_name
}
}
Organizzare il codice Terraform: struttura e best practices
Come Terraform legge i file di configurazione
Regola importante: Terraform legge tutti i file .tf
presenti nella directory corrente, ma non nelle sottodirectory. Le sottodirectory vengono elaborate solo quando vengono referenziate esplicitamente come moduli.
Esempio di struttura:
progetto-terraform/
├── main.tf # Terraform legge questo file
├── variables.tf # Terraform legge questo file
├── outputs.tf # Terraform legge questo file
├── terraform.tfvars # Terraform legge questo file
├── versions.tf # Terraform legge questo file
├── subdir/
│ └── ignored.tf # Terraform NON legge questo file
└── modules/ # Directory per moduli
└── web-server/ # Questo diventa un modulo solo se referenziato
├── main.tf
├── variables.tf
└── outputs.tf
Moduli Terraform: cosa sono e perché utilizzarli
I moduli Terraform sono contenitori per raggruppare risorse correlate e renderle riutilizzabili. Ogni modulo è una collezione di file .tf
che può essere:
-
Locale: directory separata nel progetto corrente
-
Remoto: hostato su piattaforme supportate come GitHub, GitLab, Bitbucket, Terraform Registry, AWS S3, ecc.
I moduli remoti permettono di condividere codice tra team e progetti diversi, creando librerie di componenti infrastrutturali riutilizzabili.
I vantaggi dei moduli Terraform
Riutilizzabilità del codice: Scrivi una volta, utilizza ovunque. Un modulo per creare un web server può essere usato in sviluppo, test e produzione.
Organizzazione modulare: Separano logicamente componenti diversi dell’infrastruttura (rete, database, applicazione).
Facilità di manutenzione: Modifiche al modulo si propagano automaticamente a tutti i suoi utilizzi.
Standardizzazione aziendale: Garantiscono configurazioni coerenti tra team e progetti diversi.
Astrazione della complessità: Nascondono dettagli implementativi e espongono solo i parametri necessari.
Testing isolato: Possono essere testati indipendentemente dal resto dell’infrastruttura.
Struttura ottimale per progetti Terraform
progetto-terraform/
├── main.tf # Risorse principali e chiamate ai moduli
├── variables.tf # Definizione variabili
├── outputs.tf # Output values
├── terraform.tfvars # Valori delle variabili
├── versions.tf # Versioni provider
└── modules/ # Moduli riutilizzabili
├── web-server/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── database/
├── main.tf
├── variables.tf
└── outputs.tf
Come creare e utilizzare moduli Terraform
Crea una cartella modules/web-server/
con i file:
modules/web-server/main.tf:
resource "aws_instance" "this" {
ami = var.ami_id
instance_type = var.instance_type
tags = {
Name = var.server_name
}
}
modules/web-server/variables.tf:
variable "ami_id" {
type = string
}
variable "instance_type" {
type = string
}
variable "server_name" {
type = string
}
Uso del modulo nel main.tf:
# Modulo locale
module "web_server_local" {
source = "./modules/web-server"
ami_id = "ami-0c02fb55956c7d316"
instance_type = "t2.micro"
server_name = "my-web-server"
}
# Modulo remoto da GitHub
module "web_server_github" {
source = "github.com/myorg/terraform-modules//web-server?ref=v1.0.0"
ami_id = "ami-0c02fb55956c7d316"
instance_type = "t2.micro"
server_name = "my-web-server"
}
# Modulo dal Terraform Registry
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "3.0.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
}
Comandi Terraform essenziali: guida di riferimento
# Inizializzazione
terraform init
# Validazione configurazione
terraform validate
# Formattazione codice
terraform fmt
# Pianificazione modifiche
terraform plan
# Applicazione modifiche
terraform apply
# Visualizzazione stato corrente
terraform show
# Lista risorse
terraform state list
# Distruzione infrastruttura
terraform destroy
# Import risorsa esistente
terraform import aws_instance.example i-1234567890abcdef0
Best practices Terraform: consigli per l’uso in produzione
Sicurezza e gestione credenziali
-
Non committare mai file
.tfstate
o credenziali nei repository -
Usa variabili d’ambiente per credenziali sensibili
-
Implementa backend remoto per lo stato (S3 + DynamoDB)
-
Applica il principio del least privilege
Organizzazione del codice e team collaboration
-
Usa moduli per componenti riutilizzabili
-
Separa ambienti (dev, staging, prod) in directory diverse
-
Usa naming convention consistenti
-
Documenta le configurazioni
Gestione dello stato Terraform in team
# Backend remoto S3
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket"
key = "infrastructure/terraform.tfstate"
region = "eu-west-1"
}
}
Approfondire Terraform: risorse e strumenti avanzati
Una volta padroneggiata la base di Terraform, esplora questi strumenti e concetti avanzati:
-
Terraform Cloud/Enterprise: Piattaforma SaaS gestita per team e organizzazioni
-
Terraform Registry: Repository pubblico di moduli e provider verificati
-
Workspace Terraform: Gestione di ambienti multipli e isolamento dello stato
-
Data sources: Interrogazione e utilizzo di risorse esistenti
-
Provisioners: Esecuzione di script e configurazioni post-creazione
-
Testing dell’infrastruttura: Strumenti come Terratest per test automatizzati
-
CI/CD Integration: Integrazione con pipeline di deployment automatizzato
Terraform rappresenta una rivoluzione nella gestione dell’infrastruttura moderna. Inizia con configurazioni semplici e gradualmente costruisci soluzioni più complesse man mano che acquisisci esperienza con questo potente strumento di Infrastructure as Code.