TerraformのStateファイル(tfstate)管理方法の比較とTerraform Cloudをおすすめしたい理由
こんな悩みや課題はありませんか?
- 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)が用意されます。
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)でした。