Le organizzazioni che adottano l’Infrastructure as Code (IaC) su AWS spesso affrontano difficoltà nel garantire che la loro infrastruttura non solo sia correttamente provisionata, ma anche funzionante come previsto una volta distribuita. Anche le più piccole misconfigurazioni possono portare a costosi tempi di inattività, vulnerabilità di sicurezza o problemi di prestazioni.
Le metodologie di testing tradizionali — come l’ispezione manuale delle risorse o il fare affidamento esclusivamente sull’analisi statica del codice — non offrono una sufficiente fiducia per gli ambienti di produzione. C’è un bisogno urgente di un modo automatizzato e affidabile per convalidare le modifiche all’infrastruttura AWS prima che vengano messe in produzione.
Soluzione
Terratest fornisce un framework di testing automatizzato scritto in Go, progettato specificamente per testare il codice infrastrutturale in ambienti cloud reali come AWS. Deployando, verificando e distruggendo programmaticamente le risorse, Terratest colma il divario tra la scrittura di IaC (ad es., Terraform) e l’implementazione sicura delle modifiche. Ecco come funziona:
Di seguito è riportata una guida dettagliata su come effettuare il testing dell’infrastruttura AWS utilizzando Terratest con Terraform, insieme a frammenti di codice di esempio in Go. Questo flusso di lavoro ti aiuterà a provisionare risorse AWS, eseguire test su di esse per garantire che funzionino come previsto e poi distruggere tutto automaticamente.
Requisiti
Installa Terraform
Scarica e installa Terraform dal sito ufficiale.
Installa Go
Terratest è scritto in Go, quindi avrai bisogno di avere Go installato. Scarica Go dal sito ufficiale.
Configura le Credenziali AWS
Assicurati che le tue credenziali AWS siano configurate (ad es., tramite ~/.aws/credentials o variabili di ambiente come AWS_ACCESS_KEY_ID
e AWS_SECRET_ACCESS_KEY
).
Inizializza un Modulo Go
Nella tua directory di progetto, esegui:
go mod init github.com/yourusername/yourproject
go mod tidy
Aggiungi Terratest al tuo go.mod
Nella directory del tuo progetto/repo, esegui:
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
Esempio di Configurazione Terraform
Crea una semplice configurazione Terraform che avvia un’istanza EC2 di AWS. Metti i seguenti file in una directory chiamata aws_ec2_example (o qualsiasi nome tu preferisca).
Salvalo come main.tf per riferimento.
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
}
Successivamente, 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)
}
Snippet di Codice Terratest
Crea un file di test Go in una directory chiamata test (o puoi chiamarlo come vuoi, ma test è convenzionale). Ad esempio, 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")
}
Cosa Fa Questo Test
- Inizializza e applica la configurazione di Terraform in
../aws_ec2_example
. - Distribuisce un’istanza EC2 con l’AMI specificato in us-east-1.
- Cattura l’output
instance_id
di Terraform. - Verifica che l’ID dell’istanza non sia vuoto utilizzando la libreria di asserzione di Testify.
- Distrugge le risorse alla fine del test per evitare costi continuativi.
Esecuzione dei Test
- Naviga nella directory contenente il tuo file di test Go (ad esempio, la directory di test).
- Esegui il seguente comando:
go test -v
- Osserva l’output:
- Vedrai Terraform inizializzare e applicare la tua infrastruttura AWS.
- Dopo che le affermazioni del test sono superate, Terraform distruggerà le risorse.
Conclusione
Seguendo questi passaggi, puoi integrare Terratest nel tuo flusso di lavoro AWS IaC per:
- Provisionare risorse AWS utilizzando Terraform.
- Testarle in modo programmatico con test basati su Go.
- Validare che la tua infrastruttura sia configurata correttamente e funzioni come previsto.
- Smantellare automaticamente, assicurandoti di non incorrere in costi AWS non necessari e mantenendo un ambiente pulito per esecuzioni di test ripetute.