Implémenter des tests Terratest de bout en bout sur des projets Terraform

Terraform permet la définition, l’aperçu et le déploiement d’une infrastructure cloud. Terraform vous permet de créer des fichiers de configuration à l’aide de la syntaxe HCL. La syntaxe HCL vous permet de spécifier un fournisseur de services cloud, tel qu’Azure, et les éléments qui composent votre infrastructure cloud. Après avoir créé vos fichiers de configuration, vous créez un plan d’exécution qui vous permet d’afficher un aperçu de vos modifications d’infrastructure avant leur déploiement. Une fois que vous avez vérifié les modifications, vous appliquez le plan d’exécution pour déployer l’infrastructure.

Les tests de bout en bout (E2E) sont utilisés pour valider qu’un programme fonctionne avant de le déployer en production. Un exemple de scénario pourrait être un module Terraform déployant deux machines virtuelles dans un réseau virtuel. Vous voudrez peut-être empêcher les deux machines d’effectuer des tests ping l’une sur l’autre. Dans cet exemple, vous pouvez définir un test pour vérifier le résultat prévu avant le déploiement.

Un test E2E est généralement un processus en trois étapes.

  1. Une configuration est appliquée à un environnement de test.
  2. Le code est exécuté pour vérifier les résultats.
  3. L’environnement de test est réinitialisé ou arrêté (par exemple, en désallouant une machine virtuelle).

Dans cet article, vous apprendrez comment :

  • Comprendre les principes de base des tests de bout en bout avec Terratest
  • Apprendre à écrire des tests de bout en bout à l’aide de Golang
  • Apprendre à utiliser Azure DevOps pour déclencher automatiquement des tests de bout en bout lorsque le code est validé sur votre référentiel

1. Configurer votre environnement

  • Abonnement Azure : Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
  • Langage de programmation Go : installez Go.

  • Exemple de code et de ressources : téléchargez le projet de tests de bout en bout sur GitHub à l’aide de l’outil DownGit, puis décompressez-le dans un nouveau répertoire qui contiendra l’exemple de code. Ce répertoire est appelé le répertoire de l’exemple.

2. Comprendre les tests de bout en bout

Les tests de bout en bout permettent de valider le fonctionnement d’un système dans son ensemble, par opposition aux tests de modules spécifiques. Pour les projets Terraform, les tests de bout en bout permettent de valider ce qui a été déployé. Ce type de test diffère de nombreux autres types qui testent des scénarios avant déploiement. Les tests de bout en bout sont essentiels pour tester des systèmes complexes qui comprennent plusieurs modules et agissent sur plusieurs ressources. Dans de tels scénarios, les tests de bout en bout sont le seul moyen de déterminer si les différents modules interagissent correctement.

Cet article se concentre sur l’utilisation de Terratest pour mettre en œuvre des tests de bout en bout. Terratest fournit tous les éléments nécessaires pour effectuer la tâche suivante :

  • Déployer une configuration Terraform
  • Vous permettre de rédiger un test en utilisant le langage Go pour valider ce qui a été déployé
  • Orchestrer les tests par étapes
  • Désactiver l’infrastructure déployée

3. Comprendre l’exemple de test

Pour cet article, nous utilisons un exemple disponible dans l’exemple de dépôt Azure/Terraform.

Cet exemple définit une configuration Terraform qui déploie deux machines virtuelles Linux dans le même réseau virtuel. Une machine virtuelle, nommée vm-linux-1, a une IP publique. Seul le port 22 est ouvert pour autoriser les connexions SSH. La deuxième machine virtuelle, vm-linux-2, n’a aucune IP publique définie.

Le test valide les scénarios suivants :

  • L’infrastructure est déployée correctement
  • À l’aide du port 22, il est possible d’ouvrir une session SSH sur vm-linux-1
  • En utilisant la session SSH sur vm-linux-1, il est possible d’effectuer un test ping sur vm-linux-2

Sample end-to-end test scenario

Si vous avez téléchargé l’exemple, la configuration Terraform pour ce scénario se trouve dans le fichier src/main.tf. Le fichier main.tf contient tout ce qui est nécessaire au déploiement de l’infrastructure Azure représentée dans la figure précédente.

Si vous n’êtes pas familiarisé avec la création d’une machine virtuelle, consultez Créer une machine virtuelle Linux avec une infrastructure dans Azure à l’aide de Terraform.

Attention

L’exemple de scénario présenté dans cet article est fourni à titre d’illustration uniquement. Nous avons volontairement gardé les choses simples afin de nous concentrer sur les étapes d’un test de bout en bout. Nous vous déconseillons d’avoir des machines virtuelles de production qui exposent des ports SSH sur une IP publique.

4. Examiner l’exemple de test

Le test de bout en bout est écrit en langage Go et utilise l’infrastructure Terratest. Si vous avez téléchargé l’exemple, le test est défini dans le fichier src/test/end2end_test.go.

Le code source suivant illustre la structure standard d’un test Golang à l’aide de Terratest :

package test

import (
    "testing"

    "github.com/gruntwork-io/terratest/modules/terraform"
    test_structure "github.com/gruntwork-io/terratest/modules/test-structure"
)

func TestEndToEndDeploymentScenario(t *testing.T) {
    t.Parallel()

    fixtureFolder := "../"

    // Use Terratest to deploy the infrastructure
    test_structure.RunTestStage(t, "setup", func() {
        terraformOptions := &terraform.Options{
            // Indicate the directory that contains the Terraform configuration to deploy
            TerraformDir: fixtureFolder,
        }

        // Save options for later test stages
        test_structure.SaveTerraformOptions(t, fixtureFolder, terraformOptions)

        // Triggers the terraform init and terraform apply command
        terraform.InitAndApply(t, terraformOptions)
    })

    test_structure.RunTestStage(t, "validate", func() {
        // run validation checks here
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
		    publicIpAddress := terraform.Output(t, terraformOptions, "public_ip_address")
    })

    // When the test is completed, teardown the infrastructure by calling terraform destroy
    test_structure.RunTestStage(t, "teardown", func() {
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
        terraform.Destroy(t, terraformOptions)
    })
}

Comme vous pouvez le voir dans l’extrait de code précédent, le test est composé de trois étapes :

  • installation : exécute Terraform pour déployer la configuration
  • validate' : effectue-t-elle les case activée de validation et les assertions
  • déchirure : nettoie l’infrastructure après l’exécution du test

La liste suivante présente certaines des fonctions clés fournies par l’infrastructure Terratest :

  • terraform. InitAndApply : active l’exécution terraform init et terraform apply à partir du code Go
  • terraform. Sortie : récupère la valeur de la variable de sortie de déploiement.
  • terraform. Détruire : exécute la terraform destroy commande à partir du code Go.
  • test_structure. LoadTerraformOptions : charge les options Terraform , telles que la configuration et les variables, à partir de l’état
  • test_structure. SaveTerraformOptions : Enregistre les options Terraform ( telles que la configuration et les variables) à l’état

5. Exécuter l’exemple de test

Les étapes suivantes exécutent le test sur l’exemple de configuration et de déploiement.

  1. Ouvrez une fenêtre de terminal/Bash.

  2. Connectez-vous à votre compte Azure.

  3. Pour exécuter cet exemple de test, vous avez besoin d’un nom de paire de clés publique/privée SSH id_rsa et id_rsa.pub dans votre répertoire de base. Remplacez <your_user_name> par le nom de votre répertoire de base.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. Dans le répertoire de l’exemple, accédez au répertoire src/test.

  5. Exécutez le test.

    go test -v ./ -timeout 10m
    

6. Vérifier les résultats

Après avoir exécuté go test, des résultats similaires à la sortie suivante s’affichent :

--- PASS: TestEndToEndDeploymentScenario (390.99s)
PASS
ok      test    391.052s

Résoudre les problèmes liés à Terraform sur Azure

Résoudre les problèmes courants liés à l’utilisation de Terraform sur Azure

Étapes suivantes