왜 모든 Terraform 모듈에 적절한 검증이 필요할까

발행: (2026년 3월 5일 오후 08:01 GMT+9)
4 분 소요
원문: Dev.to

Source: Dev.to

Terraform 모듈을 배포했는데 누군가가 공개 서브넷이어야 할 곳에 사설 서브넷 ID를 전달한 경우를 겪어본 적이 있다면 그 고통을 잘 아실 겁니다. 배포는 성공하지만 아무 것도 동작하지 않습니다. 몇 분 동안 디버깅을 하다 보니 입력값 자체가 처음부터 잘못됐다는 것을 깨닫게 됩니다.

Terraform는 내장된 검증 기능을 제공하지만, 대부분의 사람들은 이를 사용하지 않습니다.

문제 설명

단순한 NAT Gateway 모듈은 다음과 같이 보일 수 있습니다:

variable "subnet_id" {
  description = "Subnet to place the NAT Gateway in"
  type        = string
}

resource "aws_nat_gateway" "this" {
  allocation_id = aws_eip.this.id
  subnet_id     = var.subnet_id
}
  • 이는 공개, 사설 혹은 오타가 있는 서브넷 ID든 상관없이 모두 허용합니다.
  • Terraform과 AWS는 즉시 불평하지 않습니다.
  • 결과: 인터넷 접근이 없는 사설 서브넷과 많은 시간 낭비가 발생합니다.

변수 검증 추가

Terraform 1.0부터 변수에 validation 블록을 추가할 수 있습니다:

variable "public_subnet_ids" {
  description = "Public subnet IDs for NAT Gateway placement"
  type        = list(string)

  validation {
    condition     = length(var.public_subnet_ids) > 0
    error_message = "At least one public subnet ID is required."
  }

  validation {
    condition     = alltrue([for id in var.public_subnet_ids : startswith(id, "subnet-")])
    error_message = "All values must be valid subnet IDs (starting with 'subnet-')."
  }
}

이제 누군가 빈 리스트나 형식이 잘못된 ID를 전달하면 terraform plan이 즉시 명확한 메시지와 함께 실패합니다.

리소스에서 전제조건 사용

변수 간 관계를 검증해야 할 때는 리소스의 lifecycle 안에 precondition 블록을 사용합니다:

resource "aws_nat_gateway" "this" {
  count = var.single_nat_gateway ? 1 : length(var.public_subnet_ids)

  allocation_id = aws_eip.this[count.index].id
  subnet_id     = var.public_subnet_ids[count.index]

  lifecycle {
    precondition {
      condition     = var.single_nat_gateway || length(var.public_subnet_ids) >= length(var.private_route_table_ids)
      error_message = "When using multi‑AZ NAT, you need at least as many public subnets as private route tables."
    }
  }
}

이렇게 하면 플랜 단계에서 아키텍처상의 실수를 잡아낼 수 있어, 오래 걸리는 적용 후에 문제를 발견하는 일을 방지합니다.

검증 체크리스트

검증 항목이유
비어 있지 않은 필수 리스트조용히 무시되는 작업을 방지
ID 형식 (subnet-, vpc-, sg-)복사‑붙여넣기 오류를 잡아냄
CIDR 블록 형식네트워크 입력에 대한 정규식 검증
상호 배타적인 플래그예: single_nat_gateway vs AZ당 모드
변수 간 일관성리소스 블록의 전제조건 사용

추가하는 검증마다 지원 티켓, Slack의 “왜 안 되나요?” 메시지, 그리고 명백한 오설정 디버깅에 소요되는 시간이 줄어듭니다.

결론

이러한 검증은 terraform plan 단계에서 실행되므로 비용도 위험도 없으며 피드백이 빨라집니다. AWS용 Terraform 모듈을 만들고 있다면, Terraform Registry에 있는 HAIT 모듈 컬렉션을 확인해 보세요.

0 조회
Back to Blog

관련 글

더 보기 »

코드의 안개

소개 단일 Terraform 변수에 대한 간단한 질문으로 시작합니다. 곧, 여러분은 수십 개의 브라우저 탭에 걸쳐 구성들을 뒤쫓으며 산재된…