- OpenTofu言語
- 状態
- 状態の保存とロック
状態の保存とロック
バックエンドは、状態を保存し、状態のロックのためのAPIを提供する役割を担います。状態のロックはオプションです。
状態はリモートに保存されますが、`tofu console`、`tofu state`操作、`tofu taint`など、すべてOpenTofuコマンドは、状態がローカルにあるかのように動作し続けます。
状態の保存
バックエンドによって状態の保存場所が決まります。たとえば、ローカル(デフォルト)バックエンドは、状態をディスク上のローカルJSONファイルに保存します。Consulバックエンドは、状態をConsul内に保存します。これら両方のバックエンドは、ローカルの場合はシステムAPIを介して、Consulの場合はロックAPIを介して、ロックを提供します。
ローカル以外のバックエンドを使用する場合、バックエンドへの状態の書き込みに失敗した回復不可能なエラーが発生した場合を除き、OpenTofuはディスク上に状態を永続化しません。これはバックエンドにとって大きな利点です。機密値が状態に含まれている場合、リモートバックエンドを使用することで、その状態がディスクに永続化されることなくOpenTofuを使用できます。
バックエンドへの状態の永続化にエラーが発生した場合、OpenTofuは状態をローカルに書き込みます。これはデータ損失を防ぐためです。このような事態が発生した場合は、エラーが解決された後、エンドユーザーが手動で状態をリモートバックエンドにプッシュする必要があります。
状態の手動プル/プッシュ
`tofu state pull`コマンドを使用して、リモート状態から状態を手動で取得できます。これにより、リモート状態が読み込まれ、標準出力に出力されます。それをファイルに保存したり、他の操作を実行したりすることもできます。
`tofu state push`を使用して、状態を手動で書き込むこともできます。**これは非常に危険であり、可能な限り避けるべきです。**これにより、リモート状態が上書きされます。必要に応じて手動で修正を行うために使用できます。
状態を手動でプッシュする場合、OpenTofuは潜在的に危険な状況から保護しようとします。
-
**異なる系統:** 「系統」とは、状態が作成されたときに割り当てられる一意のIDです。系統が異なるということは、状態が異なる時間に作成されたことを意味し、異なる状態を変更している可能性が非常に高いです。OpenTofuはこれを許可しません。
-
**より高いシリアル番号:** すべての状態には、単調増加する「シリアル」番号があります。宛先状態のシリアル番号の方が高い場合、書き込もうとしている状態以降に変更が発生したことを意味するため、OpenTofuは書き込みを許可しません。
正しい決定をしていると確信している場合は、`-force`フラグを使用して、これらの保護機能をバイパスできます。`-force`フラグを使用する場合でも、上書きを強制する前に、`tofu state pull`を使用して状態のバックアップを作成することをお勧めします。
状態のロック
バックエンドは、可能な限り状態のロックをサポートする役割を担います。
すべてのバックエンドがロックをサポートしているわけではありません。各バックエンドのドキュメントには、ロックをサポートしているかどうかについての詳細が含まれています。
状態のロックの詳細については、状態のロック専用のページをご覧ください。