Les organisations adoptant l’Infrastructure as Code (IaC) sur AWS rencontrent souvent des difficultés pour s’assurer que leur infrastructure est non seulement correctement provisionnée, mais aussi qu’elle fonctionne comme prévu une fois déployée. Même de petites erreurs de configuration peuvent entraîner des temps d’arrêt coûteux, des vulnérabilités de sécurité ou des problèmes de performance.
Les méthodes de test traditionnelles — telles que l’inspection manuelle des ressources ou la dépendance exclusive à l’analyse statique du code — ne fournissent pas une confiance suffisante pour les environnements de production. Il existe un besoin urgent d’une méthode automatisée et fiable pour valider les changements d’infrastructure AWS avant qu’ils ne soient mis en ligne.
Solution
Terratest fournit un cadre de test automatisé écrit en Go, conçu spécifiquement pour tester le code d’infrastructure dans des environnements cloud réels comme AWS. En déployant, vérifiant et détruisant des ressources de manière programmatique, Terratest comble le fossé entre l’écriture d’IaC (par exemple, Terraform) et la livraison confiante des changements. Voici comment cela fonctionne :
Ci-dessous un guide détaillé sur la façon de réaliser des tests d’infrastructure AWS en utilisant Terratest avec Terraform, accompagné d’exemples de code en Go. Ce flux de travail vous aidera à provisionner des ressources AWS, à exécuter des tests pour garantir qu’elles fonctionnent comme prévu, puis à tout détruire automatiquement.
Prérequis
Installez Terraform
Téléchargez et installez Terraform depuis le site officiel.
Installez Go
Terratest est écrit en Go, donc vous aurez besoin de Go installé. Téléchargez Go depuis le site officiel.
Configurez les Identifiants AWS
Assurez-vous que vos identifiants AWS sont configurés (par exemple, via ~/.aws/credentials ou des variables d’environnement comme AWS_ACCESS_KEY_ID
et AWS_SECRET_ACCESS_KEY
).
Initialisez un Module Go
Dans votre répertoire de projet, exécutez :
go mod init github.com/yourusername/yourproject
go mod tidy
Ajoutez Terratest à votre go.mod
Dans votre répertoire de projet/répertoire, exécutez :
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
Exemple de Configuration Terraform
Créez une configuration Terraform simple qui lance une instance EC2 AWS. Placez les fichiers suivants dans un répertoire nommé aws_ec2_example (ou tout autre nom que vous préférez).
Enregistrez-le sous le nom main.tf pour référence.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
required_version = ">= 1.3.0"
}
provider "aws" {
region = var.aws_region
}
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = "t2.micro"
tags = {
Name = "Terratest-Example"
}
}
output "instance_id" {
value = aws_instance.example.id
}
Ensuite, variables.tf:
variable "aws_region" {
type = string
default = "us-east-1"
}
variable "ami_id" {
type = string
default = "ami-0c55b159cbfafe1f0" # Example Amazon Linux AMI (update as needed)
}
Extrait de Code Terratest
Créez un fichier de test Go dans un répertoire nommé test (ou vous pouvez le nommer comme vous voulez, mais test est conventionnel). Par exemple, aws_ec2_test.go:
package test
import (
"testing"
"github.com/gruntwork-io/terratest/modules/terraform"
"github.com/stretchr/testify/assert"
)
func TestAwsEC2Instance(t *testing.T) {
// Define Terraform options to point to the Terraform folder
terraformOptions := &terraform.Options{
TerraformDir: "../aws_ec2_example",
// Optional: pass variables if you want to override defaults
Vars: map[string]interface{}{
"aws_region": "us-east-1",
"ami_id": "ami-0c55b159cbfafe1f0",
},
}
// At the end of the test, destroy the resources
defer terraform.Destroy(t, terraformOptions)
// Init and apply the Terraform configuration
terraform.InitAndApply(t, terraformOptions)
// Fetch the output variable
instanceID := terraform.Output(t, terraformOptions, "instance_id")
// Run a simple assertion to ensure the instance ID is not empty
assert.NotEmpty(t, instanceID, "Instance ID should not be empty")
}
Ce que fait ce test
- Initialise et applique la configuration Terraform dans
../aws_ec2_exampl
e. - Déploie une instance EC2 avec l’AMI spécifiée dans us-east-1.
- Capture la sortie Terraform
instance_id
. - Vérifie que l’ID de l’instance n’est pas vide en utilisant la bibliothèque d’assertion de Testify.
- Détruit les ressources à la fin du test pour éviter des coûts continus.
Exécution des Tests
- Naviguez vers le répertoire contenant votre fichier de test Go (par exemple, le répertoire de test).
- Exécutez la commande suivante :
go test -v
- Observez la sortie :
- Vous verrez Terraform initialiser et appliquer votre infrastructure AWS.
- Après que les assertions de test réussissent, Terraform détruira les ressources.
Conclusion
En suivant ces étapes, vous pouvez intégrer Terratest dans votre flux de travail AWS IaC pour :
- Provisionner des ressources AWS en utilisant Terraform.
- Les tester de manière programmatique avec des tests basés sur Go.
- Valider que votre infrastructure est configurée correctement et fonctionne comme prévu.
- Détruire automatiquement, en veillant à ne pas engendrer de coûts AWS inutiles et à maintenir un environnement propre pour des exécutions de tests répétées.