Terraform: Guida Completa per Principianti

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.