Terraform è un software open-source sviluppato da HashiCorp che permette la gestione dell'infrastruttura IT attraverso il concetto di "Infrastructure as Code". Utilizzando un linguaggio dichiarativo, gli utenti possono definire, creare e gestire risorse come server, database, reti e altro, sia in ambienti cloud (come AWS, Azure, Google Cloud) sia in infrastrutture locali. Terraform consente di automatizzare il provisioning e la gestione delle infrastrutture, offrendo la possibilità di mantenere versioni del codice, effettuare rollback e collaborare in modo efficace su progetti complessi. In questo articolo, approfondiremo quindi cos’è Terraform, come funziona e come si integra con Azure.
Una delle tecnologie emerse grazie al movimento DevOps, che promuove una maggiore comunicazione e cooperazione tra i team di sviluppo e quelli operativi, è l'Infrastructure as Code. Queste sono tecnologie che gli ingegneri DevOps e i Site Reliability Engineers (SRE) hanno adottato per implementare le più recenti tecniche di automazione dell'infrastruttura nel cloud.
Microsoft Azure supporta nativamente i template ARM per implementare l'IaC, ma questa è una tecnologia specifica di Azure.
Con l'aiuto di HashiCorp Terraform ora disponiamo di uno strumento open source di Infrastructure as Code che è indipendente dal cloud, un tool di automazione dell'infrastruttura che funziona con qualsiasi provider, incluso Microsoft Azure e può operare simultaneamente su più piattaforme cloud in un'unica distribuzione di infrastruttura.
Quando si automatizzano le distribuzioni di risorse su Microsoft Azure, Terraform offre alcune differenze rispetto agli strumenti nativi dei template ARM di Microsoft e, in questo articolo, vedremo più da vicino cos'è Terraform, come usarlo e come appare l'utilizzo di quest’ultimo per il provisioning di infrastrutture e risorse su Microsoft Azure.
Prima di andare a trattare Terraform e la sua integrazione all’interno di Azure, prendiamoci prima un minuto per un breve ripasso, a beneficio di chi magari si è perso qualche passaggio. Che cos’è l’Infrastructure as Code?
Infrastructure as Code (IaC) è un approccio alla gestione e alla configurazione delle infrastrutture IT attraverso la definizione e l'automazione tramite codice, piuttosto che attraverso interventi manuali sui server o sui dispositivi di rete.
Con IaC, l'infrastruttura (server, database, reti, ecc.) viene descritta in file di configurazione leggibili e ripetibili, solitamente in formati come JSON, YAML o linguaggi specifici come HCL (HashiCorp Configuration Language).
Questi file possono essere versionati, revisionati, e gestiti come qualsiasi altro codice sorgente, rendendo il processo di provisioning e gestione più efficiente e meno soggetto ad errori.
L'IaC offre numerosi vantaggi, tra cui una maggiore coerenza, ripetibilità e scalabilità delle distribuzioni dell'infrastruttura, oltre a un provisioning più rapido e affidabile. Consente anche l'uso del controllo di versione e la documentazione delle configurazioni dell'infrastruttura, facilitando il tracciamento delle modifiche e i rollback.
Si allinea perfettamente ai principi fondamentali di DevOps, come l'automazione, la collaborazione e l'integrazione e distribuzione continue (CI/CD).
HashiCorp Terraform è uno strumento di Infrastructure as Code che aiuta a distribuire e gestire in modo più affidabile le distribuzioni di infrastrutture su uno o più cloud, o persino on-premise.
Come tutti gli strumenti IaC, Terraform permette di scrivere codice che viene utilizzato per creare, modificare e versionare le distribuzioni della propria infrastruttura digitale in modo affidabile ed efficiente.
Esistono due tipi di Infrastructure as Code: dichiarativo e imperativo.
Terraform appartiene al tipo dichiarativo di IaC, in cui si scrive un file modello o, nel caso di Terraform, uno o più file con estensione .tf nel Terraform Configuration Language.
Questi file dichiarano quale dovrebbe essere il risultato finale della distribuzione dell'infrastruttura; quindi, quando esegui la distribuzione con lo strumento Terraform, esso apporterà le modifiche o gli aggiornamenti necessari all’infrastruttura per soddisfare la definizione desiderata che è stata dichiarata.
In confronto, un approccio imperativo all'IaC utilizzerebbe script tradizionali da riga di comando (CLI) che eseguono tutti i passaggi necessari nell'ordine in cui sono scritti.
L'IaC dichiarativo è più efficiente e affidabile, poiché non è necessario conoscere lo stato attuale dell'infrastruttura quando si scrive il codice IaC e lo strumento determinerà quali modifiche o aggiornamenti apportare al momento della distribuzione.
Il codice scritto in Terraform può essere utilizzato per dichiarare (o definire) tutti i componenti dell'infrastruttura necessari per un determinato carico di lavoro. Questo carico di lavoro potrebbe essere una singola applicazione o anche un sistema su larga scala composto da più microservizi, database, macchine virtuali e altre risorse.
I componenti infrastrutturali del carico di lavoro possono includere risorse di infrastruttura di basso livello come rete, archiviazione e risorse di calcolo, e anche infrastrutture di alto livello come servizi di calcolo e database Platform as a Service (PaaS) o altri componenti.
Mentre strumenti come Azure Bicep e ARM Templates sono sviluppati da Microsoft per supportare nativamente la gestione delle risorse di Microsoft Azure, questi strumenti permettono di gestire solo risorse Azure.
Utilizzando HashiCorp Terraform, invece, si possono utilizzare gli stessi strumenti e linguaggi per gestire le risorse di Microsoft Azure, oltre a qualsiasi altra risorsa all'interno dei propri ambienti da un singolo progetto Terraform.
Inoltre, con Terraform, gli SRE o ingegneri DevOps utilizzeranno le stesse competenze e la stessa comprensione del linguaggio HCL per gestire tutte le risorse, garantendo anche benefici in termini di efficienza.
Ci sono diversi vantaggi nell'utilizzare Terraform per gestire le proprie risorse:
Quando si inizia a utilizzare Terraform, ci sono alcuni termini importanti da conoscere per meglio orientarsi tra i file, la documentazione e altre risorse mentre si lavora ai propri progetti Terraform.
Ecco alcuni termini utili che sono importanti da comprendere per tutti gli ingegneri DevOps o gli ingegneri di affidabilità dei siti (SRE):
Ci sono altri termini specifici, tuttavia questi sono quelli principali che si deve conoscere quando si comincia a utilizzare l'automazione di Terraform e costituiscono la base per poterne comprendere il funzionamento.
Abbiamo creato il team Infra&Security, verticale sul cloud Azure, per rispondere alle esigenze dei clienti che ci coinvolgono nelle decisioni tecniche e strategiche. Oltre a configurare e gestire il loro tenant, ci occupiamo di:
Con Dev4Side, hai un partner affidabile in grado di supportarti sull'intero ecosistema applicativo di Microsoft.
Essendo un insieme di strumenti indipendente dalla piattaforma, Terraform adotta un modello in stile "plugin" per aggiungere provider che gestiscono la comunicazione con le varie API infrastrutturali.
Questo consente al codice Terraform di integrare i provider specifici di cui si ha bisogno per lavorare con le proprie distribuzioni di infrastruttura e potenziare lo strumento con la capacità di gestire diverse risorse tecnologiche come, nel nostro caso, le risorse di Microsoft Azure, le risorse di Microsoft Azure AD o anche risorse tecnologiche non Microsoft.
Per lavorare con l'infrastruttura di Microsoft Azure tramite Terraform, si utilizza il provider azurerm per codificare contro le API REST del Microsoft Azure Resource Manager (ARM).
Il provider azurerm consente la gestione delle risorse di Microsoft Azure come macchine virtuali, account di archiviazione e interfacce di rete, ma non è il solo dedicato alla piattaforma cloud di Microsoft.
Ci sono infatti diversi provider Terraform specifici per i vari tipi di risorse Azure:
Come strumento di Infrastructure as Code, l'infrastruttura gestita da Terraform è configurata in codice HCL (HashiCorp Configuration Language) e di solito viene inserita nel controllo di versione (come Git) e integrata con pipeline di distribuzione CI/CD per l'automazione della distribuzione.
I moduli Terraform sono un modo per creare blocchi di codice HCL (HashiCorp Configuration Language) di Terraform che possono essere riutilizzati all'interno di un singolo progetto Terraform o persino tra più progetti Terraform.
Un'analogia per i programmatori, pensando ai moduli Terraform, è paragonarli a una funzione o a un metodo di codice.
Per i non avvezzi al linguaggio dei programmatori, immaginiamo invece di avere un set di istruzioni per costruire qualcosa, come una casa. Se si desidera costruire diverse case simili, al posto di riscrivere tutte le istruzioni ogni volta si può creare un modulo con le istruzioni per una parte della casa, come la cucina, e riutilizzarlo ogni volta che se ne ha bisogno.
All'inizio, quando si comincia a scrivere un progetto Terraform, si creano uno o più file di codice Terraform (.tf) all'interno di una singola cartella. Questo è simile a scrivere tutto il codice per un programma in un unico file di codice sorgente di oltre 1.000 righe.
Con i moduli, si può suddividere quel codice in blocchi che vengono utilizzati in tutto il programma. Questo consente di creare riutilizzo del codice e di aderire alla prassi migliore DRY (Don’t Repeat Yourself) nella programmazione, rendendo anche il codice più facile da leggere e mantenere nel tempo.
I moduli in Terraform offrono vantaggi per diversi casi d'uso:
A livello basilare, un modulo Terraform è una raccolta di file di codice Terraform (.tf) nella stessa cartella. Questo è simile a un normale progetto Terraform, ma con un modulo Terraform puoi utilizzare il modulo da un altro modulo o progetto per ottenere il riutilizzo del codice per l'infrastruttura.
Pensando al riutilizzo del codice in confronto ad altre tecnologie di sviluppo, è utile considerare un modulo Terraform come una libreria di codice che viene referenziata e chiamata da un'altra libreria o applicazione di codice.
Nel 2024, Microsoft ha annunciato i moduli verificati di Azure (Azure Verified Modules o AVM), un'iniziativa per standardizzare i moduli di Infrastructure-as-Code (IaC) per Azure. L'obiettivo è fornire un insieme unificato di moduli Terraform (e Bicep) che aderiscano alle migliori pratiche del settore e a standard specifici.
Caratteristiche chiave di AVM:
Per iniziare a utilizzare gli AVM per Terraform, è possibile esplorare i moduli attualmente disponibili sulla pagina ufficiale degli AVM.
Ora che abbiamo un po’ più chiaro che cos’è Terraform e le basi di come funziona, diamo un'occhiata a un esempio di codice Terraform utilizzando il provider Azure Resource Manager (azurerm) per creare un gruppo di risorse Azure e successivamente un account di archiviazione Azure all'interno di quel gruppo di risorse.
Tutte le distribuzioni di infrastruttura in Microsoft Azure utilizzeranno i gruppi di risorse, e la maggior parte utilizzerà anche gli account di archiviazione Azure.
I seguenti esempi offriranno una migliore comprensione su come usare Terraform per gestire le risorse di Microsoft Azure. Quindi, procediamo.
Ecco un semplice esempio di codice Terraform che utilizza il tipo di risorsa azurerm_resource_group di Azure RM per specificare l'IaC per distribuire un gruppo di risorse Azure.
# Creare un resource group
resource "azurerm_resource_group" "d4s" { name = "d4s-rg" location = "West Europe" }
Quando si esegue una distribuzione Terraform utilizzando questo codice, il gruppo di risorse Azure verrà creato.
Notare che all'interno del codice Terraform per la risorsa azurerm_resource_group, il codice Terraform imposta il nome della "risorsa Terraform" a d4s.
Questo nome può essere utilizzato per fare riferimento alla risorsa in codice Terraform successivo (come la creazione dell'account di archiviazione Azure qui sotto) per accedere alle proprietà/valori della risorsa e configurare altre risorse da distribuire.
Ad esempio, in altro codice Terraform, si può fare riferimento a questo gruppo di risorse utilizzando il seguente formato:
# Formato
[Terraform Resource Type].[Terraform Resource Name]
# Specifica del tipo di risorsa del Resource Group AzureRM
azurerm_resource_group.[Terraform Resource Name]
# Specificare il particolare Resource Group denominato "d4s"
azurerm_resource_group.d4s
Si noti che, per fare riferimento al gruppo di risorse denominato d4s, è necessario assegnare questo nome al tipo di risorsa del gruppo di risorse (azurerm_resource_group). Quando si dichiarano risorse Terraform, il primo valore tra virgolette (") è il tipo di risorsa Terraform, mentre il secondo valore tra virgolette (") è il nome della risorsa.
Ecco un esempio per chiarire:
# Formato
resource "[Terraform Resource Type]" "[Terraform Resource Name]" { ... }
# Specifica del tipo di risorsa del Resource Group AzureRM
resource "azurerm_resource_group" "[Terraform Resource Name]" { ... }
# Specify the Resource Group resource type to be named "d4s"
resource "azurerm_resource_group" "d4s" { ... }
Tutte le risorse definite all'interno dei file di configurazione Terraform devono avere un nome univoco all'interno dei file di configurazione Terraform (.tf). Questa unicità deve essere rispettata in tutti i file .tf della propria distribuzione, sia che si utilizzi un singolo file .tf o più file. Inoltre, il nome è univoco per il tipo di risorsa Terraform che viene distribuito.
Questo schema Tipo di Risorsa Terraform + Nome Risorsa viene utilizzato per definire ogni risorsa univoca che la configurazione Terraform gestirà e distribuirà. Può anche essere utilizzato per impostare dipendenze tra risorse Terraform, permettendo di fare riferimento a una risorsa quando configuri un'altra; come illustrato di seguito.
Ecco un esempio di codice Terraform per creare un account di archiviazione Azure utilizzando il tipo di risorsa azurerm_storage_account.
In questo caso, il nome della risorsa Terraform per l'account di archiviazione è impostato su d4sstorage, e il resource_group_name per organizzare la risorsa all'interno di Azure fa riferimento al gruppo di risorse Azure creato nell'esempio precedente.
# Creare un Azure Storage Account resource
"azurerm_storage_account" "d4sstorage" { name = "d4sstorage"
# Posizionare nello stesso resource group
resource_group_name = azurerm_resource_group.d4s.name
# Usare la stessa location del resource group
location = azurerm_resource_group.d4s.location account_tier = "Standard" account_replication_type = "GRS" tags = { environment = "dev" } }
Quando si esegue una distribuzione Terraform utilizzando questo codice, l'account di archiviazione Azure verrà creato con le configurazioni specificate, ad esempio collocandolo all'interno del gruppo di risorse Azure precedentemente creato nella stessa distribuzione.
Impostando la proprietà azurerm_storage_account.resource_group_name al valore di azurerm_resource_group.d4s.name, si fa riferimento al gruppo di risorse Azure precedentemente creato, utilizzandone il .name per indicare al provider azurerm in quale gruppo di risorse inserire l'account di archiviazione Azure.
L’impegno ormai assodato di Microsoft in campo open source sta dando grandi frutti da molti anni e l’integrazione di tutta una serie di tool e strumenti all’interno dei suoi servizi proprietari sta portando a un notevole incremento della qualità dell’offerta per tutte quelle aziende che necessitano di infrastrutture digitali più efficienti.
L’accoppiata Terraform e Azure è l’ennesimo buon esempio di come quest’apertura abbia ripagato enormemente. Si rivela, nelle mani di developer, ingegneri e SRE, uno strumento potente e versatile per la gestione dell'infrastruttura cloud, con la sua capacità di automatizzare il provisioning e la configurazione delle risorse, consentendo così alle organizzazioni di ridurre i tempi di sviluppo e migliorare la coerenza nelle distribuzioni.
In ultima battuta, non si può non menzionare una comunità estremamente attiva che contribuisce a moduli e provider per continuare a migliorarli e integrare in maniera ancora più stretta le funzionalità di Terraform con i servizi di Azure.
Terraform è uno strumento open-source sviluppato da HashiCorp che consente di definire e gestire l'infrastruttura come codice, secondo un approccio dichiarativo. Quando viene utilizzato in combinazione con Microsoft Azure, permette agli sviluppatori e agli ingegneri DevOps di automatizzare il provisioning e la configurazione delle risorse Azure, mantenendo al contempo un elevato livello di coerenza, ripetibilità e controllo versionato. Il suo funzionamento si basa su file .tf
scritti in HCL, che dichiarano lo stato desiderato dell'infrastruttura.
Utilizzare Terraform su Azure significa avere uno strumento indipendente dal cloud provider, capace di orchestrare risorse Azure insieme a risorse di altre piattaforme all’interno dello stesso progetto. La possibilità di ispezionare le modifiche prima dell’applicazione grazie al comando plan
, la semplicità d’uso offerta dal linguaggio dichiarativo e l’assenza di rotture anche in esecuzioni ripetute rendono Terraform particolarmente adatto a gestire ambienti complessi e dinamici.
Per lavorare con Azure, Terraform mette a disposizione diversi provider specifici. Il principale è azurerm
, che interagisce con le API REST di Azure Resource Manager e consente di gestire risorse come macchine virtuali, account di archiviazione e reti. Altri provider includono azuread
per la gestione di utenti e gruppi in Azure Active Directory, azuredevops
per interagire con Azure DevOps, azapi
per accedere a funzionalità ARM in anteprima e azurestack
per gestire ambienti distribuiti tramite Azure Stack.
Un modulo Terraform è una raccolta di file che incapsulano blocchi riutilizzabili di codice, rendendo più semplice la gestione e la manutenzione dell'infrastruttura. Grazie ai moduli è possibile evitare la duplicazione, aumentare la leggibilità del progetto e applicare modifiche in modo centralizzato. Gli Azure Verified Modules, noti come AVM, sono una serie di moduli ufficiali sviluppati e supportati da Microsoft per garantire che le distribuzioni seguano le migliori pratiche in termini di sicurezza, efficienza e affidabilità.
Con Terraform è possibile creare qualsiasi tipo di risorsa supportata da Azure, incluse quelle di rete, di archiviazione, computazionali e PaaS. Un esempio comune consiste nella creazione di un gruppo di risorse seguito da un account di archiviazione, definendo le proprietà desiderate nel codice .tf
e lasciando che Terraform provveda a generare e mantenere lo stato infrastrutturale corrispondente.
L'approccio dichiarativo, come quello adottato da Terraform, si basa sulla descrizione dello stato desiderato dell’infrastruttura. Spetta allo strumento calcolare e applicare solo le modifiche necessarie per raggiungere tale stato. Al contrario, l’approccio imperativo richiede che ogni passo venga esplicitamente scritto e seguito in ordine, rendendo la gestione meno flessibile e più soggetta a errori. Terraform, con il suo modello dichiarativo, non necessita di conoscere lo stato corrente dell’infrastruttura al momento della scrittura, migliorando affidabilità e scalabilità.
È importante familiarizzare con concetti come i file .tf
, che contengono il codice infrastrutturale, e con termini come resource, provider, variable, module e input variable. Ogni risorsa è definita da un tipo e da un nome che devono essere univoci all’interno del progetto. I provider permettono a Terraform di interagire con le API del cloud, mentre le variabili rendono il codice più dinamico e riutilizzabile. I moduli, infine, consentono di organizzare il codice in blocchi logici e riutilizzabili per una maggiore efficienza.
Il team Infra & Security è verticale sulla gestione ed evoluzione dei tenant Microsoft Azure dei nostri clienti. Oltre a configurare e gestire il tenant, si occupa della creazione dei deployment applicativi tramite le pipelines di DevOps, monitora e gestisce tutti gli aspetti di sicurezza del tenant, supportando i Security Operations Centers (SOC).