Terraform 状態とは
Terraform 状態は、Terraform ライフサイクルに不可欠な要素です。インフラストラクチャ構成のメタデータリポジトリとして機能します。Terraform は、管理するリソースの状態を状態ファイルに保存します。
デフォルトでは、状態は terraform.tfstate という名前のファイルに保存されますが、リモートに保存することもできます。リモートストレージは、チームが協力してインフラストラクチャを管理するシナリオで推奨されます。
Terraform は状態を使用して実行計画を作成し、インフラストラクチャを変更します。操作の前に、Terraform はリフレッシュを実行して、インフラストラクチャの実際の状態で状態を更新します。Terraform 状態の主な目的は、クラウドなどのリモートシステムのインフラストラクチャオブジェクトと、構成ファイルで宣言されたリソースインスタンスとの間のマッピングを保存することです。Terraform が構成ファイルに基づいてリモートオブジェクトを作成または変更すると、そのリモートオブジェクトの ID を対応するリソースインスタンスに記録し、状態ファイルに保存します。その後、Terraform は将来の構成変更に基づいてそのオブジェクトを更新または削除できます。
リソースブロックで作成された各インフラストラクチャリソースは、Terraform 状態内でその resource_name によって識別されます。リソースの管理フローは次のとおりです:
terraform applyを使用して初めて Terraform 構成を適用すると、インフラストラクチャリソースが作成され、状態ファイルが自動的に生成されます。このファイルは、リソースブロックで宣言された名前を参照します。リソースがすでに Terraform 状態ファイルで識別されている場合、Terraform は構成ファイルと状態ファイル、およびリモートリソースの実際の状態を比較します。この比較に基づいて、実行計画が生成されます。
計画が実行されると、リソースは構成ファイルの定義と一致するように更新されます。リモート API の制限によりインプレースでのパラメーター更新が不可能な場合、実行計画はリソースを破棄してから再作成します。計画がリソースを破棄する場合、Terraform は破棄操作を開始します。
計画が正常に実行された後、Terraform 状態ファイルは現在のインフラストラクチャの状態を反映するように更新されます。
現在の Terraform 構成からリソースが削除されても状態ファイルにまだ存在する場合、Terraform は構成に存在しなくなったリソースを破棄します。
Terraform 状態の保存
デフォルトでは、Terraform は状態を現在の作業ディレクトリに .tfstate 拡張子のファイルとしてローカルに保存します。この設定では追加の構成は不要で、開発者が 1 人のプロジェクトに適しています。ただし、複数の開発者がそれぞれ独自のローカル状態ファイルを使用して Terraform を同時に実行すると、この構成は問題を引き起こす可能性があります。
チームコラボレーションシナリオでローカル状態を使用すると、次の問題が発生します:
共有アクセスの欠如
Terraform を使用してインフラストラクチャを更新する場合、各チームメンバーは同じ状態ファイルにアクセスする必要があります。これには、ECS インスタンス上など、共有の場所にファイルを保存する必要があり、管理オーバーヘッドが増加します。
状態ロックなし
2 人のチームメンバーが同時に Terraform を実行すると、競合状態が発生する可能性があります。複数の Terraform プロセスが同時に状態ファイルを更新する可能性があり、競合、データ損失、状態ファイルの破損のリスクがあります。
ローカルのステータスファイルには機密情報は含まれていません。
状態ファイルには情報がプレーンテキストで保存されるため、データベースの認証情報や SSH ログインパスワードなどの機密データが公開されるリスクがあります。
したがって、チーム内の複数の開発者がコードでインフラストラクチャを管理する場合、状態ファイルをリモートの中央の場所に保存することをお勧めします。これにより、インフラストラクチャが変更されると、リモートの状態ファイルが更新され、チームの全員が最新のインフラストラクチャの状態で作業していることが保証されます。
リモート状態ストレージを使用すると、ローカル状態に関連する問題が解決されます:
自動更新
リモートバックエンドを構成すると、
planまたはapplyコマンドを実行するたびに、Terraform はリモートの場所から状態ファイルを自動的にロードします。さらに、各applyの後に更新された状態ファイルをリモートに自動的に保存するため、手動エラーのリスクが排除されます。状態ロックのサポート
Terraform コマンドを実行すると、リモートの状態ファイルをロックできます。これにより、複数の開発者が同時に
terraform applyを実行した場合に状態ファイルが破損するのを防ぎます。リモートファイルストレージは、状態ファイルにとってローカルストレージよりも安全です。
OSS バケットは、転送中および保存時の暗号化をサポートしています。さらに、OSS バケットはアクセス権限を構成するための複数のメソッドを提供するため、状態ファイルへのアクセスを詳細に制御できます。
リモート状態ストレージの構成
Alibaba Cloud は、OSS バケットに基づいたリモート状態ストレージ機能を提供し、Tablestore を使用したリモート状態ファイルのロックをサポートしています。したがって、リモート状態ストレージを構成する前に、まず状態ファイルを保存するための OSS バケットと、ロック用の Tablestore インスタンスを作成する必要があります。次のセクションでは、Terraform 状態を OSS バケットにリモートで保存する方法を示します:
依存リソースの作成
まず、
alicloud_oss_bucket、alicloud_ots_instance、およびalicloud_ots_tableリソースをmain.tfなどの Terraform 構成ファイルに追加します。バケット名、Tablestore インスタンス名、インスタンスタイプ、テーブル名などのパラメーターを設定して、必要に応じてリソースを構成します。構成が完了したら、terraform applyを実行してバケットやその他のリソースを作成します。リモート状態の構成
次に、バックエンド構成コードを
backend.tfという名前の新しい Terraform 構成ファイルに追加し、terraform initを実行して Terraform リモート状態を構成します。この時点で、Terraform はローカル状態ファイルがすでに存在することを検出し、新しい OSS バケットにコピーするように求めます。yesと入力します。terraform initが正常に実行されると、Terraform 状態は OSS バケットに保存されます。
リモートストレージをより便利に構成するには、Alibaba Cloud が提供する Terraform Module を使用できます。
以下は、OSS バケットからの状態ファイルのスニペットです:
{
"version": 4,
"terraform_version": "1.7.1",
"serial": 9,
"lineage": "5827f172-fc29-c293-cce7-7932f3537499",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "alicloud_oss_bucket",
"name": "this",
"provider": "provider[\"registry.terraform.io/hashicorp/alicloud\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_monitor": [
{
"status": "Disabled"
}
],
"acl": "private",
"bucket": "tf-oss-backend-for-demo",状態ファイルには、リソースタイプ、リソース名、プロバイダー名など、作成されたリソースのメタデータが含まれています。
Terraform 状態のベストプラクティス
Terraform 状態ファイルを最適化し、安全にするための以下の提案を提供します:
チームコラボレーションシナリオでリモート状態を使用する
チームコラボレーションシナリオでリモート状態を使用して、状態ファイルをロックし、バージョン管理します。Alibaba Cloud のお客様は、OSS をリモート状態ストレージバックエンドとして使用し、Tablestore を使用して状態ファイルをロックする必要があります。ビルドシステムと高い権限を持つ管理者のみがリモート状態ストレージバケットにアクセスできるようにしてください。開発者のローカル状態ファイルが誤って GitHub や GitLab などのソースコードバージョン管理システムにコミットされるのを防ぐために、状態ファイルのパターン (
*.tfstate) を.gitignoreファイルに追加します。状態に機密データを保存しない
多くのリソースやデータプロバイダーは、状態ファイルに機密データをプレーンテキストで保存するため、セキュリティリスクが生じます。可能であれば、状態ファイルに機密情報を保存することは避けてください。
状態を暗号化する
追加の防御層として、常にリモート状態ファイルを暗号化してください。Alibaba Cloud OSS は、KMS、AES256、SM4 の 3 つの暗号化方式をサポートしています。カスタム KMS キーを使用して、状態ファイルに追加の保護層を提供できます。
Terraform 状態を手動で変更しない
状態ファイルは、Terraform 構成と Alibaba Cloud インフラストラクチャリソース間のマッピングを維持するために重要です。状態ファイルの破損は、重大なインフラストラクチャの問題につながる可能性があります。したがって、Terraform 状態ファイルの内容を手動で変更しようとしないでください。