Questo documento fornisce linee guida e consigli per testare Terraform per Google Cloud moduli e configurazioni.
A volte, i test dei moduli e delle configurazioni Terraform seguono schemi e convenzioni diversi rispetto al test del codice dell'applicazione. Sebbene il test del codice dell'applicazione riguardi principalmente la logica di business delle applicazioni stesse, il test completo del codice dell'infrastruttura richiede il dispiegamento di risorse cloud reali per ridurre al minimo il rischio di errori di produzione. Esistono alcune considerazioni da tenere presenti quando esegui i test di Terraform:
- L'esecuzione di un test Terraform crea, modifica ed elimina l'infrastruttura reale, pertanto i test possono essere potenzialmente lunghi e costosi.
- Non puoi eseguire test di unità puramente su un'architettura end-to-end. L'approccio migliore è suddividere l'architettura in moduli e testarli singolarmente. I vantaggi di questo approccio includono uno sviluppo iterativo più rapido grazie a un tempo di esecuzione dei test più breve, costi ridotti per ogni test e probabilità ridotte di errori di test dovuti a fattori non controllabili.
- Se possibile, evita di riutilizzare lo stato. Potrebbero verificarsi situazioni in cui eseguirete test con configurazioni che condividono dati con altre configurazioni, ma idealmente ogni test dovrebbe essere indipendente e non riutilizzare lo stato tra i test.
Utilizza prima i metodi di test meno costosi
Esistono diversi metodi che puoi utilizzare per testare Terraform. In ordine crescente di costo, tempo di esecuzione e profondità, includono quanto segue:
- Analisi statica: test della sintassi e della struttura della configurazione
senza eseguire il deployment di risorse, utilizzando strumenti come compilatori, lint e
prove a vuoto. Per farlo, usa
terraform validate
. - Test di integrazione dei moduli: per assicurarti che i moduli funzionino correttamente, testa i singoli moduli singolarmente. I test di integrazione per i moduli prevedono il deployment del modulo in un ambiente di test e la verifica della creazione delle risorse previste. Esistono diversi framework di test che facilitano la scrittura dei test, come segue:
- Test end-to-end: estendendo l'approccio di test di integrazione a un intero ambiente, puoi verificare che più moduli funzionino insieme. In questo approccio, esegui il deployment di tutti i moduli che compongono l'architettura in un nuovo ambiente di test. Idealmente, l'ambiente di test dovrebbe essere il più simile possibile all'ambiente di produzione. Questa operazione è costosa, ma offre la massima certezza che le modifiche non danneggino l'ambiente di produzione.
Inizia in piccolo
Assicurati che i test si fondino l'uno sull'altro in modo iterativo. Valuta la possibilità di eseguire prima test più piccoli e poi passare a test più complessi, utilizzando un approccio fail fast.
Generare ID progetto e nomi delle risorse in modo casuale
Per evitare conflitti di denominazione, assicurati che le configurazioni abbiano un ID progetto univoco a livello mondiale e nomi di risorse non sovrapposti all'interno di ogni progetto. Per farlo, utilizza gli spazi dei nomi per le risorse. Terraform ha un provider casuale integrato per questo.
Utilizza un ambiente separato per i test
Durante i test, vengono create ed eliminate molte risorse. Assicurati che l'ambiente sia isolato dai progetti di sviluppo o di produzione per evitare eliminazioni accidentali durante la pulizia delle risorse. L'approccio migliore è fare in modo che ogni test crei un nuovo progetto o una nuova cartella. Per evitare una configurazione errata, valuta la possibilità di creare account di servizio specifici per ogni esecuzione del test.
Ripulire tutte le risorse
Testare il codice dell'infrastruttura significa che stai eseguendo il deployment di risorse effettive. Per evitare addebiti, valuta la possibilità di implementare un passaggio di pulizia.
Per eliminare tutti gli oggetti remoti gestiti da una determinata configurazione, utilizza il comando terraform destroy
. Alcuni framework di test hanno un
passaggio di pulizia integrato. Ad esempio, se utilizzi Terratest, aggiungidefer terraform.Destroy(t, terraformOptions)
al test. Se utilizzi
Kitchen-Terraform, elimina lo spazio di lavoro utilizzando
terraform kitchen delete WORKSPACE_NAME
.
Dopo aver eseguito il comando terraform destroy
, esegui anche procedure di pulizia aggiuntive per rimuovere le risorse che Terraform non è riuscito a eliminare. Per farlo,
elimina i progetti utilizzati per l'esecuzione del test o utilizza uno strumento come il
modulo project_cleanup
.
Ottimizza il tempo di esecuzione del test
Per ottimizzare il tempo di esecuzione del test, utilizza i seguenti approcci:
- Esegui i test in parallelo. Alcuni framework di test supportano l'esecuzione di più test Terraform contemporaneamente.
- Ad esempio, con Terratest puoi farlo aggiungendo
t.Parallel()
dopo la definizione della funzione di test.
- Ad esempio, con Terratest puoi farlo aggiungendo
- Esegui test in più fasi. Separa i test in configurazioni indipendenti
che possono essere testate separatamente. Questo approccio elimina la necessità di eseguire tutte le fasi durante l'esecuzione di un test e accelera il ciclo di sviluppo iterativo.
- Ad esempio, in Kitchen-Terraform, suddividi i test in suite separate. Durante l'iterazione, esegui ogni suite in modo indipendente.
- Analogamente, utilizzando Terratest, racchiudi ogni fase del test con
stage(t, STAGE_NAME, CORRESPONDING_TESTFUNCTION)
. Imposta le variabili di ambiente che indicano quali test eseguire. Ad esempio,SKIP
STAGE_NAME="true"
. - Il framework di test dei blueprint supporta l'esecuzione graduale.
Passaggi successivi
- Scopri le best practice generali per stile e struttura di Terraform su Google Cloud.
- Scopri le best practice per l'utilizzo dei moduli principali di Terraform.