본문 바로가기
Tech/AWS

🎯 Terraform 변수 참조 구조 제대로 이해하기 (모듈 + 환경 구성 예시 기반)

by daelolo 2025. 4. 3.
반응형

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) 모듈이 바깥으로 알려줄 값 설정
반응형