Terraform 0.12: HCL2 e Infrastructure as Code multi-cloud matura

Terraform 0.12 (22 maggio 2019) di HashiCorp: introduce HCL2 con tipi ricchi, prime-class expressions, for_each e dynamic blocks. La release che consolida Terraform come standard de facto dell'IaC multi-cloud.

Open SourceWeb TerraformHashiCorpIaCHCLCloudMulti-CloudOpen Source

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.

Vuoi supporto? Sei sotto attacco? Stato dei servizi
Vuoi supporto? Sei sotto attacco? Stato dei servizi