テラフォームの状態
コードで定義したリソースに関する情報を含むインフラストラクチャの現在の状態は、Terraform の状態として記録されます。 Terraform はこの状態を使用して、Terraform の「apply」などのコマンドが実行されたときにインフラストラクチャを目的の状態にするために必要な変更を決定します。変更 (作成、変更、削除) を実行した後、Terraform はインフラストラクチャの新しい状態で状態ファイルを更新します。
概念を明確に理解するために、例を見てみましょう。
リソース 「ローカルファイル」 「ジョン」 {
ファイル名 = 「/ホーム/ジョン.txt」
内容 = 「ペットが大好きです」
}
ここでは、「main.tf」という Terraform ファイルを作成します。その中には、ファイル名とコンテンツという 2 つの属性を持つ、「John」という名前の local_file タイプのリソースがあります。
local_file リソース タイプは、Terraform が実行されているマシンのローカル ファイル システム上にファイルを作成するために使用されます。この場合、「/home」ディレクトリに「John.txt」という名前のファイルが作成され、ファイルの内容は「ペット大好き」になります。
次に、Terraform フロー (Terraform の初期化、計画、適用) を実行しましょう。プロジェクトで初めて Terraform の「apply」コマンドを実行すると、Terraform は Terraform プロジェクトのルート ディレクトリに「terraform.tfstate」という状態ファイルを自動的に作成します。これには、インフラストラクチャの現在の状態に関するすべての情報が JSON 形式で含まれています。
作成したリソースの状態ファイルは次のとおりです。
ここで、現在のリソースを削除し、接頭辞、長さ、区切り文字の属性を持つ「my-pet」という名前のrandom_petタイプの別のリソースを作成するとします。
リソース 「ランダムペット」 '私のペット' {接頭辞 = '氏'
長さ = 「1」
区切り文字 = 「。」
}
ここでは、local_file リソースを削除し、random_pet リソースを追加します。私たちが望む状態は、random_pet リソースのみを持つことです。 Terraform の init、plan、apply コマンドを実行してみましょう。
前の図に示すように、Terraform の「plan」コマンドを実行すると、Terraform が望ましい状態に到達するために実行するアクションが表示されます。 Terraform の「apply」コマンドを実行すると、「my-pet」リソースが作成され、「John」リソースが削除されます。また、状態ファイルは、local_file リソースのメタデータを破棄し、random_pet リソースのメタデータを追加することによって更新されます。
更新された状態ファイルの内容は次のとおりです。
Terraform の状態管理はどのように機能するのでしょうか?
Terraform はバックエンドを使用して状態を管理します。バックエンドは、Terraform が状態データの保存と取得に使用するリモート サービスまたはローカル ファイル システムです。要件に応じて、適切なバックエンドを選択できます。
Terraform は、ローカル、Amazon S3、HashiCorp Consul、Vault、Azure Storage など、いくつかの組み込みバックエンドをサポートしています。組み込みオプションがニーズを満たさない場合は、カスタム バックエンドを作成することもできます。
前の例では、状態ファイルはローカル バックエンドに保存されました。ただし、リモート バックエンドに保存することは、コラボレーションを呼び起こし、セキュリティを強化するためのベスト プラクティスです。
状態管理の重要性
Terraform などのツールでの状態管理は、次の重要な点により不可欠です。
インフラストラクチャの現在の状態を判断する
状態ファイルは、既存のリソースとその現在の属性の正確なスナップショットを提供します。このデータは、インフラストラクチャを理解し、インフラストラクチャが望ましい状態であることを確認するために不可欠です。
インフラストラクチャへの変更を長期にわたって追跡する
Terraform を使用して変更を適用するたびに、状態ファイルが更新され、インフラストラクチャの新しい状態が反映されます。これにより、インフラストラクチャがどのように進化したかを追跡し、すべての変更の監査証跡を提供できるようになります。
オートメーション
望ましいインフラストラクチャの状態をコードで定義すると、インフラストラクチャの作成と管理を自動化できます。状態管理は、時間の経過とともに変更が加えられた場合でも、インフラストラクチャが引き続き望ましい状態であることを保証します。
依存関係の管理
Terraform を使用すると、構成ファイルでリソース間の関係を定義でき、Terraform は状態ファイルを使用してそれらの関係が確実に維持されるようにします。これにより、1 つのリソースへの変更が他のリソースに誤って影響を与えることがなくなります。
災害からの回復
障害または停止が発生した場合は、状態ファイルを使用してインフラストラクチャを既知の状態で再作成できます。これにより、ダウンタイムを最小限に抑え、インフラストラクチャを迅速かつ効率的に復元できます。
効果的な状態管理のためのベスト プラクティス
状態を効果的に管理するために従うことができるいくつかのヒントを次に示します。
リモート バックエンドを使用する
リモート バックエンドには、ローカル バックエンドに比べていくつかの利点があります。これにより、複数のユーザーが同じインフラストラクチャで作業できるようになり、ローカル バックエンドよりも優れたセキュリティと信頼性も提供されます。
バージョニングを有効にする
状態ファイルをバージョン管理することで、時間の経過とともに変更を追跡し、必要に応じて以前のバージョンにロールバックできます。また、バージョン管理により監査証跡が提供され、変更が適切に文書化されていることを確認するのに役立ちます。
ロック機構を使用する
ロック メカニズムを使用すると、複数のユーザーが同じインフラストラクチャで作業する場合の競合を防ぐことができます。 Terraform は、DynamoDB、Consul、S3 などのいくつかのロック ツールをサポートしています。
状態ファイルをバックアップする
定期的に状態ファイルをバックアップしておけば、データ破損から回復できます。バックアップを安全な場所に保存し、関連するコンプライアンス要件に従う必要があります。
結論
例を通じて状態ファイルを理解し、それらを管理しながら、IaC と Terraform について簡単に説明しました。 Terraform が州でどのように機能するかを理解することは、よくある落とし穴を回避し、インフラストラクチャが望ましい状態を維持できるようにするのに役立ちます。状態管理のベスト プラクティスに従うことで、自信を持って Terraform を効果的に使用できます。