As organizações que adotam Infraestrutura como Código (IaC) na AWS frequentemente enfrentam dificuldades em garantir que sua infraestrutura não apenas seja provisionada corretamente, mas também funcione como esperado uma vez implantada. Até mesmo pequenas misconfigurações podem levar a paradas custosas, vulnerabilidades de segurança ou problemas de desempenho.
Métodos de teste tradicionais — como inspecionar manualmente os recursos ou confiar unicamente na análise de código estático — não fornecem confiança suficiente para ambientes de produção. Há uma necessidade urgente de uma maneira automatizada e confiável de validar mudanças na infraestrutura da AWS antes que elas entrem em operação.
Solução
Terratest fornece uma estrutura de teste automatizada escrita em Go, projetada especificamente para testar código de infraestrutura em ambientes de nuvem do mundo real, como a AWS. Ao implantar, verificar e destruir recursos programaticamente, o Terratest preenche a lacuna entre escrever IaC (por exemplo, Terraform) e enviar mudanças com confiança. Veja como funciona:
Abaixo está um guia detalhado sobre como realizar testes de infraestrutura da AWS usando o Terratest com Terraform, juntamente com trechos de código exemplo em Go. Este fluxo de trabalho ajudará você a provisionar recursos da AWS, executar testes contra eles para garantir que funcionem como pretendido e, em seguida, desmontar tudo automaticamente.
Pré-requisitos
Instalar o Terraform
Baixe e instale o Terraform no site oficial.
Instalar o Go
O Terratest é escrito em Go, portanto, você precisará ter o Go instalado. Baixe o Go no site oficial.
Configurar as Credenciais da AWS
Assegure-se de que suas credenciais da AWS estejam configuradas (por exemplo, via ~/.aws/credentials ou variáveis de ambiente como AWS_ACCESS_KEY_ID
e AWS_SECRET_ACCESS_KEY
).
Inicialize um Módulo Go
No diretório do seu projeto, execute:
go mod init github.com/yourusername/yourproject
go mod tidy
Adicione o Terratest ao seu go.mod
No diretório do seu projeto/repositório, execute:
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
Configuração de Exemplo do Terraform
Crie uma configuração simples do Terraform que inicia uma instância AWS EC2. Coloque os seguintes arquivos em um diretório chamado aws_ec2_example (ou qualquer nome que preferir).
Salve-o como main.tf para referência.
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
}
Em seguida, 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 de Código do Terratest
Crie um arquivo de teste Go em um diretório chamado test (ou pode dar qualquer nome, mas test é convencional). Por exemplo, 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")
}
O Que Este Teste Faz
- Inicializa e aplica a configuração do Terraform em
../aws_ec2_exampl
e. - Implanta uma instância EC2 com a AMI especificada na região us-east-1.
- Captura a saída
instance_id
do Terraform. - Verifica se o ID da instância não está vazio usando a biblioteca de asserção do Testify.
- Destrói os recursos ao final do teste para evitar custos contínuos.
Executando os Testes
- Navegue até o diretório que contém seu arquivo de teste Go (por exemplo, diretório de teste).
- Execute o seguinte comando:
go test -v
- Observe a saída:
- Você verá o Terraform inicializando e aplicando sua infraestrutura AWS.
- Após a validação das asserções do teste, o Terraform destruirá os recursos.
Conclusão
Seguindo estes passos, você pode integrar Terratest em seu fluxo de trabalho de IaC da AWS para:
- Provisionar recursos AWS usando Terraform.
- Testá-los programaticamente com testes baseados em Go.
- Validar se sua infraestrutura está configurada corretamente e funcionando como esperado.
- Desmontar automaticamente, garantindo que você não esteja incorrendo em custos desnecessários da AWS e mantendo um ambiente limpo para execuções de testes repetidos.