1. Terraform 프로젝트 이해하기
1.1 프로젝트란?
- Terraform 프로젝트는 인프라를 코드로 정의하는 파일들의 집합입니다.
- 마치 웹 개발 프로젝트가 HTML, CSS, JavaScript 파일로 구성되듯이, Terraform 프로젝트는 여러
.tf파일들로 구성됩니다.
1.2 기본 디렉토리 구조
my-terraform-project/
├── main.tf # 주요 리소스 정의
├── variables.tf # 변수 선언
├── terraform.tfvars # 변수 값 정의
├── outputs.tf # 출력값 정의
├── providers.tf # 프로바이더 설 정
└── versions.tf # 버전 제약 조건
- 각 파일의 역할:
main.tf: 실제로 생성할 인프라 자원을 정의하는 메인 파일variables.tf: 프로젝트에서 사용할 변수들을 선언terraform.tfvars: 선언된 변수들의 실제 값을 지정outputs.tf: 인프라 생성 후 필요한 값들을 출력하도록 정의providers.tf: AWS, Azure 등 사용할 클라우드 공급자 설정versions.tf: Terraform과 프로바이더의 버전 관리
2. 변수 시스템 이해하기
2.1 변수가 필요한 이유
예를 들어 EC2 인스턴스를 생성하는 코드를 봅시다:
# 변수 사용 없이 직접 값을 입력한 경우
resource "aws_instance" "server" {
ami = "ami-1234567890"
instance_type = "t2.micro"
tags = {
Name = "production-server"
}
}
이 코드의 문제점:
- 개발 환경과 운영 환경에서 다른 인스턴스 타입을 사용하고 싶다면?
- 다른 리전에서 다른 AMI ID를 사용해야 한다면?
- 여러 곳에서 같은 값을 반복해서 사용한다면?
이러한 문제를 해결하기 위해 변수 시스템을 사용합니다.
2.2 변수 정의하기 (variables.tf)
# variables.tf
variable "instance_type" {
description = "EC2 인스턴스 타입"
type = string
default = "t2.micro" # 기본값 설정
}
variable "environment" {
description = "배포 환경 (dev/prod)"
type = string
}
variable "server_settings" {
description = "서버 설정 값"
type = object({
name = string
ami = string
tags = map(string)
})
}
각 구성 요소 설명:
description: 변수에 대한 설명 (문서화)type: 변수의 데이터 타입 (string, number, bool 등)default: 기본값 (선택사항)
2.3 변수 값 정의하기 (terraform.tfvars)
# terraform.tfvars
instance_type = "t3.micro"
environment = "prod"
server_settings = {
name = "web-server"
ami = "ami-1234567890"
tags = {
Department = "Engineering"
Owner = "DevOps Team"
}
}
팁
terraform.tfvars는 variables.tf에서 선언한 변수들의 실제 값을 지정하는 파일입니다. 이렇게 분리함으로써:
- 민감한 정보를 별도 관리할 수 있습니다.
- 환경별로 다른 값을 쉽게 적용할 수 있습니다.
- 변수 선언과 값을 분리하여 코드를 더 깔끔하게 관리할 수 있습니다.
2.4 변수 사용하기 (main.tf)
# main.tf
resource "aws_instance" "server" {
ami = var.server_settings.ami
instance_type = var.instance_type
tags = merge(
var.server_settings.tags,
{
Environment = var.environment
Name = var.server_settings.name
}
)
}