💭

複数の Terraform Backend を1つのS3バケットで管理する

に公開

はじめに

Terraformでインフラを構築していると、プロジェクト/環境ごとに複数のStateファイルを管理する場面が出てくると思います。一方で、Stateファイル毎にS3を作ると、S3が増えすぎて管理が煩雑になってしまうことも。
そんなときに使える「複数の Terraform Backend を1つのS3バケットで管理する方法」を紹介します。

なぜ複数のbackendが必要?

Terraformでは状態ファイル(state)を共有してインフラの状態を管理しますが、以下のような理由でbackendを分けることがよくあります

  • 開発 / ステージング / 本番 など環境ごとに分離したい
  • アプリごとにTerraform構成を分けて管理している

それぞれの構成で別のbackendを定義する必要があり、そのたびにS3バケットを作ってしまうと管理が大変です。

keyの指定を工夫して1つのS3バケットに集約

Terraform の backend "s3"key に階層的なパスを指定することで、1つのバケットに複数のstateファイルを格納することができます。

app1/dev/main.tf
terraform {
  backend "s3" {
    bucket       = "my-terraform-backend"
    key          = "app1/dev/terraform.tfstate"
    region       = "ap-northeast-1"
    use_lockfile = true
  }
}

別の構成でもこんな感じに、同じバケットで key のパスだけ変えるだけでヨシ 👍

app2/stg/main.tf
terraform {
  backend "s3" {
    bucket       = "my-terraform-backend"
    key          = "app2/stg/terraform.tfstate"
    region       = "ap-northeast-1"
    use_lockfile = true
  }
}

Terraform 1.11 で GA になった S3 Native State Locking もしっかり効いてくれます 🎉

Discussion