리소스의 수명주기
리소스의 수명주기는 기본적으로 알고 지나가야할 것 같다.
리소스의 속성은 lifecycle를 이용하여 작업자가 의도적으로 변경하는 메타인수이다.
- Create_before_destory(bool): 리소스 수정시 신규 리소스를 우선 생성하고 기존 리소스를 삭제
- Prevent_destory(bool): 해당 리소스를 삭제(Destroy)하려 할 때 명시적으로 거부
- Ignore_changes(list): 리소스 요소에 선언된 인수의 변경 사항이 테라폼 실행 시 무시
- Precondition: 리소스 요소에 선언된 인수의 조건을 검증
- Postcondition: Plan과 Apply 이후의 결과를 속성 값으로 검증
리소스 속성
create_before_destory
리소스 안에 lifecycle에서 create_before_destroy = true
를 줄경우에 리소스를 삭제하고 다시 만들것인지 여부를 묻는것이다.
만약 false를 주면 삭제하지않고 수정한다.
resource "local_file" "abc" {
content = "lifecycle - step 1"
filename = "${path.module}/abc.txt"
lifecycle {
# ture를 주게되면 삭제하고 다시 생성한다.
create_before_destroy = false
}
}
Prevent_destroy
Prevent_destroy = true
는 삭제를 방지하는 옵션이다.
작업자가 의도적으로 특정 리소스의 삭제를 방지하고 싶은 경우에 사용한다고 한다.
resource "local_file" "abc" {
content = "lifecycle - step 3" # 수정
filename = "${path.module}/abc.txt"
lifecycle {
prevent_destroy = true # 삭제 방지
}
}
만약 ture를 준 상태에서 apply를 하면 테라폼 수명주기(삭제 → 생성) 파일을 삭제하고 다시 생성하기 때문에 실패된다.
이는 파일을 수정하는건 되지만 삭제하고 리소스를 재 생성은 가능할 것이다.
테라폼의 수명주기때문에 리소스 속성(prevent_destory)이 적용되서 에러가 발생한다.
ignore_changes
Ignore_changes = []
는 리소스 변경을 무시하는 옵션이다.
만약에 리소스가 변경되었고 다른 설정파일이 변경될때만 적용된다
resource "local_file" "abc" {
content = "lifecycle - step 5" # 수정
filename = "${path.module}/abc.txt"
lifecycle {
ignore_changes = [
content
]
}
}
Precondition
Precondition는 리소스 생성 이전에 입력된 인수 값을 검증하는데 사용해 프로비저닝 이전에 미리 약속된 값 이외의 값 또는 필수로 명시해야하는 인수 값을 검증할 수 있다고 한다.
또한 어디서 문제가 있는지도 확인해준다.
variable "file_names"{
default = "step0.txt"
}
resource "local_file" "step6" {
content = "lifecycle - step 6"
filename = "${path.module}/${var.file_names}" # 수정
lifecycle {
precondition {
condition = var.file_names == "step6.txt" # 파일이름을 위에 step0.txt로 변경하면 정상적으로 실행된다.
error_message = "file name is not \"step6.txt\""
}
}
postcondition
프로비저닝 변경 이후 결과를 검증함과 동시에 의존성을 갖는 다른 구성의 변경을 막는 기능이다.
종속성을 갖는 여러 리소스를 구성하는 경우에 리소스의 데이터가 다른 리소스 생성시 활용될 때 원하는 속성이 정의되어야 하는 경우를 확인할 수 있다.
프로비저닝 이후에 생성되는 속성 값이 있으므로 영향을 받는 다른 리소스가 생성되기 전에 예상되지않은 프로비저닝 작업을 방지할 수 있다고 한다.
resource "local_file" "step7" {
content = "lifecycle - step 7"
filename = "${path.module}/step7.txt"
lifecycle {
postcondition {
condition = self.content != ""
error_message = "content cannot empty"
}
}
}
output "step_content" {
value = local_file.step7.id
}
'Linux' 카테고리의 다른 글
PKIX ERROR 발생 이유 (0) | 2024.02.23 |
---|---|
SSL 인증서 에러(No subject alternative DNS name matching) (0) | 2024.02.22 |
프로메테우스(Prometheus), 그라파나(Grafana)를 Docker Compose로 설치하기 (0) | 2024.02.08 |
NGINX SSL 인증서 등록 (2) | 2024.02.08 |
DNS Qusery 지연 및 도메인 등록기관 이전 (3) | 2023.11.23 |