IaC/Terraform

[IaC] Terraform(4) - 모듈

vincent77 2025. 9. 25. 16:18

개요

  • Terraform 코드의 재사용성과 관리 용이성의 핵심이 되는기능
  • 여러 개 리소스 블록을 하나의 논리적인 단위로 묶어 다른 Terraform 구성에서 재사용할 수 있도록 함
  • 함수나 라이버리와 유사한 개념

개념 및 장점

개념

하나이상의 .tf 파일을 포함하는 디렉토리. 루트 모듈(terraform init이 실행되는 최상위 디렉터리)은 물론, 이 루트 모듈이 호출하는 다른 모듈도 존재할 수 있음. 각 모듈은 자체적인 입력 변수, 리소스, 출력 값등을 가질 수 있음

장점

  • 재사용성 : 동일한 인프라 패턴 (ex : VPC, 웹 서버 스택)을 여러 프로젝트나 환경에서 반복적으로 사용할 수 있음. 코드를 복붙할 필요없이 모듈을 호출하기만 하면 됨
  • 추상화: 복잡한 인프라 구성을 단순화된 인터페이스로 추상화하여, 사용하는 사람이 모듈 내부의 세부 구현을 몰라도 쉽게 사용할 수 있게 함
  • 표준화: 조직 내 특정 인프라 구성을 표준화된 모듈로 만들어 팀 전체가 일관된 방식으로 인프라를 배포하도록 강제할 수 있음
  • 관리 용이성: 코드가 작고 논리적인 단위로 분리되어있어 유지보수가 훨씬 쉬워짐. 버그 수정이나 기능 추가시 해당 모듈만 변경하면 되므로 전체 코드에 미치는 영향 줄일 수 있음

로컬 모듈 생성 및 사용

같은 Terraform 프로젝트 내에서 서브디렉터리에 모듈을 정의하고 사용하는 방식. 소규모 프로젝트나 특정 패턴 재사용시 유용

## 예시 구조
my-project/
├---- main.tf (루트 모듈)
└---- modules/
  └---- webserver/
    ├---- main.tf
    ├---- variables.tf
    └---- output.tf

#modules/webserver/main.tf
resource "aws_instance" "app" {
	ami           = var.ami_id
	instance_type = var.instance_type
	key_name      = var.key_pair_name
	tags = {
		Name = "${var.project_name}-${var.environment}-webserver"
	}
}

#modules/webserver/varibales.tf
variable "ami_id" { type = string}
variable "instance_type" { type = string}
variable "project_name" { type = string}
variable "environment" { type = string}

#modules/webserver/output.tf
output "instance_id" {
	value = aws_instance.app.id
}
output "public_ip" {
	value = aws_instance.app.public_ip
}

#myproject/main.tf
provider "aws" {
	region = "ap-northeast-2"
}

module "dev_webserver" {
	source        = "./modules/webserver"
	amd_id        = "ami-0eb26f391850125a1"
	instance_type = "t2.micro"
	key_pair_name = "my-dev-key"
	project_name  = "MyProject"
	environment   = "dev"
}

module "prod_webserver" {
	source        = "./modules/webserver"
	amd_id        = "ami-0eb26f391850125a1"
	instance_type = "t3.medium"
	key_pair_name = "my-prod-key"
	project_name  = "MyProject"
	environment   = "prod"
}

output "dev_webserver_ip" {
	value = module.dev_weebserver.public_ip
}

output "prod_webserver_ip" {
	value = module.prod_webserver.public_ip
}

공개/비공개 레지스트리 모듈

Terraform Registry는 HashiCorp 및 커뮤니티에서 제공하는 공개 모듈을 호스팅하는 곳

Git repository나 S3 버킷 등 당양한 소스에서 모듈 가져오기 가능

  • 예시
    • terraform init을 실행하면 terraform registry에서 해당 모듈을 다운로드하여 .terraform/modules 디렉터리에 저장
#main.tf (AWS VPC 모듈)
#<https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest> 확인

provider "aws" {
	region = "ap-northeast-2"
}

module "vpc" {
	source  = "terraform-aws-modules/vpc/aws"
	version = "5.0.0"
	
	name = "my-project-vpc"
	cidr = "10.0.0.0/16"
	
	azs             = ["ap-northeast-2a", "ap-northeast-2b"]
	public_subnets  = ["10.0.1.0/24", "10.0.2.0/24"]
	private_subnets = ["10.0.11.0/24", "10.0.12.0/24"]
	
	enable_nat_gateway = true
	single_nat_gateway = true
}

output "vpc_id" {
	value = module.vpc.vpc_id
}

output "public_subnet_ids" {
	value = module.vpc.public_subnets
}

모듈 입력 변수 및 출력 값 관리

입력 변수

모듈 자신의 variables.tf 파일에 정의된 변수를 통해 외부(호출하는 루트모듈 또는 상위모듈)로부터 값을 전달받음. module 블록 내에서 변수명 = 값 형식으로 값을 지정

출력 값

모듈은 자신의 outputs.tf 파일에 저으이된 값을 외부로 내보낼 수 있음. 호출하는 모듈에서는 module.모듈이름.출력값_이름 형식으로 출력 값 참조

'IaC > Terraform' 카테고리의 다른 글

[IaC] Terraform(6) - 워크스페이스  (0) 2025.09.25
[IaC] Terraform(5) - 상태관리  (0) 2025.09.25
[IaC] Terraform(3) - HCL  (0) 2025.09.25
[IaC] Terraform(2) - 설치 및 기본 사용법  (1) 2025.09.15
[IaC] Terraform(1) - 개요  (0) 2025.09.15