Terraform/Terratest UnitTest

Terraform/Terratest Guidebook
이민석's avatar
Jun 18, 2024
Terraform/Terratest UnitTest

이 문서는 Terraform을 테스트하기 위한 라이브러리인 Terratest 사용 가이드 북입니다.

Terratest란?

Terratest는 GruntIO라는 회사에서 만들고 유지 보수 중인 오픈소스 라이브러리입니다.

Terraform과 동일하게 Golang 기반으로 작성되어 있어서 Terraform에 대한 디테일한 테스트 코드를 작성할 수 있습니다.

  1. Unit Test

  2. Integration Test

  3. E2E Test

실습 준비

실습을 위해서 아래의 파일들을 지정된 경로에 준비해주세요.

~terraform/s3/bucket/main.tf

resource "aws_s3_bucket" "resource" {
  bucket = var.bucket

}

~terraform/s3/bucket/variables.tf

variable "bucket" {
   type = string
   description = "AWS S3 Bucket Name"
}

Unit Test / Init + Validate 테스트

실습 파일이 준비되었다면 AWS S3 버킷을 만드는 간단한 코드에 대한 UnitTest를 작성할 것입니다. 이 UnitTest의 목적은 Unit 단위의 문법 오류를 검사하는 데에 있습니다.

~terratest/s3/bucket/s3_bucket_test.go

package test

import (
	"testing"
	"github.com/gruntwork-io/terratest/modules/terraform"
)

func TestAWSS3BucketValidate(t *testing.T) {
   tfOptions := &terraform.Options{
      TerraformDir: "../../terraform/s3/bucket"
   }
   terraform.InitAndValidate(t, tfOptions)
}

주의할 점은 같은 tfOptions를 사용할 경우,
terraform.InitAndValidate와 terrafrom.destroy는 호환되지 않는다는 점입니다.

만약 습관적으로 defer terraform.destroy를 사용할 경우,
-var-file과 관련한 딜레마에 빠지게 됩니다.

  1. terraform validate에서는 -var-file을 지원하지 않습니다.

  2. terraform destroy에서는 -var-file이 지원되며, 선언된 variable가 있다면 변수 전달이 필요합니다.

package test

import (
	"testing"
	"github.com/gruntwork-io/terratest/modules/terraform"
)

func TestAWSS3BucketValidate(t *testing.T) {
   tfOptions := &terraform.Options{
      TerraformDir: "../../terraform/s3/bucket"
   }
   defer terraform.Destroy(t, tfOptions)
   terraform.InitAndValidate(t, tfOptions)
}

위 1,2 번 상황이 겹치게 되어서,
terraform.tfvars파일을 전달하면 terraform.InitAndValidate에서 에러가 발생합니다.
전달하지 않는다면 terraform.Destroy에서 에러가 발생합니다.

Share article
RSSPowered by inblog