Neanche l’architettura infrastrutturale più sofisticata può prevenire ogni errore. È quindi fondamentale monitorare in modo proattivo le operazioni Terraform - in particolare quelle che potrebbero avere effetti distruttivi. L’obiettivo è rilevare tempestivamente modifiche critiche e attivare automaticamente degli allarmi, prima che si verifichi un raggio d’azione incontrollato.
Certo – il suo System Engineer Le farà sicuramente notare che Terraform mostra l’intero piano prima dell’esecuzione di un apply e che tale esecuzione deve essere approvata manualmente digitando "yes".
Quello che però il suo Engineer non Le dice: in realtà non legge mai davvero il piano prima di eseguirlo.
«Andrà tutto bene.»
Sistema di allerta precoce: Analisi automatizzata del piano
Terraform mette a disposizione, con il flag -json, una funzionalità che consente di elaborare automaticamente le informazioni del piano. Questo permette di rilevare le eliminazioni pianificate (destroy) e avviare automaticamente contromisure, come ad esempio un avviso su Slack o l’interruzione automatica della pipeline CI/CD.
Un altro indicatore precoce è il valore di ritorno di terraform plan -detailed-exitcode: un codice di uscita 2 segnala modifiche pianificate, incluse eliminazioni.
Esempio: Script Bash per l’analisi del piano
Questo script può essere integrato come hook nella pipeline CI/CD. Se vengono rilevate eliminazioni pianificate, avviene una notifica immediata – oppure, in modo opzionale, un arresto automatico del rollout.
Uno script di esempio come riferimento:
#!/bin/bash # Automated Plan Analysis Script set -e # Exit on any error # Create the Terraform plan and export it in JSON format terraform plan -out=tfplan -detailed-exitcode PLAN_EXIT_CODE=$? # Check if there are changes (exit code 2) if [ $PLAN_EXIT_CODE -eq 2 ]; then terraform show -json tfplan > plan.json # Analyze planned deletions with more robust jq query DELETIONS=$(jq -r '.resource_changes[]? | select(.change.actions[]? == "delete") | .address' plan.json 2>/dev/null) if [ -n "$DELETIONS" ]; then echo "BLAST RADIUS ALERT: Planned deletions detected:" echo "$DELETIONS" | while read -r resource; do echo " - $resource" done # Send alert with proper error handling if ! curl -f -X POST "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK" \ -H 'Content-type: application/json' \ --data "{\"text\":\"ALERT: Terraform Destroy detected in $WORKSPACE:\\n$DELETIONS\"}"; then echo "Warning: Failed to send Slack notification" fi exit 2 fi fi
Monitoraggio dei log basato su cloud con sistema di allerta
Per ambienti produttivi si consiglia un monitoraggio centralizzato e nativo per il cloud. Questo può essere realizzato, ad esempio, tramite Splunk in esecuzione locale nel proprio data center. Oppure con servizi cloud come AWS CloudWatch o Oracle Logging. L’obiettivo è rilevare voci di log sospette con parole chiave distruttive come “destroy” e generare allarmi in tempo reale.
Nota: I seguenti esempi servono come riferimento e, pur includendo le dichiarazioni di risorse necessarie, non sono ancora eseguibili End-to-End. I dettagli mancanti, come versions.tf e variables.tf, sono lasciati alla competenza del lettore sufficientemente esperto.
Esempio: Integrazione con AWS CloudWatch
Gli allarmi possono essere collegati direttamente a un aws_sns_topic, che a sua volta può inoltrare notifiche tramite e-mail, Slack, PagerDuty o altri sistemi. In questo modo, nessuna operazione critica di terraform destroy passerà inosservata.
provider "aws" { region = "eu-central-1" } resource "aws_cloudwatch_log_group" "terraform_logs" { name = "/terraform/cicd" retention_in_days = 7 tags = { Environment = "production" Purpose = "terraform-monitoring" } } resource "aws_cloudwatch_metric_filter" "terraform_destroy_filter" { name = "terraform-destroy-keyword" log_group_name = aws_cloudwatch_log_group.terraform_logs.name pattern = "\"destroy\"" metric_transformation { name = "DestroyMatches" namespace = "Terraform/CI" value = "1" unit = "Count" } } resource "aws_sns_topic" "alerts" { name = "terraform-blast-radius-alerts" tags = { Environment = "production" Purpose = "terraform-alerts" } } resource "aws_sns_topic_subscription" "email_alert" { topic_arn = aws_sns_topic.alerts.arn protocol = "email" endpoint = var.alert_email } resource "aws_cloudwatch_metric_alarm" "blast_radius_alarm" { alarm_name = "Terraform-Destroy-Detected" alarm_description = "Detects destroy operations in Terraform CI output" comparison_operator = "GreaterThanThreshold" evaluation_periods = 1 threshold = 0 metric_name = "DestroyMatches" namespace = "Terraform/CI" statistic = "Sum" period = 60 treat_missing_data = "notBreaching" insufficient_data_actions = [] alarm_actions = [aws_sns_topic.alerts.arn] ok_actions = [aws_sns_topic.alerts.arn] tags = { Environment = "production" Purpose = "blast-radius-monitoring" } }
Esempio: OCI Logging con sistema di allerta
In Oracle Cloud Infrastructure si utilizza il servizio Logging in combinazione con una Logging Query, un allarme e il servizio Notifications. In questo modo è possibile rilevare azioni distruttive come terraform destroy tramite parole chiave nel flusso di log della pipeline CI/CD o nei log di audit.
Passaggi per la configurazione:
- Configurare un Log Group per i log di build o i log di audit
- Creare una Logging Search con una query come data.message CONTAINS "destroy"
- Definire un Alarm che si attivi in caso di corrispondenze
- Collegare un Notification Topic (email, PagerDuty, ecc.)
Esempio di allarme tramite Terraform:
resource "oci_logging_log_group" "terraform_logs" { display_name = "terraform-ci-logs" compartment_id = var.compartment_id freeform_tags = { "Environment" = "production" "Purpose" = "terraform-monitoring" } } resource "oci_logging_log" "cicd_log" { display_name = "terraform-cicd-log" log_group_id = oci_logging_log_group.terraform_logs.id log_type = "CUSTOM" configuration { source { category = "write" resource = var.compartment_id service = "objectstorage" source_type = "OCISERVICE" } compartment_id = var.compartment_id } is_enabled = true retention_duration = 30 } resource "oci_ons_notification_topic" "alerts" { name = "terraform-destroy-alerts" compartment_id = var.compartment_id description = "Alerts for blast-radius related events" freeform_tags = { "Environment" = "production" "Purpose" = "terraform-alerts" } } resource "oci_ons_subscription" "email_subscription" { compartment_id = var.compartment_id topic_id = oci_ons_notification_topic.alerts.id protocol = "EMAIL" endpoint = var.alert_email } resource "oci_monitoring_alarm" "terraform_destroy_alarm" { display_name = "Terraform-Destroy-Detected" compartment_id = var.compartment_id metric_compartment_id = var.compartment_id query = <<-EOQ LoggingAnalytics[1m]{ logGroup = "${oci_logging_log_group.terraform_logs.display_name}", log = "${oci_logging_log.cicd_log.display_name}" } | where data.message =~ ".*destroy.*" | count() EOQ severity = "CRITICAL" body = "Terraform destroy operation detected in CI/CD pipeline!" is_enabled = true pending_duration = "PT1M" repeat_notification_duration = "PT15M" resolution = "1m" suppression { description = "Planned maintenance window" # time_suppress_from und time_suppress_until can be added if needed } destinations = [oci_ons_notification_topic.alerts.id] freeform_tags = { "Environment" = "production" "Purpose" = "blast-radius-monitoring" } }
Nota: La Logging Query utilizza una semplice ricerca testuale. Per ambienti produttivi, è consigliabile utilizzare filtri più precisi - ad esempio espressioni regolari o campi di log strutturati, qualora i tool CI producano log strutturati.
In alternativa, è possibile utilizzare anche il motore di query LoggingSearch semplificato, se Logging Analytics non è attivato nella propria tenancy.
Vantaggio aggiuntivo: Questo metodo può essere esteso anche ad azioni di apply, violazioni di policy o drift in OCI, a condizione che i log vengano alimentati correttamente (ad es. tramite output di Terraform Plan, avvisi di Sentinel o eventi di audit).
✅Checklist: Blast Radius Readiness
Questa checklist può aiutarLa a costruire un'infrastruttura il più possibile resiliente.
✅ Misure preventive
- [ ] States segmentati in base al Blast Radius Impact
- [ ] Lifecycle Rules implementate per le risorse critiche
- [ ] Validazioni di Remote State presenti
- [ ] Policy-as-Code per le Destroy Operations
- [ ] Analisi automatizzata del piano attivata
- [ ] Mappatura delle dipendenze Cross-State creata
🚨 Preparazione per il caso critico
- [ ] Strategia di backup dello state implementata
- [ ] Script di import per risorse critiche testati
- [ ] Playbook di Incident Response disponibili
- [ ] Formazione del team per operazioni di State Surgery effettuata
- [ ] Monitoraggio e allerta per eventi Blast Radius attivi
✍️Pianificazione accurata e mentalità giusta
Implementazioni Terraform di successo a livello enterprise richiedono anche:
- Architettura proattiva: progettare i states in base al Blast Radius Impact
- Programmazione difensiva: implementare guardrail e validazioni
- Monitoring e alerting: rilevare tempestivamente eventi di Blast Radius
- Preparazione alla recovery: essere pronti per il caso critico
Conclusione: Esplosioni controllate anziché caos
Importante: Il Blast Radius Management non è un setup una tantum, ma un processo continuo.
La sfida è trovare il giusto equilibrio tra flessibilità e controllo - proprio come nel principio di Goldilocks, che abbiamo già descritto in dettaglio in un articolo precedente.
Perché la migliore esplosione è quella che non avviene affatto.