Terrafromのバックエンド(Backend)とは?
Terraformを使っていて、「バックエンド」について疑問に思うことが多かったので調べてまとめました。
2024年4月30日
Terraformを使い始めて思うこと
Cloudflareを管理するために、Terraform
を使い始めました。従来自宅サーバーの構成管理はAnsible
を使っていたので、同じようなInfrastructure As Code(IaC)ツールと考えていました。少し触った感想としては、Terraformの方がワークスペース内で、terraform plan
やterraform apply
コマンドを実行するだけで済むので、シンプルな印象を受けました。
一方で、TerraformはCloudflareなど管理対象システムの状態をバックエンド
としてワークスペース内に保持するらしく、このバックエンドを理解しないと使いこなせないと感じました。Cloudflareの管理ページから変更を行ってしまうと、バックエンドと差異が生じて、terraform plan
コマンドがエラーになってしまうことが度々ありました。
Planning failed. Terraform encountered an error while generating this plan.
╷
│ Error: error finding Teams List "<cloudflare_team_list_id>": invalid list id
│
│ with cloudflare_teams_list.example,
│ on list_item.tf line 1, in resource "cloudflare_teams_list" "example":
│ 1: resource "cloudflare_teams_list" "example" {
│
╵
Terraformのバックエンド(Backend)とは?
何はともあれ、HashiCorpが公開している公式ドキュメントを読んでみましたが、最初はバックエンド
が管理対象のクラウドサービスを指していると読み取っていました。
そんな中で、terraform initコマンドの解説ページのBackend Initializetionを読んだところで、間違いに気づきました。
During init, the root configuration directory is consulted for backend configuration and the chosen backend is initialized using the given configuration settings.
Terraformの設定ファイル(.tfファイル)に書かれたバックエンドの設定が参照されて、そのバックエンドが設定にしたがって初期化されると書かれています。
また、Backend Configurationページには次のように書かれていました。
A backend defines where Terraform stores its state data files.
つまり、Terraformにおいてバックエンド
とは状態ファイル(stete data files)を保存する場所のことを意味していると理解しました。
この保存場所はデフォルトでlocal
になっていて、tfファイルへ次のようにbackend
ブロックを追加すると、任意のフォルダーへ作成することもできるようです。
terraform {
backend "local" {
path = "relative/path/to/terraform.tfstate"
}
}
ただ、ローカルで管理してしまうと複数人で共同管理する際に、最新のバックエンドが参照できなくなって困ってしまいました。そのような運用をするときのためにAzureやAWS S3などクラウド上にバックエンドを構築するオプションもあるようです。AWS S3の場合は次のようなバックエンドブロックになるようです。
terraform {
backend "s3" {
bucket = "mybucket"
key = "path/to/my/key"
region = "us-east-1"
}
}
バックエンドに保存されるファイル
Terraformのバックエンドとは状態ファイルを保存する場所であることがわかりましたが、それでは状態ファイルとは何なのでしょうか? それについては公式ドキュメントのStateページで説明されていました。
Terraform must store state about your managed infrastructure and configuration. This state is used by Terraform to map real world resources to your configuration, keep track of metadata, and to improve performance for large infrastructures.
This state is stored by default in a local file named "terraform.tfstate", but we recommend storing it in HCP Terraform to version, encrypt, and securely share it with your team.
状態ファイルとはterraform.tfstate
ファイルのことで、確かにワークスペースに自動で作成されていました。実際のインフラの代わりにこのファイルを使うことで、大規模なインフラ環境でも素早く設定変更できるメリットがあるようです。
まとめ
Terraformにおいてはバックエンドとそこに保存されている状態ファイル(terraform.tfstate)の役割がとても重要だと理解しました。 状態ファイルと実際のインフラに差異が発生してしまった場合の復旧方法や、terraformの各コマンドで状態ファイルにどのような変更が加えられるのかなど、もっと調べたいと思います。