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와 보안 그룹을 직접 조립하고 환경별로 호출하는 실습은 클라우드 트랙에서 회원가입 없이 무료로 할 수 있습니다.