본문으로 건너뛰기

1. Terraform Block 소개

  • Terraform Block은 Terraform의 핵심 설정을 정의하는 configuration 블록입니다.
  • 이 블록을 통해 Terraform 버전, 필요한 프로바이더, 백엔드 설정, HCP Terraform 연동 등 Terraform의 기본 동작을 구성할 수 있습니다.
정보

Terraform Block 내에서는 상수 값만 사용할 수 있습니다. 리소스나 변수 참조, 내장 함수 사용이 불가능합니다.

2. 주요 설정 옵션

2.1 required_version

  • Terraform CLI 버전을 제한하는 설정입니다.
  • 협업 환경에서 일관된 Terraform 버전 사용을 강제할 때 유용합니다.
경고

required_version은 Terraform CLI 버전만 제한하며, 프로바이더 플러그인 버전은 제한하지 않습니다.

예시

terraform {
required_version = ">= 1.0.0"
}

2.2 required_providers

  • 프로바이더 플러그인 요구사항을 정의합니다.
  • 소스 주소와 버전 제약조건을 지정할 수 있습니다.

AWS 프로바이더 설정 예시

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 2.7.0"
}
}
}

2.3 backend

  • Terraform은 인프라의 현재 상태를 .tfstate 파일에 저장합니다.
  • 이 상태 파일을 저장하고 관리하는 방식으로 backend와 cloud 두 가지 옵션을 제공합니다.
  • backend는 상태 파일을 저장할 위치와 방식을 지정합니다.
  • 일반적으로 팀 협업 시 원격 저장소를 사용합니다.
  • 주요 백엔드 유형
    • local: 로컬 파일시스템 (기본값)
    • s3: AWS S3 버킷
    • azurerm: Azure Storage Account
    • gcs: Google Cloud Storage
    • http: HTTP 엔드포인트

backend 블록과 cloud 블록은 동시에 사용할 수 없습니다. 둘 중 하나만 선택해야 합니다.

3. HCP Terraform 연동

3.1 cloud 블록 설정

  • HCP Terraform 또는 Terraform Enterprise와의 연동을 위한 설정 블록입니다.
  • cloud는 HCP(HashiCorp Cloud Platform) Terraform 또는 Terraform Enterprise와의 통합을 제공합니다.
  • 단순한 상태 파일 저장을 넘어 다음과 같은 추가 기능을 제공합니다
    • 상태 파일 버전 관리
    • 동시성 제어
    • 실행 히스토리 관리
    • 정책 관리 (Policy as Code)
    • 팀 협업 기능
    • 웹 UI를 통한 관리

backend와 cloud는 상호 배타적입니다. 둘 중 하나만 선택해야 하며, 일반적으로:

단순한 상태 파일 저장만 필요하다면 → backend 사용 팀 협업과 고급 관리 기능이 필요하다면 → cloud 사용

기본 구성 예시

terraform {
cloud {
organization = "example_corp"
workspaces {
tags = {
layer = "app"
}
}
}
}

3.2 환경 변수 활용

  • cloud 블록 설정은 환경 변수를 통해 유연하게 구성할 수 있습니다.
정보

주요 환경 변수:

  • TF_CLOUD_ORGANIZATION: 조직 이름
  • TF_CLOUD_HOSTNAME: Terraform Enterprise 호스트명
  • TF_CLOUD_PROJECT: 프로젝트 이름
  • TF_WORKSPACE: 워크스페이스 이름

4. 실전 활용 예제

4.1 멀티 프로바이더 설정

  • 여러 클라우드 프로바이더를 동시에 사용하는 경우의 설정 예시입니다.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 4.0.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = ">= 3.0.0"
}
}
required_version = ">= 1.0.0"
}

4.2 Terraform Enterprise 연동

  • 사내 Terraform Enterprise 환경과 연동하는 설정 예시입니다.
terraform {
cloud {
organization = "example_corp"
hostname = "terraform.example.com"
workspaces {
tags = ["production", "webapp"]
}
}
}

5. 모범 사례와 주의사항

5.1 버전 관리

  • 항상 required_version을 명시하여 버전 호환성 문제를 예방
  • 프로바이더 버전은 가능한 한 구체적으로 지정
  • 메이저 버전 업데이트는 신중하게 진행

5.2 워크스페이스 관리

  • 태그를 활용한 체계적인 워크스페이스 구성
  • 프로젝트별, 환경별 명확한 구분
  • 적절한 접근 권한 설정
경고

cloud 블록 내에서는 변수나 데이터 소스를 참조할 수 없습니다. 모든 값은 상수여야 합니다.

6. 마치며

  • Terraform Block은 인프라스트럭처 코드의 기초가 되는 중요한 설정입니다.
  • 적절한 설정을 통해 안정적이고 관리하기 쉬운 인프라스트럭처 코드를 작성할 수 있습니다.