Организации, принимающие Инфраструктуру как Код (IaC) на AWS, часто сталкиваются с проблемой обеспечения того, чтобы их инфраструктура не только была правильно предоставлена, но и функционировала так, как задумано, после развертывания. Даже незначительные ошибки конфигурации могут привести к дорогостоящему времени простоя, уязвимостям в безопасности или проблемам с производительностью.
Традиционные методы тестирования — такие как ручная проверка ресурсов или полагание только на статический анализ кода — не обеспечивают достаточной уверенности для производственных сред. Существует настоятельная необходимость в автоматизированном, надежном способе валидации AWS инфраструктуры перед ее запуском.
Решение
Terratest предоставляет автоматизированную тестовую платформу, написанную на Go, специально предназначенную для тестирования кода инфраструктуры в реальных облачных средах, таких как AWS. Программно развертывая, проверяя и уничтожая ресурсы, Terratest заполняет пробел между написанием IaC (например, Terraform) и уверенной отправкой изменений. Вот как это работает:
Ниже представлен подробный гид о том, как достичь тестирования инфраструктуры AWS с использованием Terratest и Terraform, а также образцы кода на Go. Этот рабочий процесс поможет вам предоставить ресурсы AWS, провести тесты на их соответствие требованиям и затем автоматически удалить все.
Предварительные требования
Установите Terraform
Скачайте и установите Terraform с официального сайта.
Установите Go
Terratest написан на Go, поэтому вам нужно установить Go. Скачайте Go с официального сайта.
Настройте учетные данные AWS
Убедитесь, что ваши учетные данные AWS настроены (например, через ~/.aws/credentials или переменные окружения, такие как AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
).
Инициализируйте модуль Go
В каталоге вашего проекта выполните:
go mod init github.com/yourusername/yourproject
go mod tidy
Добавьте Terratest в ваш go.mod
В каталоге вашего проекта/репозитория выполните:
go get github.com/gruntwork-io/terratest/modules/terraform
go get github.com/stretchr/testify/assert
Пример конфигурации Terraform
Создайте простую конфигурацию Terraform, которая запускает экземпляр AWS EC2. Положите следующие файлы в каталог с именем aws_ec2_example (или любое другое имя, которое вам нравится).
Сохраните его как main.tf для справки.
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
}
Далее, 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
Создайте файл теста Go в каталоге с именем test (или вы можете назвать его как угодно, но test является обычным названием). Например, 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")
}
Что делает этот тест
- Инициализирует и применяет конфигурацию Terraform в
../aws_ec2_exampl
e. - Разворачивает экземпляр EC2 с указанным AMI в us-east-1.
- Получает вывод Terraform
instance_id
. - Проверяет, что идентификатор экземпляра не пустой, используя библиотеку утверждений Testify.
- Уничтожает ресурсы в конце теста, чтобы избежать постоянных затрат.
Запуск тестов
- Перейдите в каталог, содержащий ваш Go тестовый файл (например, каталог тестов).
- Выполните следующую команду:
go test -v
- Обратите внимание на вывод:
- Вы увидите, как Terraform инициализирует и применяет вашу инфраструктуру AWS.
- После успешного прохождения проверок теста Terraform уничтожит ресурсы.
Заключение
Следуя этим шагам, вы можете интегрировать Terratest в ваш рабочий процесс IaC AWS, чтобы:
- Предоставлять ресурсы AWS с помощью Terraform.
- Тестировать их программно с помощью тестов на Go.
- Подтверждать, что ваша инфраструктура правильно настроена и функционирует как ожидается.
- Автоматически отключайте, чтобы не нести ненужные расходы на AWS и поддерживать чистую среду для повторных тестов.