Ssoon

Chapter (03) 기본 사용법 - HCL - 블록 본문

Terraform 101 Study 2기

Chapter (03) 기본 사용법 - HCL - 블록

구구달스 2023. 7. 4. 23:25
CloudNet@ 가시다님이 진행하는 Terraform 101 Study 2기
"테라폼으로 시작하는 IaC" (한빛미디어) 도서로 진행!

✅ HCL (HashiCorp Configuration Language)

  • 하시코프에서 IaC 와 구성 정보를 명시하기 위해 개발된 오픈 소스 도구
  • 동일한 내용을 JSON으로 표현하는 것보다 더 간결하고 읽기 쉽게 작성할 수 있습니다.

https://github.com/hashicorp/hcl

 

GitHub - hashicorp/hcl: HCL is the HashiCorp configuration language.

HCL is the HashiCorp configuration language. Contribute to hashicorp/hcl development by creating an account on GitHub.

github.com

✅ 테라폼 블록

  • 테라폼 구성을 명시하는데 사용
  • 버전을 명시적으로 선언하고 필요한 조건을 입력하여 오류를 최소화할 것을 권장
terraform {
  required_version = "~> 1.3.0" #테라폼버전
  
  required_providers { #프로바이더 버전
    random = {
      version = ">= 3.0.0, < 3.1.0"
    }
    aws = {
      version = "4.2.0"
    }
  }
  
  cloud { #Cloud/Ennterprise 원격 실행 정보
    organization = "<MY_ORG_NAME>" 
    
    workspaces {
      name = "my-first-workspace"
    }
  }
  
  backend "local" {
    path = "relative/path/to/terraform.tfstate"
  }
}
  • = 또는 연산자 없음 : 지정된 버전만을 허용
  • != : 지정된 버전 제외
  • >, >=. <. <= : 지정된 버전과 비교 맞는 경우 허용
  • ~> : 지정된 버전에서 가장 자리수가 낮은 구성요소만 증가 허용
    • ~> 1.0.0 : v1.0.0을 포함한 v1.0.x 버전을 허용하고, v1.x는 허용하지 않는다.

🧿 테라폼 버전

  • required_version 으로 정의합니다.
  • 지정된 조건과 일치하지 않는 경우 오류를 출려하고 동작하지 않습니다.

  • 현재 테라폼 버전을 확인합니다.

  • 버전을 제한하는 테스트을 위해 현재 테라폼 버전보다 낮게 main.tf 에 terraform 블록을 추가합니다.
terraform {
  reqired_version = "< 1.0.0"
}

resource "local_file" "abc" {
  content  = "abc!"
  filename = "${path.module}/abc.txt"
}
  • 지원하지 않는 테라폼 버전이라는 오류를 발생합니다.

  • 다시 버전을 수정하고 실행합니다.
terraform {
  required_version = ">= 1.0.0"
}

🧿 프로바이더 버전

  • 각 프로바이더의 이름에 소스 경로와 버전을 명시합니다.

https://registry.terraform.io/browse/providers

 

Terraform Registry

 

registry.terraform.io

  • 프로바이더 버전을 제한하는 테스트를 위해 main.tf 를 수정합니다.
terraform {
  required_version = ">= 1.0.0"
  required_providers {
    local = {
       source = "hashicorp/local"
       version = ">= 10000.0.0"
    }
  }
}
  • 실제 가용한 버전의 프로바이더가 없으므로 실패합니다.

  • 올바른 버전 제한을 위해 버전을 >= 2.0.0으로 수정하고 다시 실행합니다.
terraform {
  required_version = ">= 1.0.0"
  required_providers {
    local = {
       source = "hashicorp/local"
       version = ">= 2.0.0"
    }
  }
}

🧿 백엔드 블록

  • 테라폼 실행 시 저장되는 State(상태 파일)의 저장 위히를 선언합니다.
  • 하나의 백엔드만 허용합니다.
  • 테라폼은 State의 데이터를 사용하여 코드로 관리된 리소스를 탐색하고 추적합니다.
  • 협업을 휘해서는 테라폼으로 생성한 리소스의 상태 저장 파일을 공유 하는 외부 백엔드 저장소가 필요합니다.

 State 잠금 동작

  • 기본적으로 활성화되는 백엔드는 작업자의 로컬 환경에 저장하고 관리하는 local 입니다.
  • 공유되는 백엔드에 State가 관리되면 테라폼이 실행하는 동안 .terraform.tfstate.lock.info 파일이 생성되며 해당 State를 동시에 사용하지 못하도록 잠금 처리합니다.
  backend "local" {
    path = "relative/path/to/terraform.tfstate" #State 파일 위치
  }
}

  • .terraform.tfstate.locak.into : State 동시 업데이트를 차단하는 lock 파일 내용
{
"ID":"dc96f16f-e928-185e-e027-2e6b79ccfc4e",
"Operation":"OperationTypeApply",
"Info":"",
"Who":"DESKTOP-M9AKM59\\ssoon@DESKTOP-M9AKM59",
"Version":"1.5.2",
"Created":"2023-07-05T14:37:05.0053394Z",
"Path":"relative/path/to/terraform.tfstate"
}
  • 잠금 파일이 어떤 영향을 주는지 main.tf 의 내용을 수정합니다.
resource "local_file" "abc" {
  content  = "123456!"
  filename = "${path.module}/abc.txt"
}
  • 첫번째 터미널에서 terraform apply을 실행한 후 두번째 터미널에서 terraform apply을 실행하면 State가 잠겼음을 나타내는 오류를 보여줍니다.

  백엔드 설정 변경

  • init 명령을 수행해 State 의 위치를 재설정합니다.
  backend "local" {
    path = "state/terraform.tfstate"
  }
  • 이전 구성 유지 : -migrate-state :
    • terraform.tfstate 의 이전 구성에서 최신의 state 스냅샷을 읽고 기록된 정보를 새 구성으로 전환합니다.

  • 새로 초기화 : -reconfigure :
    • init 실행하기 전에 terraform.tfstate 파일을 삭제해 테라폼을 처음 사용할 떄처럼 작업 공간(디렉터리)을 초기화 합니다.

 
Comments