Organisaties die Infrastructure as Code (IaC) op AWS adopteren, hebben vaak moeite om ervoor te zorgen dat hun infrastructuur niet alleen correct wordt provisioned, maar ook functioneert zoals bedoeld zodra deze is uitgerold. Zelfs kleine misconfiguraties kunnen leiden tot kostbare downtime, beveiligingsproblemen of prestatieproblemen.
Traditionele testmethoden — zoals het handmatig inspecteren van bronnen of uitsluitend vertrouwen op statische code-analyse — bieden niet voldoende vertrouwen voor productieomgevingen. Er is een dringende behoefte aan een geautomatiseerde, betrouwbare manier om AWS-infrastructuur wijzigingen te valideren voordat ze live gaan.
Oplossing
Terratest biedt een geautomatiseerd testframework geschreven in Go, speciaal ontworpen om infrastructuurcode te testen in echte cloudomgevingen zoals AWS. Door programmatisch bronnen te implementeren, te verifiëren en te vernietigen, overbrugt Terratest de kloof tussen het schrijven van IaC (bijv. Terraform) en het met vertrouwen verzenden van wijzigingen. Hier is hoe het werkt:
Hieronder volgt een gedetailleerde gids over hoe je AWS-infrastructuurtest kunt bereiken met Terratest en Terraform, samen met voorbeeldcodefragmenten in Go. Deze workflow helpt je bij het provisioneren van AWS-bronnen, het uitvoeren van tests om te zorgen dat ze werken zoals bedoeld en vervolgens alles automatisch af te breken.
Vereisten
Installeer Terraform
Download en installeer Terraform vanaf de officiële site.
Installeer Go
Terratest is geschreven in Go, dus je hebt Go geïnstalleerd nodig. Download Go vanaf de officiële site.
Stel AWS-inloggegevens in
Zorg ervoor dat je AWS-inloggegevens geconfigureerd zijn (bijvoorbeeld via ~/.aws/credentials of omgevingsvariabelen zoals AWS_ACCESS_KEY_ID
en AWS_SECRET_ACCESS_KEY
).
Initialiseer een Go-module
In je projectdirectory, voer het volgende uit:
go mod init github.com/yourusername/yourproject
go mod tidy
Voeg Terratest toe aan je go.mod
In je project-/repo-directory, voer het volgende uit:
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
Voorbeeld Terraform-configuratie
Maak een eenvoudige Terraform-configuratie die een AWS EC2-instantie start. Plaats de volgende bestanden in een map met de naam aws_ec2_example (of een naam naar keuze).
Sla het op als main.tf ter referentie.
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
}
Vervolgens, 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)
}
Terratest Codefragment
Maak een Go-testbestand in een map met de naam test (of je kunt het een andere naam geven, maar test is conventioneel). Bijvoorbeeld, 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")
}
Wat deze test doet
- Initialiseert en past toe de Terraform-configuratie in
../aws_ec2_exampl
e. - Implanteert een EC2-instantie met de opgegeven AMI in us-east-1.
- Legt vast de
instance_id
Terraform-uitvoer. - Verifieert dat de instantienaam niet leeg is met behulp van Testify’s assert-bibliotheek.
- Verwijdert de middelen aan het einde van de test om doorlopende kosten te vermijden.
Tests uitvoeren
- Navigeer naar de directory met je Go-testbestand (bijv. testdirectory).
- Voer de volgende opdracht uit:
go test -v
- Observeer de uitvoer:
- Je zult zien dat Terraform je AWS-infrastructuur initialiseert en toepast.
- Nadat de testasserties slagen, zal Terraform de middelen vernietigen.
Conclusie
Door deze stappen te volgen, kun je Terratest integreren in je AWS IaC-workflow om:
- AWS-middelen te provisioneren met Terraform.
- Ze programmatisch te testen met Go-gebaseerde tests.
- Valideer dat je infrastructuur correct is geconfigureerd en naar verwachting functioneert.
- Afbreken automatisch, zorg ervoor dat u geen onnodige AWS-kosten maakt en een schone omgeving behoudt voor herhaalde testruns.