Organisationen, die Infrastructure as Code (IaC) auf AWS übernehmen, haben oft Schwierigkeiten sicherzustellen, dass ihre Infrastruktur nicht nur korrekt bereitgestellt, sondern auch wie beabsichtigt funktioniert, sobald sie bereitgestellt ist. Selbst geringfügige Fehlkonfigurationen können zu kostspieligen Ausfallzeiten, Sicherheitsanfälligkeiten oder Leistungsproblemen führen.
Traditionelle Testmethoden – wie das manuelle Überprüfen von Ressourcen oder das ausschließliche Verlassen auf statische Codeanalyse – bieten nicht genügend Vertrauen für Produktionsumgebungen. Es besteht ein dringender Bedarf an einer automatisierten, zuverlässigen Methode zur Validierung von AWS-Infrastruktur-Änderungen, bevor sie live geschaltet werden.
Lösung
Terratest bietet ein automatisiertes Testframework, das in Go geschrieben ist und speziell zum Testen von Infrastrukturcode in realen Cloud-Umgebungen wie AWS entwickelt wurde. Durch das programmatische Bereitstellen, Überprüfen und Zerstören von Ressourcen überbrückt Terratest die Lücke zwischen dem Schreiben von IaC (z. B. Terraform) und dem sicheren Bereitstellen von Änderungen. So funktioniert es:
Im Folgenden finden Sie eine detaillierte Anleitung, wie Sie AWS-Infrastrukturtests mit Terratest und Terraform durchführen können, zusammen mit Beispielcode-Snippets in Go. Dieser Workflow hilft Ihnen, AWS-Ressourcen bereitzustellen, Tests gegen diese durchzuführen, um sicherzustellen, dass sie wie beabsichtigt funktionieren, und dann alles automatisch abzureißen.
Voraussetzungen
Terraform installieren
Lade Terraform von der offiziellen Seite herunter und installiere es.
Go installieren
Terratest ist in Go geschrieben, daher musst du Go installieren. Lade Go von der offiziellen Seite herunter.
AWS-Anmeldeinformationen einrichten
Stelle sicher, dass deine AWS-Anmeldeinformationen konfiguriert sind (z. B. über ~/.aws/credentials oder Umgebungsvariablen wie AWS_ACCESS_KEY_ID
und AWS_SECRET_ACCESS_KEY
).
Ein Go-Modul initialisieren
Führe in deinem Projektverzeichnis aus:
go mod init github.com/yourusername/yourproject
go mod tidy
Füge Terratest zu deinem go.mod
hinzu. Führe in deinem Projekt-/Repo-Verzeichnis aus:
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
Beispiel-Terraform-Konfiguration
Erstelle eine einfache Terraform-Konfiguration, die eine AWS EC2-Instanz startet. Lege die folgenden Dateien in ein Verzeichnis mit dem Namen aws_ec2_example (oder einem beliebigen Namen, den du bevorzugst) ab.
Speichere es als main.tf zur Referenz.
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
}
Als Nächstes, 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-Code-Snippet
Erstelle eine Go-Testdatei in einem Verzeichnis mit dem Namen test (oder du kannst es beliebig benennen, aber test ist konventionell). Zum Beispiel, 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")
}
Was dieser Test macht
- Initialisiert und wendet die Terraform-Konfiguration in
../aws_ec2_exampl
e an. - Stellt bereit eine EC2-Instanz mit der angegebenen AMI in us-east-1.
- Erfasst die Terraform-Ausgabe
instance_id
. - Überprüft, dass die Instanz-ID nicht leer ist, indem die Assert-Bibliothek von Testify verwendet wird.
- Zerstört die Ressourcen am Ende des Tests, um laufende Kosten zu vermeiden.
Ausführen der Tests
- Navigieren Sie zum Verzeichnis, das Ihre Go-Testdatei enthält (z. B. Testverzeichnis).
- Führen Sie den folgenden Befehl aus:
go test -v
- Beobachten Sie die Ausgabe:
- Sie sehen, wie Terraform Ihre AWS-Infrastruktur initialisiert und anwendet.
- Nachdem die Test-Assertions bestanden haben, wird Terraform die Ressourcen zerstören.
Abschluss
Indem Sie diesen Schritten folgen, können Sie Terratest in Ihren AWS-IaC-Workflow integrieren, um:
- Bereitzustellen von AWS-Ressourcen mit Terraform.
- Testen Sie diese programmgesteuert mit Go-basierten Tests.
- Validieren Sie, dass Ihre Infrastruktur richtig konfiguriert ist und wie erwartet funktioniert.
- Abreißen automatisch, um sicherzustellen, dass keine unnötigen AWS-Kosten anfallen und eine saubere Umgebung für wiederholte Testläufe aufrechterhalten wird.