Ssoon
Chapter (03) 기본 사용법 - HCL - Resource 본문
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
}
'Terraform 101 Study 2기' 카테고리의 다른 글
Chapter (03) 기본 사용법 - HCL - Local / Output (0) | 2023.07.10 |
---|---|
Chapter (03) 기본 사용법 - HCL - 데이터 소스 / Variable (0) | 2023.07.10 |
Chapter (03) 기본 사용법 - HCL - 블록 (0) | 2023.07.04 |
Chapter (03) 기본 사용법 - 주요 커맨드 (0) | 2023.07.04 |
Chapter (02) 실행 환경 구성 (0) | 2023.07.04 |
Comments