AWS에서 코드로서의 인프라(IaC)를 채택하는 조직들은 인프라가 올바르게 프로비저닝될 뿐만 아니라 배포 후 의도한 대로 기능하는지를 보장하는 데 종종 어려움을 겪습니다. 사소한 잘못된 구성도 비용이 많이 드는 다운타임, 보안 취약점 또는 성능 문제로 이어질 수 있습니다.
전통적인 테스트 방법 — 예를 들어 자원을 수동으로 검사하거나 정적 코드 분석에만 의존하는 것 — 은 프로덕션 환경에 대해 충분한 신뢰를 제공하지 않습니다. 라이브로 전환하기 전에 AWS 인프라 변경 사항을 검증할 수 있는 자동화되고 신뢰할 수 있는 방법이 절실히 필요합니다.
해결책
Terratest는 Go로 작성된 자동화된 테스트 프레임워크로, AWS와 같은 실제 클라우드 환경에서 인프라 코드를 테스트하기 위해 특별히 설계되었습니다. Terratest는 자원을 프로그래밍 방식으로 배포, 검증 및 파괴함으로써 IaC 작성(예: Terraform)과 변경 사항을 자신 있게 배포하는 것 사이의 간극을 메웁니다. 작동 방식은 다음과 같습니다:
아래는 Terraform을 사용하여 Terratest로 AWS 인프라 테스트를 수행하는 방법에 대한 자세한 가이드와 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 구성 예시
AWS EC2 인스턴스를 시작하는 간단한 Terraform 구성을 만듭니다. 다음 파일들을 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 테스트 파일을 생성합니다(다른 이름으로 지정할 수 있지만, 테스트가 일반적입니다). 예를 들어, 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")
}
이 테스트가 하는 일
- 초기화하고 적용 ../aws_ec2_exampl에 있는 Terraform 구성.
- 지정된 AMI로 us-east-1에 EC2 인스턴스를 배포합니다.
- instance_id Terraform 출력을
캡처
합니다. - Testify의 assert 라이브러리를 사용하여 인스턴스 ID가 비어 있지 않음을 확인합니다.
- 테스트가 끝날 때 자원을 파괴하여 계속되는 비용을 방지합니다.
테스트 실행
- Go 테스트 파일이 있는 디렉토리(예: 테스트 디렉토리)로 이동합니다.
- 다음 명령을 실행합니다:
go test -v
- 출력을 관찰합니다:
- Terraform이 AWS 인프라를 초기화하고 적용하는 것을 볼 수 있습니다.
- 테스트 어설션을 통과한 후에 Terraform이 리소스를 파괴할 것입니다.
결론
이러한 단계를 따르면 AWS IaC 워크플로에 Terratest를 통합하여 다음을 수행할 수 있습니다:
- Terraform을 사용하여 AWS 리소스를 프로비저닝합니다.
- Go 기반 테스트로 프로그래밍 방식으로 테스트합니다.
- 인프라가 올바르게 구성되어 기대대로 작동하는지 검증합니다.
- 자동으로 해체, 불필요한 AWS 비용을 발생시키지 않고 반복 테스트 실행을 위한 깨끗한 환경을 유지하십시오.