개요
- 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 |