🧸

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