メインコンテンツにスキップ

ステート

OpenTofuは、管理対象のインフラストラクチャと構成に関するステートを保存する必要があります。このステートは、OpenTofuが現実世界のresourceを構成にマッピングし、メタデータを追跡し、大規模なインフラストラクチャのパフォーマンスを向上させるために使用されます。

このステートはデフォルトで "terraform.tfstate" というローカルファイルに保存されますが、バージョン管理、暗号化、チームとの安全な共有を行うために、TACOS (TF Automation and Collaboration Software) に保存することをお勧めします。

OpenTofuはステートを使用して、インフラストラクチャに加える変更を決定します。操作の前に、OpenTofuはリフレッシュを実行して、ステートを実際のインフラストラクチャで更新します。

OpenTofuステートの主な目的は、リモートシステム内のオブジェクトと構成で宣言されたresourceインスタンス間のバインディングを保存することです。 OpenTofuは、構成の変更に応じてリモートオブジェクトを作成すると、そのリモートオブジェクトのIDを特定のresourceインスタンスに記録し、その後、将来の構成変更に応じてそのオブジェクトを更新または削除する可能性があります。

OpenTofuがステートを必要とする理由、およびOpenTofuがステートなしでは機能できない理由の詳細については、ステートの目的のページをご覧ください。

検査と変更

ステートファイルの形式はJSONですが、ステートを直接ファイル編集することはお勧めしません。 OpenTofuは、CLIを使用してステートの基本的な変更を実行するためのtofu stateコマンドを提供しています。

stateコマンドのCLIの使用法と出力は、grep、awkなどのUnixツールに適した構造になっています。さらに、CLIはユーザーをステート自体の形式変更から隔離します。 OpenTofuプロジェクトは、CLIを動作させ続けますが、その下のステート形式は変更される可能性があります。

OpenTofuは、構成されたresourceインスタンスとリモートオブジェクト間の1対1のマッピングを想定しています。通常、これは、OpenTofuが各オブジェクトを作成し、そのIDをステートに記録するか、オブジェクトを破棄してからそのバインディングを削除することによって保証されます。

tofu importで外部作成オブジェクトをインポートする、またはtofu state rmでOpenTofuに既存オブジェクトの「忘却」を要求するなど、他の方法でステートにバインディングを追加または削除する場合、この1対1のルールが守られていることを自分で確認する必要があります。たとえば、「忘却」を要求したオブジェクトを手動で削除するか、再インポートして他のresourceインスタンスにバインドします。

形式

ステートのスナップショットはJSON形式で保存され、新しいOpenTofuバージョンは、一般的に以前のバージョンによって生成されたステートのスナップショットと下位互換性があります。ただし、ステート形式は新しいOpenTofuバージョンで変更される可能性があるため、ステート形式を直接解析または変更するソフトウェアを構築する場合は、新しいバージョンでステート形式が進化するにつれて、そのソフトウェアの継続的なメンテナンスを行う必要があることを予期する必要があります。

あるいは、外部ソフトウェアによる使用を specificallyに意図したJSON出力を生成するいくつかの統合ポイントがあります

  • tofu outputコマンドには、ルートモジュールの出力値のフルセットまたは最新のステートスナップショットから特定の名前付き出力値を取得するための `-json` オプションがあります。
  • tofu showコマンドには、最新のステートスナップショット全体を検査するための `-json` オプションと、プランの作成時の以前のステートのコピーを含む保存されたプランファイルを検査するための `-json` オプションがあります。

OpenTofuが自動化で実行されている状況でこれらを使用する一般的な方法は、正常な `tofu apply` の直後にそれらを実行して最新のステートスナップショットの表現を取得し、その結果を自動実行に関連付けられた成果物として保存して、他のソフトウェアがOpenTofu自体を実行せずにそれを消費できるようにすることです。