1주차 - Terraform 기본 사용법 (2/3)

728x90

HCL(HashiCorp Configuration Language)

  • HCL은 하시코프사에서 IaC와 구성 정보를 명시하기 위해 개발된 오픈소스 도구
  • 테라폼의 경우 확장자가 *.tf 파일을 사용하며, HCL언어로 작성
  • 인프라가 코드로 표현되고 이 코드는 곧 인프라이기 때문에 선언적 특성을 갖게 되고 튜링 완전한 Turing-complete 언어적 특성을 갖음
  • HCL에서 변수와 문자열 값을 함께 사용하는 인터폴레이션 interpolation 표현 방식을 사용
  • 내부 구조는 Block으로 구성

 Terraform 주요 구성요소 / 테라폼 블록

  • 테라폼 블록: 테라폼 구성을 명시하는데 사용
    • 테라폼 버전이나 프로바이더 버전과 같은 값들은 자동으로 설정되지만, 함께 작업할 때는 버전을 명시적으로 선언하고 필요한 조건을 입력하여 실행 오류를 최소화 할 것을 권장
      • 현재 실행한 테라폼 코드가 3년 후에 실행하여도 동일한 결과를 얻을 수 있어야 함
    • 버전 체계는 시맨틱 버전 관리 방식을 따름( Semantic Versioning )
      • version = Major.Minor.Patch

테라폼 버전 / 프로바이더 버전

terraform {
  required_version = "~> 1.3.0" # 테라폼 버전

  required_providers { # 프로바이더 버전을 나열
    random = {
      version = ">= 3.0.0, < 3.1.0"
    }
    aws = {
      version = "4.2.0"
    }
  }
  • = 또는 연산자 없음 : 지정된 버전만을 허용하고 다른 조건과 병기할 수 없음
  • != : 지정된 버전을 제외
  • >, >=, <, <= : 지정된 버전과 비교해 조건(부등호)에 맞는 경우 허용
  • ~> : 지정된 버전에서 가장 자리수가 낮은 구성요소만 증가하는 것을 허용한다.
    • ~> x.y 인 경우 y 버전에 대해서만, ~> x.y.z인 경우 z 버전에 대해서만 보다 큰 버전을 허용한다
#terrafrom 현재 버전 확인
terraform version

root@Burst:/home/yjsong/t101/t101-1week-web# terraform version
Terraform v1.8.1
on linux_amd64

# 테라폼 블록을 지정하여 테라폼 버전을 명시
terraform {
  required_version = "< 1.0.0"
}

resource "local_file" "abc" {
  content  = "abc!"
  filename = "${path.module}/abc.txt"
}

#현재 버전이 1.8.1이므로 부합하지 않아 초기화 실패
terraform init
Initializing the backend...
╷
│ Error: Unsupported Terraform Core version
│ 
│   on main.tf line 2, in terraform:
│    2:   required_version = "< 1.0.0"
│ 
│ This configuration does not support Terraform version 1.8.1. To proceed,
│ either choose another supported Terraform version or update this version
│ constraint. Version constraints are normally set for good reason, so
│ updating the constraint may lead to other errors or unexpected behavior.
  • 프로바이더 버전
    • 테라폼 0.13 버전 이전에는 provider 블록에 함께 버전을 명시했지만 해당 버전 이후 프로바이더 버전은 terraform 블록에서 required_providers에 정의
    • 각 프로바이더의 이름에 소스 경로와 버전을 명시하며, 테라폼 레지스트리 공식 페이지에서 원하는 프로바이더에 대한 정보를 확인할 수 있음

etc-image-0etc-image-1

 

백앤드 블록 / state

  • 백엔드 블록의 구성은 테라폼 실행 시 저장되는 State(상태 파일)의 저장 위치 선언
    • 주의할 점은 하나의 백엔드만 허용
  • 테라폼은 State의 데이터를 사용해 코드로 관리된 리소스를 탐색하고 추적
    • terraform.tfstate: 현재 까지 정보를 저장
    • terraform.tfstate.backup: 지난 작업의 정보까지 저장

etc-image-2

# diff 명령어를 통해 terraform.tfstate과 terraform.tfstate.backup 비교
# terraform.tfstate에는 abc, dev 내용이 모두 저장
# terraform.tfstate.backup에는 이전 내용인 abc에 대한 내용만 저장되어 있음

diff -c terraform.tfstate terraform.tfstate.backup 

*** terraform.tfstate   2024-06-16 10:58:36.126927377 +0900
--- terraform.tfstate.backup    2024-06-16 10:58:36.126927377 +0900
***************
*** 1,7 ****
  {
    "version": 4,
    "terraform_version": "1.8.1",
!   "serial": 3,
    "lineage": "ba43b878-6315-af8a-69b0-53ec60280e25",
    "outputs": {},
    "resources": [
--- 1,7 ----
  {
    "version": 4,
    "terraform_version": "1.8.1",
!   "serial": 1,
    "lineage": "ba43b878-6315-af8a-69b0-53ec60280e25",
    "outputs": {},
    "resources": [
***************
*** 29,69 ****
              "sensitive_content": null,
              "source": null
            },
-           "sensitive_attributes": [
-             [
-               {
-                 "type": "get_attr",
-                 "value": "sensitive_content"
-               }
-             ]
-           ]
-         }
-       ]
-     },
-     {
-       "mode": "managed",
-       "type": "local_file",
-       "name": "dev",
-       "provider": "provider[\"registry.terraform.io/hashicorp/local\"]",
-       "instances": [
root@Burst:/home/yjsong/t101/03# diff -c terraform.tfstate terraform.tfstate.backup 
*** terraform.tfstate   2024-06-16 10:58:36.126927377 +0900
--- terraform.tfstate.backup    2024-06-16 10:58:36.126927377 +0900
***************
*** 1,7 ****
  {
    "version": 4,
    "terraform_version": "1.8.1",
!   "serial": 3,
    "lineage": "ba43b878-6315-af8a-69b0-53ec60280e25",
    "outputs": {},
    "resources": [
--- 1,7 ----
  {
    "version": 4,
    "terraform_version": "1.8.1",
!   "serial": 1,
    "lineage": "ba43b878-6315-af8a-69b0-53ec60280e25",
    "outputs": {},
    "resources": [
***************
*** 29,69 ****
              "sensitive_content": null,
              "source": null
            },
-           "sensitive_attributes": [
-             [
-               {
-                 "type": "get_attr",
-                 "value": "sensitive_content"
-               }
-             ]
-           ]
-         }
-       ]
-     },
-     {
-       "mode": "managed",
-       "type": "local_file",
-       "name": "dev",
-       "provider": "provider[\"registry.terraform.io/hashicorp/local\"]",
-       "instances": [
-         {
-           "schema_version": 0,
-           "attributes": {
-             "content": "def!",
-             "content_base64": null,
-             "content_base64sha256": "Rm4skjSqJGFRkUFCflW7rNUZ4sAS3vzjWfrOjTwlDBU=",
-             "content_base64sha512": "JwN8zsR7XvAQZ9KkxokoJPkPZt5LElyjPuH0Pmhd82GIL/Zu3rZOHRacv8myxhbbZzpUahtQ6HDB0OMSiXedyA==",
-             "content_md5": "3f6d9022e2f7b9cf3995155f239cba7c",
-             "content_sha1": "15f946cb27f0730866cefea4f0923248d9366cb0",
-             "content_sha256": "466e2c9234aa2461519141427e55bbacd519e2c012defce359face8d3c250c15",
-             "content_sha512": "27037ccec47b5ef01067d2a4c6892824f90f66de4b125ca33ee1f43e685df361882ff66edeb64e1d169cbfc9b2c616db673a546a1b50e870c1d0e31289779dc8",
-             "directory_permission": "0777",
-             "file_permission": "0777",
-             "filename": "./def.txt",
-             "id": "15f946cb27f0730866cefea4f0923248d9366cb0",
-             "sensitive_content": null,
-             "source": null
-           },
            "sensitive_attributes": [
              [
                {
--- 29,34 ----
  • 작업자 간의 협업을 고려한다면 테라폼으로 생성한 리소스의 상태 저장 파일을 공유할 수 있는 외부 백엔드 저장소가 필요
    • State에는 외부로 노출되면 안 되는 패스워드 또는 인증서 정보 같은 민감한 데이터들이 포함될 수 있으므로 State의 접근 제어가 필요

 State 잠금 동작

  • 기본적으로 활성화되는 백엔드는 local
    • 상태를 작업자의 로컬 환경에 저장하고 관리
  • 이 밖의 다른 백엔드 구성은 동시에 여러 작업자가 접근해 사용할 수 있도록 공유 스토리지 같은 개념을 갖음
  • 공유되는 백엔드에 State가 관리되면 테라폼이 실행되는 동안 .terraform.tfstate.lock.info 파일이 생성되면서 해당 State를 동시에 사용하지 못하도록 잠금 처리
    • terrfrom apply 후 대기 → apply 진행하는 동안 tfstate.lock.info파일 생성
    • tfstate.lock.info파일이 생성되어 있으면, 다른 사용자는 apply 조작 불가능

etc-image-3etc-image-4

root@Burst:/home/yjsong/t101/03# cat .terraform.tfstate.lock.info

{
"ID":"1705818a-b2a9-7d78-18d9-0f4cfed9d8b3",
"Operation":"OperationTypeApply", # 어떤 동작으로 인해 해당 잠금 파일이 생성되었는지 확인
"Info":"",
"Who":"root@Burst",				  # 작업자 정보
"Version":"1.8.1",				  # 실행한 테라폼 버전
"Created":"2024-06-16T02:17:06.226360704Z",
"Path":"terraform.tfstate"		  # 잠긴 state 파일의 위치
}

 

 State Path 변경

  • 추가 옵션1 (이전 구성 유지) : -migrate-state는 terraform.tfstate의 이전 구성에서 최신의 state 스냅샷을 읽고 기록된 정보를 새 구성으로 전환
  • 추가 옵션2 (새로 초기화) : -reconfigure는 init을 실행하기 전에 terraform.tfstate 파일을 삭제해 테라폼을 처음 사용할 때처럼 이 작업 공간(디렉터리)을 초기화 하는 동작
# 테라폼 블록 내 백앤드 블록을 지정하여 state 파일의 저장 경로 변경

terraform {
  backend "local" {
    path = "state/terraform.tfstate"
  }
}

resource "local_file" "abc" {
  content  = "123456!"
  filename = "${path.module}/abc.txt"
}

root@Burst:/home/yjsong/t101/03# tree state
state
├── terraform.tfstate
└── terraform.tfstate.backup

#
terraform plan
terraform apply -auto-approve

# 이전 state 파일 삭제
# 새로운 state파일이 생성되어 있기 때문에 이전 state 파일을 삭제해도 동작에는 영향 X

rm -rf terraform.tfstate*
ls -al

# 
terraform plan
terraform apply -auto-approve
cat abc.txt

etc-image-5

 

  • state/terraform.tfstate 파일을 강제로 삭제 시 차이점
    • state/terraform.tfstate 파일이 정상적으로 존재하는 경우 내용 수정 시 replacement, 즉 내용이 수정되어 적용
    • state/terraform.tfstate 파일이 삭제되는 경우, plan 시 변경이 아닌, create가 진행

 

728x90

'T101' 카테고리의 다른 글

1주차 - Terraform 기본 사용법 (3/3)  (1) 2024.06.16
1주차 - Terraform 기본 사용법 (1/3)  (0) 2024.06.16