Guida pratica a Terraform: padroneggiare l'Infrastructure as Code, aumentare l'efficienza e ridurre i costi

2/19/2026
9 min read
# Guida pratica a Terraform: padroneggiare l'Infrastructure as Code, aumentare l'efficienza e ridurre i costi Terraform è un popolare strumento di Infrastructure as Code (IaC) che consente di gestire e automatizzare l'infrastruttura cloud utilizzando file di configurazione dichiarativi. Trattando l'infrastruttura come codice, Terraform può aiutarti a migliorare l'efficienza, ridurre gli errori e controllare meglio il tuo ambiente cloud. Questo articolo, in combinazione con le discussioni su X/Twitter, ti fornirà una guida pratica a Terraform, che copre le migliori pratiche, i suggerimenti e gli strumenti consigliati, per aiutarti a utilizzare Terraform in modo più efficace nella pratica. ## Valore e vantaggi di Terraform * **Infrastructure as Code (IaC):** definire la configurazione dell'infrastruttura come codice, realizzando il controllo della versione, l'implementazione automatizzata e la riproducibilità. * **Supporto multipiattaforma:** supporta vari provider di cloud (AWS, Azure, GCP, ecc.) e ambienti locali. * **Configurazione dichiarativa:** descrive lo stato desiderato e Terraform eseguirà automaticamente i passaggi necessari per raggiungere tale stato. * **Gestione dello stato:** Terraform tiene traccia dello stato della tua infrastruttura ed esegue le modifiche necessarie per mantenere la coerenza della configurazione. * **Modularità:** divide l'infrastruttura in moduli riutilizzabili, semplificando la configurazione e la manutenzione. ## FinOps e Terraform: ridurre i costi del cloud Il tweet di @@AskYoshik ha sottolineato l'importanza degli ingegneri FinOps e il fatto che il loro stipendio è più alto di quello degli ingegneri DevOps, perché l'ottimizzazione dei costi è diventata una priorità assoluta. Ecco alcuni punti chiave su come Terraform può svolgere un ruolo in FinOps: * **Rightsizing (Ridimensionamento appropriato delle risorse):** utilizza Terraform per automatizzare il ridimensionamento delle istanze AWS EC2, dei cluster Kubernetes e di altre risorse cloud, garantendo la massima utilizzazione delle risorse ed evitando sprechi. Ad esempio, puoi scrivere una configurazione Terraform per scalare automaticamente il numero di istanze EC2 o il numero di repliche di Pod Kubernetes in base all'utilizzo della CPU. * **Arresto automatico delle risorse:** per ambienti non di produzione, come ambienti di sviluppo e test, è possibile spegnere automaticamente le risorse al di fuori dell'orario di lavoro per risparmiare sui costi. Terraform può ottenere questo tramite CloudWatch Event e Lambda Function. * **Utilizzo di risorse economicamente vantaggiose:** Terraform può aiutarti a scegliere i tipi di risorse più economici. Ad esempio, puoi scegliere Spot Instances per ridurre il costo delle istanze EC2 oppure scegliere livelli di storage a basso costo. * **Gestione dei tag:** utilizza Terraform per aggiungere tag a tutte le risorse per una migliore analisi e tracciamento dei costi. **Suggerimento pratico: utilizzo di Terraform per il Rightsizing** Ecco un esempio di come utilizzare Terraform per scalare automaticamente il numero di istanze EC2: ```terraform resource "aws_autoscaling_group" "example" { name = "example-asg" max_size = 5 min_size = 1 desired_capacity = 1 health_check_type = "EC2" force_delete = true launch_template { id = aws_launch_template.example.id version = "$Latest" } tag { key = "Name" value = "example-asg" propagate_at_launch = true } ```

Esempio di Auto Scaling con CloudWatch Alarms

Questo esempio mostra come configurare un gruppo Auto Scaling con CloudWatch Alarms per scalare automaticamente le istanze EC2 in base all'utilizzo della CPU.

Risorse

  • aws_launch_configuration: Configurazione di lancio per le istanze EC2.
  • aws_autoscaling_group: Gruppo Auto Scaling che gestisce le istanze EC2.
  • aws_cloudwatch_metric_alarm: Allarmi CloudWatch che monitorano l'utilizzo della CPU e attivano le policy di scaling.
  • aws_autoscaling_policy: Policy di scaling che definiscono come scalare il gruppo Auto Scaling.

Configurazione

La configurazione è suddivisa in diverse risorse Terraform:

aws_launch_configuration

Questa risorsa definisce la configurazione di lancio per le istanze EC2. Include l'AMI, il tipo di istanza e la key pair.

resource "aws_launch_configuration" "example" {
  name          = "example"
  image_id      = "ami-0c55b24aca56cf24b" # Sostituisci con la tua AMI
  instance_type = "t2.micro"
  key_name      = "your-key-pair" # Sostituisci con la tua key pair

  lifecycle {
    create_before_destroy = true
  }
}

create_before_destroy = true assicura che una nuova configurazione di lancio venga creata prima che quella vecchia venga distrutta, evitando interruzioni.

aws_autoscaling_group

Questa risorsa definisce il gruppo Auto Scaling. Specifica la dimensione minima, massima e desiderata del gruppo, nonché la configurazione di lancio da utilizzare.

resource "aws_autoscaling_group" "example" {
  name                      = "example"
  launch_configuration    = aws_launch_configuration.example.name
  min_size                = 1
  max_size                = 3
  desired_capacity        = 1
  health_check_type       = "EC2"
  health_check_grace_period = 300
  vpc_zone_identifier     = ["subnet-0bb1c79de3EXAMPLE", "subnet-049bb4EXAMPLE"]

  tag {
    key                 = "Name"
    value               = "example-instance"
    propagate_at_launch = true
  }

  lifecycle {
    create_before_destroy = true
  }
}

vpc_zone_identifier specifica le subnet in cui le istanze EC2 verranno lanciate. Assicurati di sostituire questi valori con le tue subnet.

aws_cloudwatch_metric_alarm

Queste risorse definiscono gli allarmi CloudWatch che monitorano l'utilizzo della CPU. Un allarme viene attivato quando l'utilizzo della CPU supera il 70% (cpu_high) o scende al di sotto del 30% (cpu_low).

resource "aws_cloudwatch_metric_alarm" "cpu_high" {
  alarm_name          = "example-cpu-high"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 2
  metric_name         = "CPUUtilization"
  namespace           = "AWS/EC2"
  period              = 60
  statistic           = "Average"
  threshold           = 70
  alarm_description   = "Alarm when server CPU exceeds 70%" // Allarme quando la CPU del server supera il 70%
  dimensions = {
    AutoScalingGroupName = aws_autoscaling_group.example.name
  }

  alarm_actions = [aws_autoscaling_policy.scale_up.arn]
}

resource "aws_cloudwatch_metric_alarm" "cpu_low" {
  alarm_name          = "example-cpu-low"
  comparison_operator = "LessThanThreshold"
  evaluation_periods  = 2
  metric_name         = "CPUUtilization"
  namespace           = "AWS/EC2"
  period              = 60
  statistic           = "Average"
  threshold           = 30
  alarm_description   = "Alarm when server CPU is below 30%" // Allarme quando la CPU del server è inferiore al 30%
  dimensions = {
    AutoScalingGroupName = aws_autoscaling_group.example.name
  }

  alarm_actions = [aws_autoscaling_policy.scale_down.arn]
}

alarm_actions specifica le policy di scaling da attivare quando l'allarme viene attivato.

aws_autoscaling_policy

Queste risorse definiscono le policy di scaling. scale_up aumenta la capacità del gruppo Auto Scaling di 1 istanza, mentre scale_down diminuisce la capacità di 1 istanza.

resource "aws_autoscaling_policy" "scale_up" {
  name                   = "example-scale-up"
  scaling_adjustment     = 1
  adjustment_type        = "ChangeInCapacity"
  cooldown               = 300
  autoscaling_group_name = aws_autoscaling_group.example.name
}

resource "aws_autoscaling_policy" "scale_down" {
  name                   = "example-scale-down"
  scaling_adjustment     = -1
  adjustment_type        = "ChangeInCapacity"
  cooldown               = 300
  autoscaling_group_name = aws_autoscaling_group.example.name
}

cooldown specifica il periodo di tempo, in secondi, dopo che una policy di scaling è stata eseguita prima che possa essere eseguita di nuovo.

Questo esempio utilizza `aws_autoscaling_group` per creare un gruppo Auto Scaling e `aws_cloudwatch_metric_alarm` per monitorare l'utilizzo della CPU. Quando l'utilizzo della CPU supera il 70%, la policy `scale_up` aggiunge un'istanza EC2, e quando l'utilizzo della CPU scende sotto il 30%, la policy `scale_down` rimuove un'istanza EC2. ## Best Practices di Terraform Il tweet di @@devops_nk menzionava la struttura delle directory di Terraform e come i team reali gestiscono l'infrastruttura cloud. Ecco alcune best practices: * **Struttura delle directory:** Adotta una struttura di directory chiara, isolando le configurazioni per diversi ambienti (dev, staging, prod) per prevenire impatti accidentali sull'ambiente di produzione. ``` environments/ ├── dev/ │ ├── main.tf │ ├── variables.tf │ ├── outputs.tf │ └── terraform.tfvars ├── staging/ │ ├── main.tf │ ├── variables.tf │ ├── outputs.tf │ └── terraform.tfvars └── prod/ ├── main.tf ├── variables.tf ├── outputs.tf └── terraform.tfvars ``` * **Modularizzazione:** Dividi l'infrastruttura in moduli riutilizzabili, come il modulo VPC, il modulo EC2, il modulo database, ecc. Questo può semplificare la configurazione e migliorare la manutenibilità. ```terraform module "vpc" { source = "./modules/vpc" name = "my-vpc" cidr_block = "10.0.0.0/16" } ``` * **Utilizzo di Variables e Outputs:** Utilizza `variables.tf` per definire le variabili e `outputs.tf` per esportare gli attributi importanti delle risorse, come indirizzi IP e nomi DNS. ```terraform # variables.tf variable "instance_type" { type = string default = "t2.micro" } # outputs.tf output "public_ip" { value = aws_instance.example.public_ip } ``` * **Gestione dello stato:** Utilizza la funzionalità di gestione dello stato remoto di Terraform, come Terraform Cloud, S3 o Azure Blob Storage, per garantire la coerenza e la sicurezza dello stato. ```terraform terraform { backend "s3" { bucket = "my-terraform-state-bucket" key = "terraform.tfstate" region = "us-east-1" } } ```* **Controllo delle versioni:** Memorizza il codice Terraform in un repository Git e utilizza una strategia di branching per il controllo delle versioni. * **CI/CD:** Integra Terraform nella pipeline CI/CD per implementazioni e test automatizzati. Molti tweet menzionano GitHub Actions e Jenkins, che sono strumenti CI/CD popolari che possono essere integrati con Terraform. Il progetto di @@Abdulraheem183 è un ottimo esempio di come utilizzare GitHub Actions + Docker + Terraform per distribuire applicazioni su AWS. * **Revisione del codice:** Esegui revisioni del codice per garantire la qualità e la sicurezza del codice. * **Utilizzo degli strumenti CLI di Terraform:** `terraform fmt` formatta il codice, `terraform validate` convalida il codice. ## Strumenti Terraform consigliati * **Terraform Cloud:** Fornisce gestione dello stato remoto, collaborazione e funzionalità di automazione. * **Terragrunt:** Incapsula Terraform, fornendo un migliore supporto DRY (Don't Repeat Yourself) e una struttura di directory più facile da gestire. * **tfsec:** Strumento di analisi statica del codice per rilevare vulnerabilità di sicurezza nel codice Terraform. * **Checkov:** Un altro strumento di analisi statica del codice per rilevare vulnerabilità di sicurezza e problemi di non conformità nel codice Terraform. * **Kiro.dev + MCP (Managed Cloud Platform):** Come menzionato da @@RoxsRoss, questi strumenti possono generare automaticamente diagrammi dell'architettura dell'infrastruttura, il che è molto utile per comprendere e mantenere infrastrutture complesse. Link: [https://github.com/awslabs/mcp](https://github.com/awslabs/mcp) e [https://kiro.dev](https://kiro.dev) * **hcpt:** @@nnstt1 ha menzionato uno strumento CLI in fase di sviluppo per HCP Terraform, che vale la pena seguire. ## Limitazioni e sfide di Terraform * **Curva di apprendimento:** Terraform ha una certa curva di apprendimento, soprattutto per i team senza esperienza IaC. * **Gestione dello stato:** La gestione dei file di stato di Terraform è molto importante; se i file di stato sono danneggiati o persi, possono causare seri problemi. * **Complessità:** Per infrastrutture complesse, il codice Terraform può diventare molto complesso e difficile da mantenere. @@Achinedu001_ ha menzionato che dopo l'implementazione con Terraform, l'interfaccia utente è diventata un mal di testa, richiedendo frequenti salti tra diverse parti della console. Ciò evidenzia l'importanza di una buona modularizzazione e di una progettazione architettonica chiara. * **Gestione delle dipendenze:** La gestione delle dipendenze dei moduli e dei provider Terraform può essere impegnativa. ## ConclusioneTerraform è un potente strumento IaC che può aiutarti a migliorare l'efficienza, ridurre i costi e controllare meglio il tuo ambiente cloud. Seguendo le migliori pratiche, utilizzando gli strumenti giusti e prestando attenzione ai limiti di Terraform, puoi utilizzare Terraform in modo più efficace e trarne enormi vantaggi. Spero che questa guida pratica ti aiuti a padroneggiare meglio Terraform e ad applicarlo in progetti reali.
Published in Technology

You Might Also Like