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에 정의
- 각 프로바이더의 이름에 소스 경로와 버전을 명시하며, 테라폼 레지스트리 공식 페이지에서 원하는 프로바이더에 대한 정보를 확인할 수 있음


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

# 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 조작 불가능


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

- 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 |