Ssoon

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

Terraform 101 Study 2기

Chapter (03) 기본 사용법 - HCL - Resource

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

Resource

  • 선언된 항목을 생성하는 동작을 수행합니다.

🧿 Resource 구성

resource "<리소스 유형>" "<이름>" {
	<인수> = <값>
}

resource "local_file" "abd" {
	content = "123!"
    	filename = "${path.module}/abc.txt"
}
  • 프로바이더 이름_프로바이더에서 제공하는 리소스 유형
  • 리소스 유형 뒤에 고유한 이름을 사용합니다.
  • 이름 뒤에는 리소스 유형에 대한 구성 인수들이 중괄호 내에 선언됩니다.

main.tf 에 aws_instance 유형을 추가하고 terraform init을 수행합니다.

resource "aws_instance" "web" {
  ami = "ami-a1b2c3d4"
  instance_type = "t2.micro"
}
  • 리소스에서 사용되는 유형들은 프로바이더에 종속성을 갖습니다.
  • 특정 프로바이더의 유형만 추가해도 aws provider가 설치되는 것을 확인할 수 있습니다.

 

🧿 종속성

  • 기본적으로 다른 리소스에서 값을 불러올 경우 자동으로 연관 관계가 정의되는 암시적 종속성을 갖게 됩니다.
  • 강제적으로 종속성을 부여하기 위해서는 depend_on 메타인수를 활용합니다.

main.tf 에 위에 내용을 삭제 후 다음 요소를 추가하고 terraform apply를 수행합니다.

resource "local_file" "def" {
  content = "456!"
  filename = "${path.module}/def.txt"
}
  • 테라폼의 병령 수행 방식에 따라 동시 에 수행됨을 확인할 수 있습니다.

  • terraform destroy 후 리소스 속성을 다른 리소스에 주입한 후 terraform apply를 수행합니다.
resource "local_file" "def" {
  content = local_file.abc.content      # local_file.abc의 속성 값을 대신 넣어줍니다.
  filename = "${path.module}/def.txt"
}
  • 특정 리소스의 속성값이 필요한 경우 해당 리소스가 우성 생성되야 하므로 생성에 대한 종속성이 생겨 프로비저닝 순서가 발생합니다.

  • terraform graph 명령을 통해 테라폼 수행 단계를 확인합니다.

  • Graphviz (dot) language support for Visual 을 추가합니다.

  • terraform graph 실행결과를 graph.dot 파일을 생성 후 복사하고 저장한 후 "open preview to the side" 선택하여 작업순서 내역을 확인합니다.

  • depend_on 을 선언해 중속성을 강제로 적용하고 확인합니다.
resource "local_file" "abc" {
  content  = "123!"
  filename = "${path.module}/abc.txt"
}

resource "local_file" "def" {
  depends_on = [
    local_file.abc    # local_file.abc에 대한 종속성을 명시합니다.
  ]

  content = "456!"
  filename = "${path.module}/def.txt"
}

 

🧿  Resource 속성 참조

  • 인수 (Argument) : 리소스 생성 시 사용자가 선언하는 값
  • 속성 (Attribute) : 사용자가 설정하는 것은 불가능 -> 리소스 생성 이후 획득 가능한 리소스 고유 값
resource "<리소스 유형>" "<이름>" {
	<인수> = <값>
}

# 리소스 참조
<리소스 유형>.<이름>.<인수>
<리소스 유형>.<이름>.<속성>

 

🧿  수명주기

✔ create_before_destroy

  • 리소스 수정 시 신규 리소스를 우선 생성 -> 기존 리소스 삭제
resource "local_file" "abc" {
  content  = "lifecycle - step 1"
  filename = "${path.module}/abc.txt"

  lifecycle {
    create_before_destroy = false
  }
}

resource "local_file" "abc" {
  content  = "lifecycle - step 2"	#수정
  filename = "${path.module}/abc.txt"

  lifecycle {
    create_before_destroy = true	#생성후 삭제
  }
}

 

prevent_destroy

  • 의도적으로 특정 리소스의 삭제를 방지
resource "local_file" "abc" {
  content  = "lifecycle - step 3"	#수정
  filename = "${path.module}/abc.txt"

  lifecycle {
    prevent_destroy = true	#삭제방지
  }
}

 

ignore_changes

  • 리소스 요소에 선언된 인수 변경 사항 -> 테라폼 실행 시 무시
resource "local_file" "abc" {
  content  = "lifecycle - step 4"
  filename = "${path.module}/abc.txt"

  lifecycle {
    ignore_changes = []
  }
}

resource "local_file" "abc" {
  content  = "lifecycle - step 5"   #수정
  filename = "${path.module}/abc.txt"

  lifecycle {
    ignore_changes = [
      content
    ]
  }
}

 

precondition

  • 리소스 요소에 선언된 인수 조건 검증
variable  "file_name" {
  default = "step0.txt"
}

resource "local_file" "step6" {
  content  = "lifecycle - step 6"
  filename = "${path.module}/${var.file_name}"

  lifecycle {
    precondition  {
      condition = var.file_name == "step6.txt"
      error_message = "file name is not \"step6.txt\""
    }
  }
}

postcondition

  • Plan 과 Apply 이후의 결과를 속성 값으로 검증
resource "local_file" "step7" {
  content  = ""
  filename = "${path.module}/step7.txt"

  lifecycle {
    postcondition  {
      condition = self.content != ""
      error_message = "[ssoon] content cannot empty!"
    }
  }
}

output "step7_content"  {
  value = local_file.step7.id
}

Comments