1. create_before_destroy
테라폼은 리소스를 업데이트 할 때 기본적으로 리소스를 파괴한 뒤 다시 생성합니다.
기존에 3개의 서버를 가진(서버1, 2, 3) 버전 1.17의 엔진엑스를 사용하고 있을 때, 업데이트를 통해 1.17을 1.18로 만들고 싶은 경우 서버1을 업데이트하지 않고, 서버1을 지우고 1.18 버전을 가지는 서버4를 만들어 대체하도록 합니다. 같은 방식으로 서버2, 3도 서버5, 6으로 대체합니다.
테라폼에서 라이프 사이클 조정(create_before_destroy)을 통해 삭제되기 전에 생성하도록 지정하여 서비스가 중단 없이 인프라를 업데이트할 수 있습니다.
resource "local_file" "pet" {
filename = "/root/pets.txt"
content = "We love pets!"
file_permission = "0700"
lifecycle { # 삭제되기전 생성 활성화
create_before_destroy = true
}
}
하지만 문제가 생길 수 있습니다.
terraform lifecycle은 terraform apply 명령을 실행했을 때, lifecycle 규칙이 적용된 local_file 리소스가 먼저 생성되고, 재성성 작업 중에 같은 파일이 파괴되는 상황이 발생합니다.
즉, 매개변수 등을 수정해서 terraform apply를 실행했는데 원하는 filename의 위치에 파일이 삭제되는 것 입니다.
두 개의 동일한 파일 인스턴스를 동시에 생성할 수 없기 때문에 문제가 발생합니다.
그래서 local_file 리소스의 filename의 속성 값이 유니크하게 설정해야 합니다.
하지만 이러한 작업을 방지할 수 있는 방법이 있습니다.
2. prevent_destroy
라이프 사이클에 prevent_destroy 설정을 하면 됩니다.
예시로 이러한 코드를 가진 리소스가 있다고 하면
# 변경 전
resource "random_pet" "super_pet" {
length = var.length
prefix = var.prefix
}
length나 prefix 값을 변경하면 terraform은 terraform destroy나 terraform apply 명령어를 실행할 때 리소스를 삭제하고 새로 생성해야 하지만 prevent_destroy 설정을 해놓으면 리소스 삭제를 방지할 수 있습니다.
# 변경 후
resource "random_pet" "super_pet" {
length = 3
prefix = "Dr."
lifecycle {
prevent_destroy = true
}
}
이렇게 lifecycle 안에 prevent_destroy = true를 설정해 놓으면 terraform apply나 terraform destroy를 실행해도 리소스가 파괴되지 않고 유지됩니다.
예를들어 mysql 같은 리소스는 매개변수를 수정한 뒤에도 삭제하면 안될 때 보호할 때 사용할 수 있습니다.
'[Cloud] > [Terraform]' 카테고리의 다른 글
[Terraform] 프로비저너와 사용자 데이터 (0) | 2024.08.09 |
---|---|
[Terraform] S3에서 상태 파일 업로드, 상태 파일 관리 명령어 (0) | 2024.08.09 |
[Terraform] 테라폼으로 AWS DynamoDB 생성, 업로드(GSI) (0) | 2024.08.08 |
[Terraform] 리소스 참조(암묵적 참조, 명시적 참조) (0) | 2024.08.05 |
[Terraform] 테라폼 변수 타입 종류 (0) | 2024.08.05 |