리소스 재생성(Recreate resources) 개요

리소스 재생성(Recreate resources) 개요

이 문서는 Terraform에서 리소스를 재생성하는 방법에 대한 개요를 설명해요. 리소스가 손상되었거나 교체가 필요한 상황에서 어떻게 Terraform이 이를 처리하고, 사용자가 어떻게 수동으로 교체를 유도하는지 다뤄요.

출처: 문서

본문

소개 (Introduction)

기본적으로 terraform apply 명령을 실행하면 Terraform은 각 기존 객체의 최신 상태를 가져와 현재 구성과 비교해요. Terraform은 구성과 일치하지 않는 객체에만 작업을 수행해요.

원격 객체가 손상되거나 성능이 저하된 경우, 예를 들어 가상 머신 안에서 실행되던 소프트웨어가 충돌했지만 가상 머신 자체는 여전히 실행 중인 경우, Terraform은 이 문제를 감지하고 대응할 방법이 없어요. Terraform은 머신 전체를 직접 관리하기 때문이에요.

어떤 경우에는 Terraform이 객체가 불완전하거나 성능이 저하된 상태임을 자동으로 유추할 수 있어요. 예를 들어 복잡한 객체가 원격 시스템에서 부분적으로만 생성되었거나, provisioner 단계가 실패한 경우예요. 이때 Terraform은 자동으로 재생성이 필요한 리소스로 표시해요.

Terraform이 객체를 교체해야 한다고 유추하지 못하는 경우에는 수동으로 객체를 교체할 수 있어요.

워크플로 (Workflows)

객체를 교체해야 할 때 다음 방법들을 사용할 수 있어요.

리소스 수동 교체 (Manually replace resources)

terraform plan 또는 terraform apply 명령에 -replace 플래그를 추가해요.

$ terraform apply -replace="aws_instance.example"
# ...

  # aws_instance.example will be replaced, as requested
-/+ resource "aws_instance" "example" {
      # ...
    }

tainted 상태의 리소스 교체 (Replace resource in tainted state)

Terraform은 객체가 성능이 저하되거나 손상된 상태임을 유추할 수 있을 때 상태 데이터의 객체에 tainted 상태를 적용해요. 이 상태는 객체가 존재하지만 완전히 기능하지 않을 수 있음을 나타내요. Terraform은 다음 plan 또는 apply 작업 중에 tainted 상태의 객체를 교체해요.

  # aws_instance.example is tainted, so must be replaced
-/+ resource "aws_instance" "example" {
      # ...
    }

Terraform이 객체를 tainted로 표시했지만, 사용자가 이 객체가 정상적으로 동작한다고 판단해서 교체하고 싶지 않다면 terraform untaint 명령으로 Terraform의 판단을 덮어쓸 수 있어요. 이후 Terraform은 이 객체를 다운스트림 리소스 선언이 사용할 준비가 된 것으로 간주해요.

특정 객체를 tainted로 표시하도록 Terraform에 강제하려면 terraform taint 명령을 사용할 수 있지만, 이 방식은 tainted 객체가 있는 중간 상태 스냅샷을 만들 필요가 없는 -replace=... 옵션을 선호하기 때문에 더 이상 권장되지 않아요(deprecated).

더 알아보기 (Learn more)

  • terraform taint / untaint 명령
  • terraform apply -replace 옵션
  • terraform state 명령 개요
  • Terraform 리소스 주소 문서