테라폼 프로젝트를 시작할 때, 깔끔하고 일관된 디렉토리 구조를 가지고 시작하는 것은 중요합니다. 특히 프로젝트 규모가 커질수록 디렉토리 구조의 중요성은 커집니다. 이 포스팅에서는 테라폼 워크스페이스의 표준 디렉토리 구조와 그 설명을 공유합니다.
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 파일만 교체하여 동일한 테라폼 코드를 다양한 환경에 적용할 수 있게 됩니다.
'IaC > Terraform' 카테고리의 다른 글
[Terraform]파일(file, templatefile)을 활용한 리소스 구성하기 (0) | 2023.12.10 |
---|---|
[Terraform]Userdata와 Provisioner 이해하기 (0) | 2023.10.15 |
[Terraform]다른 워크스페이스의 정보 가져오기 - terraform_remote_state 사용법 (0) | 2023.09.03 |
[Terraform]리소스 강제 교체하기: taint와 untaint 사용법 (0) | 2023.09.01 |
[Terraform]상태(state) 관리 명령어 사용 방법 (0) | 2023.08.27 |