Terraform을 처음 접하면 가장 헷갈리는 개념 중 하나가 변수(Variable)의 흐름과 참조 구조입니다.
특히 모듈화(Modularization) 와 환경별 디렉토리(dev/qa 등) 분리를 할 때는
"이 변수는 어디서 오는 거지?" 하는 의문이 자주 생기죠.
이번 글에서는 하나의 환경(dev)을 기준으로, 모듈 구조에서 변수는 어떻게 정의되고,
어디서 값이 전달되며, 서로 어떤 관계를 맺고 있는지 예시와 함께 깔끔하게 정리해보겠습니다.
📁 디렉토리 구조
우선 아래와 같은 구조로 구성되어 있다고 가정합니다:
terraform-dev-only/
├── env/
│ ├── main.tf
│ ├── variables.tf
│ └── terraform.tfvars
└── modules/
└── ec2/
├── main.tf
├── variables.tf
└── outputs.tf
🧱 1. env/main.tf: 모듈 호출 및 값 전달
provider "aws" {
region = "ap-northeast-2"
}
module "ec2" {
source = "../modules/ec2"
ami_id = var.ami_id
instance_type = var.instance_type
name = "ec2-dev"
env = "dev"
}
여기서 중요한 포인트는 다음과 같습니다:
- ami_id와 instance_type는 외부로부터 입력 받음 (terraform.tfvars)
- name과 env는 문자열로 직접 지정 ("하드코딩")
📥 2. env/variables.tf: 환경 내에서 사용할 변수 선언
variable "ami_id" {
type = string
}
variable "instance_type" {
type = string
}
이 파일은 Terraform이 main.tf를 실행할 때 어떤 값들이 필요한지 알려주는 선언부입니다.
📦 3. env/terraform.tfvars: 실제 값 주입
ami_id = "ami-0f3c7d07486cad139"
instance_type = "t2.micro"
terraform apply -var-file="terraform.tfvars" 명령으로 실행 시,
여기 정의된 값들이 variables.tf에 선언된 변수에 바인딩됩니다.
🧩 4. modules/ec2/ 내부 구조
modules/ec2/main.tf
resource "aws_instance" "this" {
ami = var.ami_id
instance_type = var.instance_type
tags = {
Name = var.name
Env = var.env
}
}
여기에서 사용된 var.name, var.env, var.ami_id 등은 모듈 외부(env/main.tf)에서 전달된 값을 참조합니다.
modules/ec2/variables.tf
variable "ami_id" { type = string }
variable "instance_type" { type = string }
variable "name" { type = string }
variable "env" { type = string }
모듈 안에서 어떤 값들을 받아야 하는지 정의한 부분입니다.
즉, 이 모듈을 쓸 때는 이 4개 값은 반드시 줘야 해라는 규칙을 명시하는 곳입니다.
❓ 헷갈리는 질문 정리
Q. modules/ec2/main.tf에서 사용하는 var.name은 terraform.tfvars에 없는데 왜 오류가 없나요?
👉 이유는 간단합니다:
module "ec2" {
...
name = "ec2-dev" # ← 여기서 직접 전달하고 있음!
}
terraform.tfvars는 변수 값 주입의 한 방법일 뿐이고,
main.tf에서 직접 문자열로 값을 주는 것도 완전히 OK입니다.
🔄 변수 흐름 정리
terraform.tfvars ──▶ env/variables.tf ──▶ env/main.tf ──▶ modules/ec2/variables.tf ──▶ modules/ec2/main.tf
(값 선언) (값 전달) (값 받기) (값 사용)
✅ 마무리 정리
terraform.tfvars | 변수들의 실제 값 저장 |
variables.tf | 필요한 변수들의 선언 |
main.tf (env) | 모듈 호출 + 변수 전달 |
main.tf (module) | 리소스 정의 및 변수 사용 |
variables.tf (module) | 모듈이 받을 변수 정의 |
outputs.tf (module) | 모듈이 바깥으로 알려줄 값 설정 |
'Tech > AWS' 카테고리의 다른 글
AWS CLI로 생성 되어 있는 EC2 인스턴스에 Private IP 태그 자동 추가하는 방법 (실습 스크립트 포함) (0) | 2025.03.24 |
---|---|
EC2 인스턴스 생성 시 Private IP 자동 태그 추가하는 방법 (EventBridge + Lambda 자동화) (0) | 2025.03.22 |
AWS Resource Explorer를 활용한 AWS 리소스 검색 및 태그 정보 수집 (0) | 2025.03.22 |