본문 바로가기

IaC/Terraform

[Terraform]워크스페이스 디렉토리 구성 전략

테라폼 프로젝트를 시작할 때, 깔끔하고 일관된 디렉토리 구조를 가지고 시작하는 것은 중요합니다. 특히 프로젝트 규모가 커질수록 디렉토리 구조의 중요성은 커집니다. 이 포스팅에서는 테라폼 워크스페이스의 표준 디렉토리 구조와 그 설명을 공유합니다.

Convention

기본적으로 다음과 같은 파일들을 포함하는 것이 좋습니다:

versions.tf - 테라폼과 프로바이더의 버전을 지정

variables.tf - 이 워크스페이스에서 사용할 변수들을 선언

terraform.tf- 워크스페이스 설정, 백엔드 설정 및 프로바이더 설정

terraform.auto.tfvars - 자동 로딩되는 변수 값들 지정

remote-states.tf - 멀티 워크스페이스 간 의존성 관리를 위한 설정

outputs.tf - 이 워크스페이스의 결과물을 정의

aws resources.tf - AWS 리소스들을 정의 (e.g. ec2.tf, eks.tf)

.terraform-version - 해당 워크스페이스에서 사용할 테라폼 버전 지정

config.yaml - 특정 환경 설정 값을 저장

이 구조를 따르면 테라폼 프로젝트가 깔끔하고 유지보수하기 쉬워집니다. 각 파일의 책임이 명확하기 때문에 변경이 필요할 때 어디를 수정해야 할지 쉽게 알 수 있습니다.

각 파일의 상세 설명

versions.tf

이 파일은 테라폼과 프로바이더의 버전을 지정합니다. 특히 프로젝트가 사용하는 테라폼 및 프로바이더의 호환성을 보장하기 위해 이러한 버전 지정이 필요합니다.

terraform {
  required_version = "~> 1.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

위의 코드는 테라폼 버전 1.0과 AWS 프로바이더 버전 3.0을 필요로 합니다.

variables.tf

이 파일에서는 워크스페이스에서 사용할 모든 변수들을 선언합니다.

variable "region" {
  description = "AWS region to deploy the resources"
  type        = string
  default     = "ap-northeast-2"
}

terraform.tf

워크스페이스의 기본 설정, 백엔드 설정, 그리고 프로바이더 설정을 정의합니다.

terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "path/to/my/key"
    region = "ap-northeast-2"
  }
}

provider "aws" {
  region = var.region
}

terraform.auto.tfvars

이 파일은 자동으로 로딩되는 변수 값들을 포함하고 있습니다. 주로 민감하지 않은 기본값이나 로컬에서만 사용되는 값들을 지정하는 데 사용됩니다.

region = "ap-northeast-2"

remote-states.tf

멀티 워크스페이스 환경에서 다른 워크스페이스의 상태 정보에 액세스할 수 있도록 설정합니다.

data "terraform_remote_state" "vpc" {
  backend = "s3"
  config = {
    bucket = "my-terraform-state"
    key    = "path/to/vpc/key"
    region = "ap-northeast-2"
  }
}

outputs.tf

워크스페이스에서 생성한 리소스의 특정 정보를 출력값으로 내보내려면 이 파일에서 정의합니다.

output "bucket_arn" {
  value = aws_s3_bucket.my_bucket.arn
  description = "ARN of the created S3 bucket"
}

aws resources.tf

AWS와 같은 클라우드 프로바이더의 리소스를 정의하는 데 사용됩니다. 각 리소스 유형에 따라 여러 파일로 분할될 수 있습니다. (예: ec2.tf, eks.tf 등).

resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-tf-test-bucket"
  acl    = "private"
}

.terraform-version

.terraform-version 파일은 특정 워크스페이스(또는 프로젝트)에서 사용하고자 하는 테라폼의 버전을 지정하는 데 사용됩니다.

이 파일은 tfswitch라는 도구와 함께 사용되며, 이 도구는 특정 디렉토리에 있는 .terraform-version 파일을 감지하고 해당 버전의 테라폼을 자동으로 선택하도록 해줍니다.

# .terraform-version 작성 예시
0.14.7

tfswitch 설치

먼저, tfswitch를 설치해야 합니다. 설치 방법은 공식 홈페이지를 참고하면 됩니다.

.terraform-version 파일 작성

프로젝트 루트 디렉토리에 .terraform-version 파일을 생성하고 원하는 테라폼 버전을 지정합니다.

tfswitch 사용

터미널을 열고 프로젝트 디렉토리로 이동한 후, tfswitch 명령어를 실행합니다. 그러면 tfswitch.terraform-version 파일의 내용을 감지하고 해당 버전의 테라폼을 자동으로 선택합니다.

$ tfswitch
Switched terraform to version "0.14.7"

이렇게 설정하면 해당 워크스페이스 또는 프로젝트에서는 지정된 버전의 테라폼을 사용하게 됩니다. 여러 프로젝트나 워크스페이스 간에 다양한 테라폼 버전을 사용할 때 유용하게 활용할 수 있습니다.

config.yaml

이 파일은 특정 환경(개발, 스테이징, 프로덕션 등)에 대한 설정 값을 저장합니다. 예를 들어, AWS에서 사용될 region, 사용할 서비스의 사이즈, 환경명 등의 설정을 이 파일에 정의할 수 있습니다.

env: "development"
region: "us-west-1"
size: "small"

variables.tf 내에서 config.yaml 파일을 읽어 설정을 사용하는 방법을 살펴보겠습니다.

variables.tf

variable "config" {
  description = "Configuration from config.yaml"
  type        = any
  default     = {}
}

locals {
  config_data = yamldecode(file("config.yaml"))
}

위와 같이 local 변수 config_data를 통해 config.yaml 파일을 읽어들여서 테라폼 내에서 사용할 수 있습니다.

예를 들어, AWS의 region을 설정하려면 aws resources.tf 내에서 아래와 같이 사용할 수 있습니다:

aws resources.tf

provider "aws" {
  region = local.config_data.region
}

이렇게 config.yaml 파일을 통해 설정 값들을 중앙화하면, 환경별로 다른 config.yaml 파일만 교체하여 동일한 테라폼 코드를 다양한 환경에 적용할 수 있게 됩니다.