はじめに
今回は、Terraformを使用する際に見かける各ファイルについてまとめてみました。
少しでもご参考になれば幸いです。
ファイルはTerraformコマンド実行時に作成/更新されるため、前提知識としてこちらの記事もぜひご参照ください。
全体構成イメージ
project/
├── main.tf
├── provider.tf
├── variables.tf
├── outputs.tf
├── dev.tfvars
├── stg.tfvars
├── prod.tfvars
├── backend.tf
├── modules/
│ ├── vpc/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ ├── outputs.tf
│ │
│ └── ec2/
│ ├── ec2.tf
│
├── terraform.tfstate
├── terraform.tfstate.backup
├── .terraform/
├── .terraform.lock.hcl
└── .gitignore
各ファイルまとめ
① .tf(メインの定義ファイル)
インフラの「設計書」そのものです。
以下のセクションで構成されています。
・Provider(操作対象の外部サービスを定義)
・Resource(EC2, S3など)
・Module(再利用構成)
・Backend(state保存先)
同じディレクトリ内の .tf は最終的に自動で一つに結合されます。
→そのため、ファイル名は自由です(例:main.tf, vpc.tf, ec2.tf)
※main.tfがよく使われますが、必須ではありません
実務では、.tfファイルは以下のように責務ごとに分割して定義されます。
main.tf # 全体のエントリ(わかりやすくするため)
provider.tf # provider定義
vpc.tf # ネットワーク定義
ec2.tf # サーバー定義
variables.tf # 変数定義
outputs.tf # 出力定義
② .tfvars(変数値ファイル)
.tfで定義したTerraformの変数(variable)に値を渡すための専用ファイルです。
使用例:
variable "instance_type" {
type = string
}
variable "ami" {
type = string
}
instance_type = "t3.micro"
ami = "ami-0abcdef1234567890"
環境ごとの差分管理(dev/prodなど)に最適です。
dev.tfvars
stg.tfvars
prod.tfvars
基本は-var-fileオプションで明示的に読み込みますが、ファイル名をterraform.tfvarsもしくは*.auto.tfvarsにすると、自動読み込みさせることができます。
// dev.tfvars使用時
terraform apply -var-file=dev.tfvars
// terraform.tfvars/*.auto.tfvars使用時
terraform apply
.tfvarsには機密情報を記載するケースが多いため、Git管理に注意が必要です(.gitignore推奨)
*.tfvars
また、本番環境では機密情報は外部から取得するのが推奨されています。
data "aws_secretsmanager_secret_version" "db" {
secret_id = "prod/db/password"
}
③ .tfstate(状態ファイル)/.tfstate.backup
実際に作られているインフラの状態を記録するファイルです。
初回はterraform applyコマンド実行時に作成されます。
このファイルが、Terraformが「差分」を判断する基準となります。
破損すると復旧が困難なため、手動編集は基本NGです。
また、terraform destroyコマンド実行時に.tfstate.backupファイルが作成されます。
これらファイルも機密情報を含むため、Git管理に注意が必要です(.gitignore推奨)
*.tfstate
*.tfstate.backup
④ .terraform.lock.hcl(ロックファイル)
使用するProviderのバージョンを固定するためのファイルです。
npmのpackage-lock.jsonと同じ役割を持っています。
provider "registry.terraform.io/hashicorp/aws" {
version = "5.0.0"
}
また、Terraformはコマンド実行の際にProviderへの接続情報としてこのファイルを参照しています。
このファイルはチームで同じバージョンを使うためGit管理します。
⑤ .terraform/ ディレクトリ
Terraformの内部管理用フォルダです。
providerのダウンロードファイルや、moduleのキャッシュなどが含まれます。
このディレクトリは環境依存かつ容量が大きいため、Git管理しません
.terraform/