Best practice per i test

Questo documento fornisce linee guida e consigli per i test Moduli e configurazioni di Terraform per Google Cloud.

A volte, i test dei moduli e delle configurazioni di 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 deployment di risorse cloud reali per ridurre al minimo il rischio di errori di produzione. Ecco alcuni esempi considerazioni sull'esecuzione dei test di Terraform:

  • L'esecuzione di un test Terraform crea, modifica ed elimina dell'infrastruttura, quindi i test possono essere potenzialmente costosi e dispendiosi in termini di tempo.
  • Non puoi eseguire test di unità puramente su un'architettura end-to-end. Il meglio è 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 in ordine di costo, tempo di esecuzione e profondità, includono quanto segue:

  • Analisi statica: verifica della sintassi e della struttura della configurazione senza eseguire il deployment di alcuna risorsa, usando strumenti come compilatori, linter e dry run. Per farlo, usa terraform validate.
  • Test di integrazione dei moduli: per assicurarti che i moduli funzionino correttamente, testa i singoli moduli singolarmente. Test di integrazione per i moduli comporta il deployment del modulo in un ambiente di test e la verifica che vengono create le risorse previste. Esistono diversi framework di test che facilitano la scrittura dei test, come segue:
  • Test end-to-end: estendendo l'approccio del test di integrazione alle di un intero ambiente, puoi avere la conferma che più moduli funzionano insieme. Con questo approccio, esegui il deployment di tutti i moduli che compongono l'architettura un nuovo ambiente di test. Idealmente, l'ambiente di test è simile possibili per il tuo 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 basino tra loro in modo iterativo. Valuta la possibilità di correre per poi passare a test più piccoli e poi più complessi, utilizzando fail fast.

Randomizza gli ID progetto e i nomi delle risorse

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 dispone di un fornitore di risultati casuali per questo scopo.

Utilizza un ambiente separato per i test

Durante il test, molte risorse vengono create ed eliminate. Assicurati che è isolato dai progetti di sviluppo o produzione per evitare eliminazioni accidentali durante la pulizia delle risorse. L'approccio migliore è avere ogni creare 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 implementando 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 usi Terratest, aggiungi defer 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 un'ulteriore pulizia per rimuovere le risorse che Terraform non è riuscito a eliminare. Per farlo eliminando i progetti utilizzati per l'esecuzione dei test o con uno strumento come project_cleanup.

Ottimizza il tempo di esecuzione del test

Per ottimizzare il tempo di esecuzione del test, utilizza i seguenti approcci:

  • Esegui 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.
  • 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 distinte. Durante l'iterazione, esegui ogni suite in modo indipendente.
    • Analogamente, utilizzando Terratest, chiudi ogni fase del test con stage(t, STAGE_NAME, CORRESPONDING_TESTFUNCTION). Imposta le variabili di ambiente che indicano quali test eseguire. Ad esempio, SKIPSTAGE_NAME="true".
    • Il framework di test dei blueprint supporta l'esecuzione graduale.

Passaggi successivi