Il capostipite del multi-cloud IaC
Terraform — lanciato da HashiCorp nel 2014 — è uno strumento di Infrastructure as Code con una caratteristica distintiva rispetto a Puppet, Chef, Ansible: non gestisce configurazione di OS, ma provisioning di risorse cloud (VM, rete, storage, bucket, DB managed, record DNS, chiavi, policy IAM). Opera come “orchestratore” di API cloud.
Il modello di Terraform è dichiarativo con state: l’utente descrive lo stato desiderato delle risorse; Terraform confronta con uno state file (locale o remoto) che tiene memoria dello stato attuale; calcola un plan con le azioni necessarie (create, update, destroy) e le applica via API.
HCL e la 0.11
Nelle versioni 0.6 - 0.11, Terraform usa HCL 1 (HashiCorp Configuration Language v1) come DSL. HCL1 è pragmatico ma limitato: mancano tipi ricchi (solo string, map flat), loop limitati (count ma non for_each), concatenazione stringhe con syntax clumsy, error message poco espliciti.
Ad scale, con decine o centinaia di risorse tra ambienti (dev/staging/prod) e cloud (AWS/Azure/GCP), le limitazioni di HCL1 diventano significative. I team adottano pattern come Terragrunt (per DRY) o generatori custom per compensare.
Terraform 0.12
Terraform 0.12 è stato rilasciato il 22 maggio 2019 dopo quasi un anno di beta. È la release che trasforma HCL in un linguaggio configurazione pienamente tipizzato.
Novità principali:
HCL2
Nuovo parser/language, con semantica pulita. Le espressioni non sono più stringhe interpolate ("${var.foo}") ma first-class: var.foo, aws_instance.web.id, local.env == "prod" ? "large" : "small".
Tipi ricchi
Variables, outputs e resources accettano type constraints espliciti:
variable "subnets" {
type = list(object({
cidr = string
az = string
public = bool
}))
default = []
}
for_each
Finalmente un iteratore decente per creare risorse. Il vecchio count era problematico per resource stateful perché usava indici posizionali; for_each usa chiavi logiche, molto più robusto su modifiche:
resource "aws_s3_bucket" "bucket" {
for_each = toset(["logs", "images", "docs"])
bucket = "myapp-${each.key}"
}
dynamic blocks
Generazione dinamica di blocchi annidati (es. security group rules):
resource "aws_security_group" "web" {
name = "web"
dynamic "ingress" {
for_each = var.allowed_ports
content {
from_port = ingress.value
to_port = ingress.value
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
}
Error messages
Riscritti per essere esplicativi: puntano al file e riga dell’errore, suggeriscono correzioni, mostrano il contesto.
Backward compatibility
La 0.12 richiede un’upgrade esplicita delle configurazioni 0.11 tramite terraform 0.12upgrade (tool automatico che riscrive la sintassi). Per molti team questa è stata una fase di migrazione pianificata con attenzione.
Provider
Al maggio 2019 l’ecosistema provider Terraform è ricco:
- AWS Provider — più di 500 tipi di risorse
- Azure Provider — ampio, mantenuto da HashiCorp con Microsoft
- Google Cloud Provider — simile
- Kubernetes Provider — provisioning di risorse K8s via Terraform
- DigitalOcean, Vultr, Hetzner, Linode — cloud secondari
- Cloudflare, Fastly — CDN/DNS
- VMware, OpenStack — on-premise
- GitHub, GitLab — gestione repo/organizzazione
I provider sono distribuiti via Terraform Registry (lanciato 2017), integrato con l’iniziale di Terraform.
State remoto
Il state file di Terraform contiene informazioni sensibili (IDs di risorse, a volte secrets) e deve essere condiviso tra team members. Al 2019 le opzioni di remote state includono:
- Terraform Cloud (HashiCorp, SaaS) — gratuito fino a 5 utenti
- S3 + DynamoDB (AWS) — pattern popolare per locking
- GCS + Cloud Storage locking
- Azure Storage
- Consul (HashiCorp) — per deployment on-premise
Competitors
Terraform al 2019 è lo standard de facto del multi-cloud IaC, ma non è senza concorrenti:
- AWS CloudFormation — nativo AWS, JSON/YAML, limitato a AWS
- Pulumi (startup 2017) — IaC in linguaggi general-purpose (TypeScript, Python, Go, C#)
- Crossplane (Upbound, 2018) — IaC Kubernetes-native
- Google Cloud Deployment Manager — YAML, limitato a GCP
Terraform mantiene la leadership grazie al multi-cloud reale e al vasto ecosistema di provider.
OpenTofu (evoluzione futura)
Al 2019 Terraform è saldamente MPL 2.0. Nel agosto 2023 HashiCorp cambierà licenza a Business Source License (BSL), escludendo de facto alcuni utilizzi commerciali. La community risponde con il fork OpenTofu (Linux Foundation, 2023-2024) che mantiene MPL 2.0. Questo scenario è nel futuro rispetto al 2019 ma è rilevante per la traiettoria complessiva.
Nel contesto italiano
Al 2019 Terraform è ampiamente adottato nei team DevOps italiani:
- Banche e assicurazioni — IaC per AWS/Azure in fase di migrazione cloud
- Software house italiane — IaC per ambienti cliente
- PA e sanità — inizio progetti cloud con IaC
- Startup — standard di fatto
La 0.12 richiede un lavoro di migrazione ma offre valore chiaro; l’adozione procede rapidamente.
Riferimenti: Terraform 0.12 (22 maggio 2019), HashiCorp. HCL2 — HashiCorp Configuration Language v2. Licenza MPL 2.0 (al 2019; cambio a BSL nel 2023). Terraform Registry (2017). Provider AWS, Azure, GCP, Kubernetes.
