Terraform - 하나를 제외한 모든 리소스
Terraform - 하나를 제외한 모든 리소스
나는 30-40개의 다른 자원을 가진 테라폼 0.11 프로젝트를 가지고 있다. 나는 몇 개를 제외하고 모두 삭제하고 싶다 - 그리고 그 몇 개는 서로 논리적으로 연관되어 있다.
나는 가까운 것을 찾고 있었지만 그것은 물론 존재하지 않는다.
너무 많은 스크립팅 없이 이를 달성할 수 있는 방법이 있습니까(Terraform 관리자는 다양한 OS를 가지고 있습니다)? 모듈을 사용하는 것이 그 과정을 더 쉽게 만들 수 있을까요?
현재 명령에 기능이 없습니다. 만약 여러분이 정말로 그렇게 하고 싶고, 여러분이 무엇을 하고 있는지 안다면, 여기 그 해결책이 있습니다.
# list all resources
terraform state list
# remove that resource you don't want to destroy
# you can add more to be excluded if required
terraform state rm <resource_to_be_deleted>
# destroy the whole stack except above excluded resource(s)
terraform destroy
왜 이런 명령들이 당신의 아이디어에 효과가 있을까요?
(*.tfstate)는 Terraform에서 실제 리소스를 구성에 매핑하는 데 사용되며 메타데이터를 추적합니다.
상태 파일(*.tfstate)에서만 레코드(리소스)를 지웁니다. 그것은 진짜 자원을 파괴하지 않는다.
또는 이후를 실행하지 않기 때문에 테라폼은 제외된 리소스가 생성되었는지 전혀 알 수 없습니다.
실행하면 제외된 리소스의 상태에 대한 세부 정보가 없으며 삭제되지 않습니다. 그것은 나머지를 파괴할 것이다.
그런데 나중에 원하는 경우 명령을 사용하여 리소스를 다시 가져올 수 있습니다.
나는 주변에 약간 다른 일이 있다. "테라폼 파괴"로 삭제하고 싶지 않은 리소스는 CLI가 있는 프로비저닝자를 사용하여 "null_resource"로 생성합니다. 당신은 여전히 당신의 변수를 테라폼에도 사용할 수 있다.
예(리소스 그룹을 생성하지만 null_resource로 인해 지속됨)
resource "null_resource" "backend-config" {
provisioner "local-exec" {
command = <<EOT
az group create --location ${var.Location} --name ${var.Resource_group_name} --tags 'LineOfBusiness=${var.Lob}' 'Region=${var.Region}' 'Purpose="Terraform-Primary-Resource-Group-${var.Lob}'
EOT
interpreter = ["Powershell", "-Command"]
}
}
이제 테라폼 파괴를 사용하여 리소스를 파괴하면 됩니다. null_resource는 그대로 유지됩니다.
원하는 리소스를 제외한 각 리소스를 대상으로 하는 것(데이터 리소스를 건너뛰는 유일한 방법일 것입니다:
#! /bin/bash
while read -r resource; do
terraform destroy -target="$resource"
done < <(terraform state list | grep -vE "^data\." | grep -vE "dont_remove|also_important")
terraform destroy - target Resource_TYPE.NAME - target Resource_TYPE2.NAME
리소스 나열:
terraform state list data.terraform_remote_state.rg azurerm_postgresql_database.postgresql_database azurerm_postgresql_server.postgresql_server
리소스 제거
terraform destroy -target azurerm_postgresql_database.postgresql_database -auto-approve
만약 당신이 물건들을 파괴할 필요가 있다면. 그것은, 당신이 나중에 그 자원들을 다시 가져올 의도라면.
만약 당신이 그저 자원을 제거하고 싶다면, 적절한 해결책은 당신이 파괴하고 싶은 테라폼 정의를 제거한 다음 일반적인 일을 하는 것이다. 당신이 자원에 대해 그렇게 하는 것처럼.
(오래된 질문인 건 알지만, 아무도 대안을 언급하지 않아 놀랐다. OP의 사용 사례는 다른 답변에 의해 커버되는 것처럼 보입니다. 따라서 이 답변은 여기에서 비틀거리는 다른 사람들을 위한 것입니다.)
일부 리소스를 제외한 모든 스택을 삭제하려면 다음 작업을 수행해야 합니다:
- 현재 상태의 백업 생성:
- 모든 리소스를 나열합니다:
- 다음과 같은 리소스 "rm". 클라우드의 리소스는 삭제되지 않고 테라폼 관점에서만 삭제됩니다.
- 스택을 파괴합니다. 바로 전에 "rm"한 리소스를 제외한 모든 리소스가 클라우드에서 삭제됩니다.
- 이제 빈 상태(0개의 리소스)가 되었습니다. 편집할 수 있도록 저장:
- 의 리소스 개체를 블록에 추가하여 편집합니다. 또한 값을 1만큼 증가시켜야 합니다
- 수정된 상태를 푸시합니다:
- 원하는 리소스가 있는지 확인하고 나머지 리소스는 모두 삭제할 수 있습니다.