모듈 재사용

모듈 재사용 (Modules)

개발 환경마다 비슷한 네트워크 구성을 만든다고 생각해 볼게요. 같은 리소스 묶음을 계속 반복해서 쓰다 보면, 하나만 고치면 여러 곳에 일일이 반영해야 하는 번거로움이 생겨요. 이때 여러 리소스를 한데 모아 재사용 가능하게 만든 묶음이 바로 **모듈(module)**이에요. 모듈로 묶어 두면 구성이 표준화되고, 필요한 인프라를 빠르고 예측 가능하게 만들 수 있게 돼요.

모듈은 그냥 "한 그룹의 리소스"예요. Terraform이 함께 관리하는 리소스들의 모음이라 보면 돼요. 자주 반복되는 구성을 모듈로 만들면, 새 환경을 만들 때 같은 코드를 복사·붙여넣기 하는 대신 모듈을 호출하는 것만으로 끝나요.

출처: Modules overview — Terraform 공식 문서

루트 모듈과 자식 모듈

모든 Terraform 워크스페이스는 루트 디렉토리에 설정 파일을 두고 있어요. 이 구성을 **루트 모듈(root module)**이라고 해요. 그리고 module 블록으로 구성하는 모듈은 **자식 모듈(child module)**이라 불러요.

설정을 적용하면 루트 모듈이 자식 모듈을 호출해요. 그 결과 자식 모듈의 리소스들이 워크스페이스에 추가되고, 전체 구성의 일부로 함께 관리돼요. 루트 모듈은 같은 구성 안에서 자식 모듈을 여러 번 호출할 수도 있고, 자식 모듈이 또 다른 중첩 자식 모듈을 호출할 수도 있어요.

모듈 소스

모듈은 여러 소스에서 가져올 수 있어요. 로컬 파일 시스템, Terraform 레지스트리, 버전 관리 시스템(VCS) 저장소가 대표적이에요. 공개 Terraform 레지스트리에는 커뮤니티와 HashiCorp 파트너가 만든 다양한 공용 모듈이 있고, module 블록에 소스와 버전만 적으면 Terraform이 자동으로 내려받아 씁니다. 조직 안에서만 쓰는 사설 레지스트리를 두고 내부 모듈을 공유할 수도 있어요.

모듈 도입 워크플로

모듈을 실제로 쓰는 흐름은 세 단계로 나뉘어요.

  1. 개발(Develop) — 모듈 개발자가 리소스 구성을 한데 모아 모듈로 만들고, 표준 구조와 문서를 갖춰요.
  2. 배포(Distribute) — 모듈을 S3 버킷이나 GitHub 저장소 같은 여러 소스에 게시해요. 가장 흔한 방법은 공개 레지스트리 또는 사설 레지스트리에 올리는 거예요.
  3. 적용(Provision) — 모듈 사용자가 설정 안의 module 블록으로 게시된 모듈을 호출해요.

module 블록은 아래처럼 생겼어요. source로 어디서 가져올지, version으로 어떤 버전을 쓸지 정하고, 그 안에 인자를 넘겨 구성해요.

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.0.0"

  name = "my-vpc"
  cidr = "10.0.0.0/16"
}

이렇게 호출하면 그 모듈이 정의한 VPC 관련 리소스들이 전부 만들어져요. 같은 모듈을 다른 이름(module "vpc-dev"처럼)으로 여러 번 호출하면 각각 독립된 리소스 묶음이 생기죠. 모듈이 "한 벌의 구성"을 캡슐화해서 재사용하는 단위라는 게 이 그림에서 바로 와닿아요.

더 알아보기