TerraformのStateファイル(tfstate)管理方法の比較とTerraform Cloudをおすすめしたい理由

Stateファイルの管理は、Terraform Cloudがおすすめ
2023.04.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんな悩みや課題はありませんか?

  • Stateファイルをどう管理したらいいのか分からない
  • Stateファイル管理用のS3やDynamoDBなどの構築・管理が面倒
  • Stateファイルの変更履歴を簡単に確認したい
  • Stateファイルは機密情報も含まれるから、しっかりアクセスコントロールしたい

そんな方にはTerraform Cloudをおすすめします。

StateファイルをTerraform Cloudで管理することで、以下のメリットが得られます。

  • Stateファイル管理用のリソースを用意する必要がない
  • Stateファイルの変更履歴をGUIで簡単に確認できる
  • Stateファイルの細かいアクセス制御をシンプルに実現できる

Terraform Cloudとは

Terraform Cloudは、Terraformをチームで利用するために必要な機能を提供しているサービスです。

以下のような機能があります。

  • Stateファイルの管理
  • デプロイパイプライン
  • ガバナンス機能
    • アクセスコントロール・ポリシー設定・監査ログ等
  • Private Registry
    • moduleやproviderを組織内に公開

本記事では、Stateファイルの管理について触れます。

ユーザー5人500 Resourcesまで無料のFreeプランがあり、Stateファイル管理の機能はFreeプランでも使用することができます。

HashiCorp Terraform: Enterprise Pricing, Packages & Features

Stateファイルの管理とは

TerraformのStateファイルとは、Terraformが管理するインフラストラクチャの状態を保存するファイルです。

このファイルは、Terraformが次回の適用時に前回の適用結果を参照し、状態の変更があれば新しい状態をStateファイルに反映します。 そのため、Stateファイルの管理が重要であり、誤った操作やStateファイルの紛失が起きると、インフラストラクチャに致命的な影響を与えることがあります。

Stateファイルの管理で、よく使われている方法は3つあります。

  • ローカル
  • クラウドストレージサービス(S3・Cloud Storage等)
  • Terraform Cloud

ローカル

ローカルマシン内ににStateファイルを保存する方法です。

デフォルト設定のため追加設定はいりません。

しかし、複数人で同じインフラを更新しようとする際に、競合が発生してStateファイルの整合性が維持できなくなることがあります。

そのため、チーム開発の場合は後述するクラウドストレージサービスやTerraformクラウドを選択するのが良いかと思います。

ストレージサービス(S3・Cloud Storage等)

ストレージサービスに保存する方法です。(AWSだったらS3、Google CloudだったらCloud Storage等)

外部ストレージに保存することで複数人で開発する場合も、Stateファイルの共有が簡単にできます。

DynamoDBなどのサービスと組み合わせることで、ロック機能も実現できます。 ロック機能を使うことで、Terraformでインフラを更新している最中はロックがかかり、競合が発生してStateファイルの整合性を維持できないといった状態を回避できます。

しかし、S3やDynamoDBなどStateファイル管理用のリソースを用意する必要があります。 AWSアカウントの数が多くなると、Stateファイル管理用のインフラが運用負荷になることがあります。

Terraform Cloud

Terraform CloudにStateファイルを保存する方法です。

ロック機能やバージョン管理機能がデフォルトでついています。 Stateファイル管理機能がTerraform Cloudにあるため、利用者は管理用のインフラを用意する必要がありません。

ユーザー5人まで無料のFreeプランがあり、State管理の機能はFreeプランでも利用することができます。

Terraform CloudでStateファイル管理するメリット

他の方法と比較して、Terraform CloudでStateファイルを管理するメリットを3つ紹介します。

Stateファイル管理用のリソースを用意する必要がない

S3やDynamoDBは簡単に作れるので環境の数が少ない場合は、作成にそこまで負担を感じないかもしれません。

しかし、環境数が増えるとStateファイル管理用のリソースを作成・管理する手間は大きくなっていきます。

また、Stateファイル管理用のリソースはTerraform以外の手段で作成することが推奨されています。 そのため、他の構成管理ツール(Cloudformation等)で作るかCLIで作るかなど悩ましいところがあります。

Terraform Cloudであれば、S3やDynamoDBなどのStateファイル管理用のリソースを用意する必要がありません。

CLI DrivenでTerraformを実行する場合は以下のような記述を追記して、terarform initを実行するだけでStateファイル置き場(Workspace)が用意されます。

backend.tf

terraform {
  cloud {
    organization = "<Organization名>"

    workspaces {
      name = "<Workspace名>"
    }
  }
}

Stateファイルの変更履歴をGUIで簡単に確認できる

以下のように変更履歴を一覧で確認できます。

履歴を選択すると、前のバージョンとの変更差分を確認できます。

Stateファイルのダウンロードもこの画面から可能です。

JSONをフィルタリングして、必要なデータだけを表示することもできます。

JSON Filtering - Terraform Cloud | Terraform | HashiCorp Developer

Stateファイルの細かいアクセス制御がシンプルに行える

Stateファイルには機密情報が含まれることがあります。

そのため、アクセス制御はしっかり行いたいです。

S3でも、バケットポリシーやIAMポリシーを設定することでStateファイル単位でアクセス制御ができます。 しかし、ファイルやバケット毎にポリシーを書くのはなかなか大変です。

Terraform Cloudでは、Stateファイル単位のアクセス制御が簡単に実現できます。

アクセス制御の最小単位は、Workspaceです。

WorkspaceはTerraformコードを管理するための単位で、Stateファイルごとに分けて作成できます。

以下のようにWorkspaceに対して、Team(ユーザーの集まり)にReadやAdminといった権限を割り当ててアクセス制御を行います。

JSONでポリシーを書く必要もありませんし、WorkspaceをまとめたProjectも合わせて使用することで、少ない手間で必要最小限の権限を割り当てることができます。

おわりに

Stateファイルの管理方法を3つ紹介して、Terraform Cloudのおすすめポイントを紹介しました。

S3などクラウドストレージで管理することも多いと思いますが、以下のメリットがあるためTerraform Cloudも検討してみてください。

  • Stateファイル管理用のリソースを用意する必要がない
  • Stateファイルの変更履歴をGUIで簡単に確認できる
  • Stateファイルの細かいアクセス制御をシンプルに実現できる

以上、AWS事業本部の佐藤(@chari7311)でした。

あわせて読みたい記事

参考