Negli anni, lo sviluppo cloud ha subito un importante cambiamento di paradigma. Applicazioni più recenti e complesse vengono rapidamente implementate nel cloud per ridurre al minimo i tempi di inattività. E attraverso tutto questo, il concetto di Infrastruttura come Codice e vari strumenti sono emersi per semplificare il processo di sviluppo delle applicazioni.

Potresti chiederti: cos’è l’Infrastruttura come Codice? Come migliora il processo di sviluppo e l’esperienza, e dove si colloca Terraform in tutto ciò? Beh, esploreremo tutto questo e altro ancora in questa guida. Ma prima di iniziare, ecco alcuni prerequisiti:

  • Conoscenze di base del cloud e delle relative terminologie

  • Accesso a un PC per implementare esempi di codice

  • Un account GCP

Detto questo, iniziamo.

Ecco cosa tratteremo:

  1. Panoramica dell’Infrastruttura come Codice

  2. Cos’è Terraform?

  3. Vantaggi di Terraform

  4. Termini Comuni Usati in Terraform

  5. Progetto Dimostrativo: Come Scrivere una Configurazione Terraform

  6. Conclusione

Panoramica dell’Infrastruttura come Codice (IaC)

L’infrastruttura come codice si riferisce alla generazione di strumenti e applicazioni di infrastruttura cloud con un documento di configurazione basato su codice. Questo processo, quando in esecuzione, automatizza la sequenza e il processo di creazione di database, macchine virtuali e server. Ciò migliora l’esperienza dell’utente riducendo la frequenza delle distribuzioni manuali dei servizi cloud, specialmente per servizi multipli identici.

Ci sono due approcci distinti all’infrastruttura come codice: l’approccio Imperativo e l’approccio Descrittivo.

Quando si utilizza l’approccio dichiarativo alla generazione di infrastrutture, si dettagliano semplicemente le uscite attese/desiderate per la generazione dell’infrastruttura e quindi lo strumento IaC che si sta utilizzando elabora come produrre tale uscita.

D’altra parte, l’approccio imperativo consiste nel specificare i passaggi esatti necessari per raggiungere lo stato desiderato dell’infrastruttura. Sebbene l’approccio imperativo sembri più adatto per configurazioni infrastrutturali complesse, l’approccio dichiarativo può funzionare altrettanto bene.

Alcuni strumenti sono capaci di entrambi gli approcci, mentre altri sono adatti solo a uno dei due. Esempi di alcuni dei popolari strumenti IaC utilizzati globalmente includono Terraform IaC, AWS Cloud Formation, Ansible, e Pulumi, Chef, tra gli altri.

Come suggerisce il nome – infrastruttura come codice – il codice che crea l’infrastruttura è scritto in vari linguaggi di modello all’interno dello spazio IaC. I linguaggi di modello popolari includono JSON, YAML, modello ARM, HCL, script Heat, e così via.

Puoi anche utilizzare strumenti di scripting per eseguire l’infrastruttura cloud. Alcuni tra i più popolari includono Bash e PowerShell. Questi a volte sono preinstallati sulla maggior parte dei computer personali.

Di tutti questi strumenti, però, Terraform è distintivo per vari motivi – ed è quello che esamineremo in questo articolo.

Cos’è Terraform?

Terraform è uno strumento open source sviluppato da HashiCorp nel 2014. Si è evoluto nel corso degli anni e ora funge da strumento di infrastruttura agnostico rispetto al cloud che consente di creare infrastrutture su più fornitori di servizi cloud.

Terraform offre anche Terraform Cloud, uno strumento software come servizio basato sul cloud. Consente il dispiegamento basato su cloud di strumenti cloud, invece di utilizzare i vecchi metodi basati localmente che avevamo nel defunto strumento Terraform CLI.

Inoltre, come altri strumenti IaC che utilizzano linguaggi di modello, il framework di modello utilizzato per creare infrastrutture in Terraform è il linguaggio di modello di HashiCorp (HCL).

Vantaggi di Terraform

Adesso evidenzierò alcuni dei vantaggi nell’uso di Terraform come ingegnere cloud, insieme al ruolo chiave dello strumento nell’ecosistema cloud.

1. Approccio dichiarativo

Questo approccio all’automazione dell’infrastruttura cloud garantisce che tutta l’infrastruttura richiesta per essere dispiegata (database, server, e così via) sia dichiarata esplicitamente ed eseguita di conseguenza. Questo aiuta ad evitare conflitti.

2. Gestione dei conflitti

Oltre alle efficienti capacità di automazione degli strumenti cloud, Terraform ha alcune robuste proprietà di rilevamento e gestione dei conflitti. Uno dei modi in cui gestisce i conflitti è tramite la funzione Terraform plan. Questa funzione evidenzia eventuali conflitti percepiti o potenziali nell’orchestrazione dell’infrastruttura che consente una facile correzione prima del rilascio. Ne parlerò ulteriormente nelle sezioni successive.

3. Cloud Agnostic

Terraform è un fornitore di servizi di automazione multipiattaforma e multi-cloud con efficienti capacità di automazione dell’infrastruttura sui principali fornitori di servizi cloud (AWS, GCP e Azure). Consente anche l’automazione ibrida e tra diversi fornitori.

4. User-friendly

Terraform è uno dei principali strumenti di automazione cloud con le più vaste comunità di utenti in circolazione. Dispone di estesi tutorial per principianti che ti aiutano a familiarizzare rapidamente con lo strumento. Ecco un link alla sua documentazione così puoi approfondire ulteriormente.

5. Capacità di Gestione File

Terraform crea automaticamente un backup locale degli stati di automazione sul tuo computer locale per garantire un immediato recupero e gestione dei file in caso di problemi. Offre inoltre opzioni di backup remoto verso fornitori di servizi cloud remoti quando necessario.

6. Controllo Versione

Proprio come il sistema di controllo versione Git, Terraform ha un sistema di controllo versione integrato che ti consente di tenere traccia delle modifiche a un file Terraform. Ti consente anche di tornare a versioni precedenti del tuo codice se ci sono errori nella versione attuale, ad esempio.

7. Riutilizzabilità del codice

Terraform offre una vasta gamma di modelli di codice per un facile riutilizzo nella sua pagina di documentazione per sviluppatori.

Ora che abbiamo evidenziato i vantaggi di Terraform, vediamo alcune terminologie comuni utilizzate in Terraform e cosa significano.

Termini comuni utilizzati in Terraform

Prima di iniziare a usare Terraform, dovresti familiarizzare con alcuni termini chiave che ricorrono spesso. Ecco cosa devi sapere:

  1. Provider: in Terraform, un Provider è un’interfaccia di programmazione che consente a Terraform di interagire con vari API e servizi cloud. Ad esempio, utilizzeresti un provider per interfacciarti con un fornitore di servizi cloud come GCP o Azure.

  2. Moduli: I moduli sono specificamente creati all’interno del framework Terraform e servono come componenti riutilizzabili che ti consentono di orchestrare facilmente i servizi cloud. Puoi anche memorizzare informazioni chiave riguardanti i servizi cloud in un modulo e poi modificarlo per garantire unicità utilizzando variabili del modulo.

  3. Risorse: Le risorse in Terraform si riferiscono ai componenti dell’infrastruttura cloud da creare. Esempi includono reti cloud, macchine virtuali, zone di disponibilità e altre infrastrutture.

  4. Stato: Il concetto di stato in Terraform costituisce la base della sua efficienza. Lo stato tiene traccia della configurazione attuale delle risorse dell’infrastruttura e contiene dettagli su ogni risorsa che Terraform ha creato, modificato o eliminato. Il sistema di controllo versione di Terraform lo utilizza per tracciare eventuali modifiche apportate a un file di codice e utilizza tali informazioni per distruggere e fornire infrastrutture secondo necessità.

  5. Spazio di lavoro: Uno spazio di lavoro funziona in modo simile a un sistema di controllo versione, in quanto crea una sorta di vincolo intorno a un file di lavoro. Gli spazi di lavoro ti permettono di gestire più istanze di una singola configurazione di infrastruttura in modo pulito e isolato nello stesso backend. Puoi utilizzare gli spazi di lavoro per separare ambienti come sviluppo, staging e produzione utilizzando la stessa configurazione di Terraform.

Progetto Dimostrativo: Come Scrivere una Configurazione Terraform

In questa sezione, approfondiremo la scrittura del nostro primo file Terraform per orchestrare una macchina virtuale di programma Google Cloud con poche righe di codice. Ma prima di iniziare, discuteremo i vari comandi che dovresti capire prima di implementare il progetto dimostrativo.

Comandi Comuni di Terraform

  • Terraform init: Questo comando inizializza lo strumento Terraform e scarica file essenziali specifici del provider cloud. Stabilisce anche una connessione tra Terraform e il provider cloud in questione. Nel nostro caso, è tra GCP e il provider Terraform.

  • Terraform fmt: Questo comando garantisce automaticamente un formato e un’indentazione ottimali del codice. Assicura un’esecuzione ordinata del codice e riduce al minimo eventuali errori.

  • Terraform plan: Questo comando descrive i passaggi di esecuzione del codice Terraform e rileva eventuali errori che possono verificarsi durante il processo di esecuzione. Evidenzia anche eventuali errori nel codice Terraform che potrebbero ostacolare l’esecuzione. Infine, lavora insieme alla gestione dello stato di Terraform per rilevare eventuali cambiamenti di stato e de-provisionare o generare eventuali servizi cloud aggiuntivi se necessario.

  • Terraform apply: Questo comando esegue lo stato Terraform pianificato implementato dal comando Terraform plan.

  • Terraform destroy: Questo comando è il comando finale nello schema Terraform che viene utilizzato per disattivare o distruggere tutti i servizi cloud creati utilizzando il comando Terraform apply. È importante notare che è necessario eseguire i comandi elencati sopra in sequenza per garantire che la tua infrastruttura venga creata correttamente.

Creazione di una macchina virtuale GCP alimentata da IaC

Ora che hai imparato questi comandi importanti, testiamoli creando la nostra prima macchina virtuale GCP alimentata da IaC.

Nel tuo editor di codice, digita il seguente codice:

provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"        
}

Questo codice evidenzia il provider cloud che stiamo utilizzando per generare le risorse cloud di cui abbiamo bisogno. Nel nostro caso, è il programma cloud di Google. Il nome assegnato ad esso è semplicemente “google”. Altri provider cloud come AWS e Azure sono rispettivamente “aws” e “azure”.

La seconda riga identifica l’identificatore dell’abbonamento GCP, che è univoco per ciascun account GCP (e aiuta a facilitare un’integrazione accurata). Dovresti utilizzare il tuo nello spazio fornito.

Dovrai anche includere una regione delle risorse adatta e una zona di disponibilità delle risorse. Questo serve come base fisica per la macchina virtuale che creeremo per eseguirla. In questo scenario, ho scelto rispettivamente la regione centrale degli Stati Uniti e la zona di disponibilità 1-a. Puoi leggere di più qui sulle regioni cloud e sulle zone di disponibilità.

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"      
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11" 
    }
  }

Il frammento di codice sopra specifica la risorsa di calcolo esatta che verrà orchestrata, che nel nostro caso è un’istanza di macchina virtuale codificata come “vm_instance”. 'esempio-vm' è il nome che vogliamo assegnare alla macchina virtuale che creeremo per questo progetto. È importante notare che anche il nome della macchina virtuale deve essere univoco. Il tipo di macchina virtuale che abbiamo scelto è stato il tipo VM E2 (uso generale) – medio. Puoi ottenere ulteriori informazioni sui tipi di macchine virtuali qui.

Inoltre, specifico il sistema operativo avviato previsto (“boot_disk”), che è un’immagine del sistema operativo Debian Linux versione 11 nel mio caso.

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

Per completare la creazione della nostra macchina virtuale, dobbiamo configurare una Rete Virtuale per consentire l’accesso remoto alla VM. Il blocco dell’interfaccia di rete collega la macchina virtuale alla rete VPC (Virtual Private Cloud) predefinita fornita da GCP. Senza la rete VPC non saremo in grado di interfacciarci con la nostra macchina virtuale. Il blocco di output visualizza anche l’indirizzo IP di accesso predefinito nel terminale, che possiamo utilizzare per connetterci alla macchina virtuale.

Ecco il codice finale previsto:


provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"       
}

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"         
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"  
    }
  }

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

Procedendo da qui, eseguiremo questo codice utilizzando i comandi evidenziati nell’immagine qui sotto:

Il comando terraform -v conferma che Terraform è stato installato correttamente sul terminale. L’output atteso sarà la versione dello strumento Terraform installato.

Il comando successivo eseguito è la funzione terraform init che inizializza una comunicazione con il fornitore di servizi cloud, che nel nostro caso è GCP. Vengono anche installate tutte le dipendenze necessarie.

Viene eseguito anche il comando terraform fmt per garantire una formattazione adeguata del codice e l’indentazione. Successivamente viene eseguito il comando terraform plan in sequenza.

Dall’immagine sopra, è possibile vedere i passaggi che Terraform intende utilizzare per generare la macchina virtuale prevista.

Alla corretta esecuzione di Terraform plan, eseguiremo quindi la funzione terraform apply per eseguire i passaggi delineati da Terraform plan.

Questo genererà un prompt che chiederà una conferma dell’esecuzione di Terraform come mostrato sopra. Digitando “Sì” permetterà all’operazione di procedere senza intoppi.

All’esecuzione riuscita, verrà visualizzato un messaggio di successo come mostrato sopra. Con questo, abbiamo creato la nostra infrastruttura Cloud solo con il codice. Il comando terraform destroy può quindi essere chiamato per rimuovere le macchine virtuali create.

Conclusione

In questo articolo, hai imparato le basi dell’infrastruttura come codice. Abbiamo discusso di Terraform, dei suoi vantaggi e di alcune delle sue caratteristiche e comandi chiave. Abbiamo anche illustrato il suo utilizzo in un progetto dimostrativo.

Per ampliare ulteriormente la tua conoscenza, puoi consultare la documentazione di Terraform per ulteriori esempi di codice. Consiglio inoltre di utilizzare la tua conoscenza appena acquisita per automatizzare un progetto con utilizzi reali.

Sentiti libero di scrivermi per qualsiasi commento o domanda. Puoi anche dare un’occhiata ai miei altri articoli qui. Fino alla prossima volta, continua a programmare!