Terraformを複数人で作業できるようにしよう(Backend)
目標
Terraformを複数人で作業できるようにしていきます。
S3上で.tfstateを管理するようにします。
前提
.tfstateをローカルで管理している方で、複数人作業時に.tfstateファイルを共有し合っている方向けです。
実際に見ていきましょう!
そもそもtfstateファイルって??
terraform applyをするたびに生成/更新されるファイルで、terraform applyで生成したリソースと設定値が記載されたファイルです。
こんな感じの。
terraformはplanやapplyを行うときは、tfstateファイルと現状のソースとの差分をみて、リソースを作成するか否かを決定します。
AWSのリソース単位で下記差分をみて、AWSリソースの作成や更新を行っていっている感じです。
create: tfstateに記述なし && ソースに記述あり
update: tfstateに記述あり && ソースに記述あり(設定値を更新)
destroy: tfstateに記述あり && ソースに記述なし
注意
tfstateはapplyの結果を追記していくものになるため、AWSリソースを直接修正した場合は
変更点がtfstateファイルに反映されません。
そのため、terraformで生成したAWSリソースは原則手動で更新してはいけません!
※実際のAWSとtfstateで合わなくなってしまします。
課題
このtfstateはデフォルトだと、terraform実行フォルダに作成されます。
そうなると複数人でTerraform構築を行いたい場合、誰かがapplyした際必ずチームメンバーにtfstateを共有する必要が出てきます。
そうしないと、他のメンバーのtfstateが古い状態になってしまうためです。
これを解決するのが、backendです。
Backendを書いていこう
backend設定で、tfstateファイルの配置をローカルでなく、S3等に変更することができます。
実際に設定を書いていきましょう。(私の場合はmain.tf)
terraform {
required_version = "1.11.3"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
# この記載を追記するだけ!
backend "s3" {
bucket = "バケット名"
key = "ディレクトリ名/xxxx.tfstate"
region = "ap-northeast-1"
}
}
bucketに書いたバケット名はあらかじめ手動で作成しておきます。
backendは最初に呼ばれるため、terraform内でS3バケットを作っていたとしても順番の問題でエラーが出ます。
上記を記載することで、tfstateファイルがS3上に作成されるようになります。
他の作業者も同じくS3を参照するようになるため、常に最新のtfstateファイルを参照できるようになるわけですね。
余談
既に構築済みのterraform環境のbackendを変更する場合、backend修正後に下記を行う必要があります。
# Backendの変更を反映
terraform init -reconfigure
# 現在のTerraformソースを元にtfstateファイルを作成
terraform init -migrate-state
Discussion