Terraformの状態管理
Terraformでは管理対象のインフラストラクチャをコードで定義します。これは、IaC (Infrastructure as Code)と呼ばれ、チーム間でインフラストラクチャをコードで管理することで、自動化やレビュー、複製、更新などを簡単にします。
Terraformでは、デプロイされたリソースの構成に関する状態(state)を保存します。この状態はterraform.tfstate
という名前のローカルファイルに保存されます。Terraformはこの状態を使用して、デプロイメントにどのような変更を加えるかを決定します。Terraformの状態によって、リモート上のデプロイメントとローカルのコードで宣言された構成の差分を検出し、変更を適用することができます。
チーム間で1つのTerraformデプロイメントの構成を共有する場合は、このtfstate
ファイルを共有する必要があります。そうでなければ、デプロイメントは各ユーザーのローカルにあるtfstate
によって管理され、予期しない変更や2重のデプロイが行われたり、デプロイメントの状態管理が失われる可能性があります。
tfstateの管理方法
tfstate
を共有する場合は、S3などの共有ストレージに保存することが可能です。今回は、AWS S3上にバケットを作成し、Terraformのコード上で保存先を指定することで、Terraformが自動的にファイルを管理します。
⚠️ gitレポジトリでの保存は、コミットし忘れによる競合状態の発生、シークレットなどが
tfstate
ファイルに含まれる場合がある、などの理由で推奨されません。
1. S3バケットの作成
バケット名は任意です。その他、バケットのバージョニングは有効にしておくと良いです。
2. Terraformコード内でS3バケットを指定
main.tf
などに、下記のようにterraform
ブロック内でbackend
を指定します。バケット名は、作成したものに合わせてください。key
の項目は、1つのバケットで複数のtfstateファイルを管理する場合、それぞれを区別するために必要です。
1 2 3 4 5 6 7 |
terraform { backend "s3" { bucket = "avinton-terraform-state-bucket" key = "mytest-deploly/terraform.tfstate" region = "ap-northeast-1" } } |
3. terraform init
でS3に接続する
terraform init
コマンドを実行すると、次のようなメッセージが出力されます。
1 2 3 4 |
Initializing the backend... Successfully configured the backend "s3"! Terraform will automatically use this backend unless the backend configuration changes. |
ここで接続に失敗する場合は、AWSへの接続情報やバケット名、リージョンを確認してください。
まとめ
Terraformの状態が保存されるファイルであるtfstate
ファイルをリモート管理する方法を説明しました。これにより、チーム間で同じデプロイメントを別々の環境から管理することができます。