State 저장과 잠금
State 저장과 잠금 (State Storage and Locking)
백엔드(backend)는 state를 저장하고 state 잠금을 위한 API를 제공하는 역할을 해요. State 잠금은 선택 사항이에요.
출처: 문서
본문
state가 원격에 저장된다 하더라도, terraform console, terraform state 작업들, terraform taint 등 모든 테라폼 명령은 state가 로컬에 있는 것처럼 계속 동작해요.
State 저장 (State Storage)
백엔드는 state가 어디에 저장될지 결정해요. 예를 들어 로컬(기본) 백엔드는 디스크의 로컬 JSON 파일에 state를 저장해요. Consul 백엔드는 state를 Consul 안에 저장해요. 이 두 백엔드는 모두 잠금을 제공해요. 로컬은 시스템 API를 통해, Consul은 잠금 API를 통해요.
비로컬 백엔드를 사용할 때 테라폼은 백엔드에 state 쓰기가 실패한 복구 불가능한 오류의 경우를 제외하고는 state를 디스크 어디에도 유지(persist)하지 않아요. 이는 백엔드의 큰 이점이에요. state에 민감한 값이 있다면 원격 백엔드를 사용해서, state가 디스크에 유지되지도 않은 채 테라폼을 사용할 수 있어요.
state를 백엔드에 유지하는 중 오류가 발생하면 테라폼은 state를 로컬에 써요. 이는 데이터 손실을 막기 위해서예요. 이런 일이 발생하면 최종 사용자는 오류가 해결된 후 state를 수동으로 원격 백엔드에 push해야 해요.
수동 State Pull/Push
terraform state pull 명령으로 원격 state에서 state를 수동으로 가져올 수 있어요. 이 명령은 원격 state를 로드해서 stdout으로 출력해요. 파일로 저장하거나 다른 작업을 수행하도록 선택할 수 있어요.
terraform state push로 state를 수동으로 쓸 수도 있어요. 이것은 극히 위험하며 가능하면 피해야 해요. 이 명령은 원격 state를 덮어써요. 필요할 때 수동 수정(fixup)을 하는 데 사용할 수 있어요.
state를 수동으로 push할 때 테라폼은 몇 가지 잠재적으로 위험한 상황으로부터 사용자를 보호하려고 시도해요.
-
다른 계보(Differing lineage): "lineage"는 state가 생성될 때 부여되는 고유 ID예요. lineage가 다르면 두 state가 서로 다른 시점에 생성됐다는 뜻이며, 다른 state를 수정하고 있을 가능성이 매우 높아요. 테라폼은 이 경우를 허용하지 않아요.
-
더 높은 serial(Higher serial): 모든 state는 단조 증가하는 "serial" 번호를 가져요. 대상 state의 serial이 더 높다면, 쓰려는 state 이후에 변경이 발생했다는 뜻이므로 테라폼은 쓰기를 허용하지 않아요.
이 두 보호 장치는, 올바른 판단을 내리고 있다고 확신한다면 -force 플래그로 우회할 수 있어요. -force 플래그를 사용하더라도 강제로 덮어쓰기 전에 terraform state pull로 state 백업을 만드는 것을 권장해요.
State 잠금 (State Locking)
백엔드는 가능하면 state 잠금을 지원하는 역할을 해요.
모든 백엔드가 잠금을 지원하는 것은 아니에요. 각 백엔드의 문서에 잠금 지원 여부에 대한 세부 사항이 포함돼 있어요.
state 잠금에 대한 자세한 내용은 state 잠금 전용 페이지를 보세요.