terraform state rm 커맨드

terraform state rm 커맨드

terraform state rm 커맨드는 기존 원격 객체를 먼저 파괴하지 않고 그 바인딩을 제거해요. 원격 객체는 계속 존재하지만 더 이상 Terraform이 관리하지 않게 돼요. removed 블록을 사용해서 리소스를 제거할 수도 있는데, 이렇게 하면 한 번에 여러 리소스를 제거할 수 있고 일반적인 plan·apply 워크플로의 일부로 제거를 검토할 수 있어요.

출처: 문서

본문

terraform state rm 커맨드는 기존 원격 객체의 바인딩을 먼저 파괴하지 않고 제거해요. 원격 객체는 계속 존재하지만 더 이상 Terraform이 관리하지 않게 돼요.

terraform state rm 커맨드 대신 removed 블록을 사용해서 리소스를 제거할 수도 있어요. 한 번에 여러 리소스를 제거할 수 있고, 일반적인 plan·apply 워크플로에서 제거를 검토할 수 있어요. 리소스와 함께 removed 블록 사용하기모듈과 함께 removed 블록 사용하기에서 자세히 알아보세요.

사용법 (Usage)

사용법: terraform state rm [options] ADDRESS...

Terraform은 상태에서 주어진 리소스 주소와 일치하는 인스턴스를 검색하고, 각 인스턴스의 기록을 제거해서 Terraform이 더 이상 해당 원격 객체를 추적하지 않게 해요.

이는 객체가 원격 시스템에 계속 존재하지만, 이후의 terraform plan이 "잊혀진" 인스턴스 각각에 대해 새 객체를 생성하는 작업을 포함하게 된다는 뜻이에요. 원격 시스템이 부과하는 제약에 따라, 이름이나 다른 식별자가 여전히 남아 있는 기존 객체와 충돌하면 객체 생성이 실패할 수 있어요.

이 커맨드는 다음 옵션도 받아요:

  • -dry-run - 주어진 주소와 일치하는 모든 리소스 인스턴스를 보고하되, 실제로 "잊지는" 않아요.

  • -lock=false - 작업 중 상태 잠금을 유지하지 않아요. 다른 사람이 같은 워크스페이스에 대해 동시에 커맨드를 실행할 수 있다면 위험해요.

  • -lock-timeout=DURATION - -lock=false로 잠금을 비활성화하지 않았다면, 오류를 반환하기 전에 일정 시간 동안 잠금 획득을 재시도하도록 Terraform에 지시해요. 기간 문법은 숫자 뒤에 시간 단위 문자를 붙인 형태예요. 예: 3초는 "3s".

  • -var 'NAME=VALUE' - 설정의 루트 모듈에 선언된 단일 입력 변수에 값을 설정해요. 여러 변수를 설정하려면 이 옵션을 여러 번 사용하세요. 자세한 내용은 명령줄의 입력 변수를 참고하세요.

  • -var-file=FILENAME - 설정의 루트 모듈에 선언된 많은 입력 변수.tfvars 파일의 정의를 사용해 값을 설정해요. 여러 파일의 값을 포함하려면 이 옵션을 여러 번 사용하세요. 루트 모듈의 입력 변수에 값을 설정하는 방법은 -var-var-file 옵션 외에도 여러 가지가 있어요. 자세한 내용은 입력 변수에 값 할당을 참고하세요.

HCP Terraform CLI 통합 또는 remote 백엔드를 사용하는 설정에서만 terraform state rm-ignore-remote-version 옵션도 받아요. 로컬 상태를 사용하는 설정에서만 terraform state rm은 레거시 옵션 -state, -state-out, -backup도 받아요.

예제: 리소스의 모든 인스턴스 제거 (Example: Remove all Instances of a Resource)

다음 예제는 "worker"라는 packet_device 리소스의 모든 인스턴스를 Terraform이 "잊도록" 합니다.

$ terraform state rm 'packet_device.worker'

countfor_each를 사용하지 않는 리소스는 인스턴스가 하나뿐이므로, 이 문법이 단일 인스턴스를 선택하는 데도 적합해요.

예제: 모듈 안 리소스의 모든 인스턴스 제거 (Example: Remove all Instances of a Resource in a Module)

하위 모듈에서 정의한 리소스를 선택하려면 리소스 주소의 일부로 해당 모듈의 경로를 지정해야 해요:

$ terraform state rm 'module.foo.packet_device.worker'

예제: 모듈 안 모든 리소스의 모든 인스턴스 제거 (Example: Remove all Instances of all Resources in a Module)

다음 예제는 foo라는 모듈의 모든 인스턴스에 정의된 모든 리소스와 연결된 모든 인스턴스를 Terraform이 "잊도록" 합니다:

$ terraform state rm 'module.foo'

예제: count를 사용해 특정 리소스 인스턴스 제거 (Example: Remove a Particular Instance of a Resource using count)

count 메타-인자로 정의된 리소스는 각각 정수로 식별되는 여러 인스턴스를 가져요. 주소에 명시적 인덱스를 포함하면 특정 인스턴스를 선택할 수 있어요:

$ terraform state rm 'packet_device.worker[0]'

대괄호([, ])는 일부 셸에서 특별한 의미를 가지므로, 주소를 Terraform에 그대로 전달하려면 인용하거나 이스케이프해야 할 수 있어요. 위 예제는 Unix 스타일 셸의 일반적인 인용 문법을 보여줘요.

예제: for_each를 사용해 특정 리소스 인스턴스 제거 (Example: Remove a Particular Instance of a Resource using for_each)

for_each 메타-인자로 정의된 리소스는 각각 문자열로 식별되는 여러 인스턴스를 가져요. 주소에 명시적 키를 포함하면 특정 인스턴스를 선택할 수 있어요.

다만 문자열 문법에는 따옴표가 포함되고, 따옴표 기호는 종종 명령 셸에서 특별한 의미를 가지므로, 사용 중인 셸에 맞는 적절한 인용 및/또는 이스케이프 문법을 사용해야 해요. 예를 들어:

Linux나 macOS 같은 Unix 스타일 셸:

$ terraform state rm 'packet_device.worker["example"]'

Windows Command Prompt (cmd.exe):

$ terraform state rm packet_device.worker[\"example\"]

PowerShell:

$ terraform state rm 'packet_device.worker[\"example\"]'

더 알아보기 (Learn more)