Las organizaciones que adoptan Infraestructura como Código (IaC) en AWS a menudo tienen dificultades para garantizar que su infraestructura no solo esté correctamente aprovisionada, sino que también funcione como se espera una vez desplegada. Incluso configuraciones incorrectas menores pueden llevar a tiempos de inactividad costosos, vulnerabilidades de seguridad o problemas de rendimiento.
Los métodos de prueba tradicionales, como la inspección manual de recursos o depender únicamente del análisis de código estático, no proporcionan la suficiente confianza para los entornos de producción. Existe una necesidad urgente de una forma automatizada y confiable para validar los cambios en la infraestructura de AWS antes de que se implementen.
Solución
Terratest proporciona un marco de pruebas automatizado escrito en Go, diseñado específicamente para probar el código de infraestructura en entornos de nube del mundo real como AWS. Al desplegar, verificar y destruir recursos de manera programática, Terratest cierra la brecha entre escribir IaC (por ejemplo, Terraform) y enviar cambios con confianza. Así es como funciona:
A continuación, se presenta una guía detallada sobre cómo lograr pruebas de infraestructura de AWS utilizando Terratest con Terraform, junto con fragmentos de código de ejemplo en Go. Este flujo de trabajo te ayudará a aprovisionar recursos de AWS, ejecutar pruebas contra ellos para asegurarte de que funcionen como se espera y luego desmontar todo automáticamente.
Requisitos previos
Instalar Terraform
Descarga e instala Terraform desde el sito oficial.
Instalar Go
Terratest está escrito en Go, así que necesitarás tener Go instalado. Descarga Go desde el sito oficial.
Configurar Credenciales de AWS
Asegúrate de que tus credenciales de AWS estén configuradas (por ejemplo, a través de ~/.aws/credentials o variables de entorno como AWS_ACCESS_KEY_ID
y AWS_SECRET_ACCESS_KEY
).
Inicializar un Módulo Go
En tu directorio de proyecto, ejecuta:
go mod init github.com/yourusername/yourproject
go mod tidy
Agregar Terratest a tu go.mod
En tu directorio de proyecto/repositorio, ejecuta:
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
Configuración de Terraform de Ejemplo
Crea una configuración simple de Terraform que lance una instancia de AWS EC2. Coloca los siguientes archivos en un directorio llamado aws_ec2_example (o cualquier nombre que prefieras).
Guárdalo como main.tf para referencia.
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
}
Luego, 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)
}
Fragmento de Código de Terratest
Crea un archivo de prueba de Go en un directorio llamado test (o puedes nombrarlo como desees, pero test es convencional). Por ejemplo, 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")
}
Qué Hace Esta Prueba
- Inicializa y aplica la configuración de Terraform en
../aws_ec2_exampl
e. - Despliega una instancia EC2 con la AMI especificada en us-east-1.
- Captura la salida de Terraform
instance_id
. - Verifica que el ID de la instancia no esté vacío utilizando la biblioteca assert de Testify.
- Destruye los recursos al final de la prueba para evitar incurrir en costos continuos.
Ejecutando las Pruebas
- Navega al directorio que contiene tu archivo de prueba de Go (por ejemplo, el directorio de pruebas).
- Ejecuta el siguiente comando:
go test -v
- Observa la salida:
- Verás a Terraform inicializando y aplicando tu infraestructura de AWS.
- Después de que las afirmaciones de la prueba pasen, Terraform destruirá los recursos.
Conclusión
Siguiendo estos pasos, puedes integrar Terratest en tu flujo de trabajo de IaC de AWS para:
- Provisionar recursos de AWS utilizando Terraform.
- Probarlos programáticamente con pruebas basadas en Go.
- Validar que tu infraestructura esté configurada correctamente y funcione como se espera.
- Eliminar automáticamente, asegurando que no estás incurriendo en costos innecesarios de AWS y manteniendo un entorno limpio para ejecuciones de pruebas repetidas.