← 아티클 목록

Terraform 모듈로 재사용 가능한 인프라 코드 만들기

2026-12-21#Terraform#IaC#클라우드

dev·staging·prod 환경을 만들 때마다 같은 VPC·서브넷·보안 그룹 코드를 복사해 붙이고 있다면, 한 곳을 고칠 때 세 곳을 똑같이 고쳐야 하는 지옥이 시작된 것입니다. Terraform 모듈은 이렇게 반복되는 리소스 묶음을 하나의 재사용 단위로 만들어, 환경마다 값만 바꿔 호출하게 해 줍니다. 함수에 인자를 넘기듯 인프라를 호출하는 방식입니다.

모듈은 디렉터리 하나일 뿐이다

거창한 개념이 아니라, .tf 파일이 모인 디렉터리가 곧 모듈입니다. 핵심은 세 종류의 파일로 입력·로직·출력을 나누는 것입니다.

파일역할비유
variables.tf외부에서 받는 입력값함수의 매개변수
main.tf실제 리소스 정의함수 본문
outputs.tf다른 모듈에 넘길 결과값함수의 반환값

예를 들어 VPC 모듈을 만들어 두면 환경별 호출은 이렇게 단순해집니다.

HCL
module "vpc" {
  source   = "../modules/vpc"
  cidr     = "10.0.0.0/16"
  az_count = 2
  env      = "prod"
}

source만 같고 cidr·env 값만 바꾸면 dev/prod를 동일한 로직으로 찍어낼 수 있습니다.

변수와 출력을 제대로 설계한다

모듈의 품질은 인터페이스(변수·출력) 설계에서 갈립니다. 변수에는 타입과 기본값, 설명을 명시해 호출자가 추측하지 않게 합니다.

HCL
variable "az_count" {
  type        = number
  default     = 2
  description = "사용할 가용영역 개수"
}

output "vpc_id" {
  value = aws_vpc.this.id
}

VPC 모듈이 vpc_id를 출력하면, 보안 그룹 모듈이 module.vpc.vpc_id로 받아 연결합니다. 이렇게 모듈끼리 출력을 주고받아 조립하는 것이 재사용의 핵심입니다.

흔한 함정

  • 하드코딩 — 리전·계정 ID·이름을 모듈 안에 박으면 재사용이 깨집니다. 전부 변수로 빼냅니다.
  • 너무 큰 모듈 — VPC·DB·EKS를 한 모듈에 넣으면 일부만 쓸 수 없습니다. 책임 단위로 잘게 나눕니다.
  • 버전 미고정 — 외부 레지스트리 모듈은 version = "5.1.0"처럼 고정해야 어느 날 갑자기 동작이 바뀌지 않습니다.
  • count/for_each 혼동 — 리소스가 늘었다 줄었다 할 땐 count보다 for_each가 인덱스 이동으로 인한 재생성을 막아 줍니다.

요점 정리

  • 모듈은 .tf가 모인 디렉터리이며, variables(입력)·main(로직)·outputs(출력)로 인터페이스를 나눈다.
  • 환경 차이는 모듈을 복사하지 말고 변수 값으로 흡수한다.
  • 하드코딩 제거·책임 단위 분리·버전 고정이 재사용 가능한 모듈의 3원칙이다.

Terraform 모듈로 VPC와 보안 그룹을 직접 조립하고 환경별로 호출하는 실습은 클라우드 트랙에서 회원가입 없이 무료로 할 수 있습니다.