1. 概要
terraform.tfvarsと*.auto.tfvarsの自動読み込み-var-fileフラグで任意のtfvarsを指定する方法- 環境別tfvars(dev.tfvars / prd.tfvars)のパターン
- 変数の優先順位(環境変数・コマンドライン・tfvars)
- tfvarsに書いてはいけないもの(シークレット)
tfvarsファイルは、variableブロックで定義した変数に実際の値を設定するファイルです。コードと値を分離することで、同じTerraformコードを環境ごとに使い回せます。
2. 基本的な使い方
variable定義とtfvarsの関係
# variables.tf(変数の定義)
variable "environment" {
description = "環境名"
type = string
# defaultは定義しない → tfvarsで必ず指定させる
}
variable "instance_type" {
description = "EC2インスタンスタイプ"
type = string
default = "t3.micro" # defaultがあるとtfvarsは省略可能
}
variable "tags" {
description = "共通タグ"
type = map(string)
default = {}
}
# terraform.tfvars(変数に値を設定)
environment = "dev"
instance_type = "t3.micro"
tags = {
Project = "myapp"
ManagedBy = "terraform"
}
3. 自動読み込みされるファイル名
以下の名前のファイルは、terraform plan / apply 実行時に自動的に読み込まれます。
| ファイル名 | 自動読み込み |
|---|---|
terraform.tfvars | ✅ 自動 |
terraform.tfvars.json | ✅ 自動 |
*.auto.tfvars | ✅ 自動 |
*.auto.tfvars.json | ✅ 自動 |
dev.tfvars など任意の名前 | ❌ -var-fileで指定が必要 |
4. 環境別tfvarsのパターン
project/
├── main.tf
├── variables.tf
├── providers.tf
├── dev.tfvars ← 開発環境
├── stg.tfvars ← ステージング環境
└── prd.tfvars ← 本番環境
# dev.tfvars
environment = "dev"
instance_type = "t3.micro"
volume_size = 20
tags = {
Environment = "dev"
ManagedBy = "terraform"
}
# prd.tfvars
environment = "prd"
instance_type = "t3.medium"
volume_size = 100
tags = {
Environment = "prd"
ManagedBy = "terraform"
}
# 環境別に-var-fileで指定して実行
terraform plan -var-file=dev.tfvars
terraform apply -var-file=dev.tfvars
terraform plan -var-file=prd.tfvars
terraform apply -var-file=prd.tfvars
5. 変数の優先順位(高い順)
同じ変数に複数の設定がある場合、以下の優先順位が適用されます。
- コマンドライン
-varフラグ(最高優先度) *.auto.tfvars/terraform.tfvars-var-fileで指定したファイル- 環境変数
TF_VAR_<変数名> variableブロックのdefault値(最低優先度)
# -varフラグは最も優先度が高い(tfvarsの値を上書きできる)
terraform apply -var-file=dev.tfvars -var="instance_type=t3.small"
# 環境変数での指定(CI/CD環境で便利)
export TF_VAR_environment="stg"
terraform apply -var-file=stg.tfvars
6. 完全な使用例
# variables.tf
terraform {
required_version = ">= 1.9"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
variable "environment" {
description = "環境名(dev/stg/prd)"
type = string
}
variable "instance_type" {
description = "EC2インスタンスタイプ"
type = string
default = "t3.micro"
}
variable "volume_size" {
description = "EBSボリュームサイズ(GiB)"
type = number
default = 20
}
variable "common_tags" {
description = "全リソースに付与する共通タグ"
type = map(string)
default = {}
}
# main.tf
data "aws_ami" "amazon_linux_2023" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-x86_64"]
}
}
resource "aws_instance" "app" {
ami = data.aws_ami.amazon_linux_2023.id
instance_type = var.instance_type
root_block_device {
volume_size = var.volume_size
volume_type = "gp3"
encrypted = true
}
tags = merge(var.common_tags, {
Name = "${var.environment}-app"
Environment = var.environment
ManagedBy = "terraform"
})
}
7. シークレット情報の扱い
DBパスワードやAPIキーをtfvarsにハードコードしてはいけません。 Gitに誤ってコミットするリスクがあります。
# ❌ 絶対NG: シークレットをtfvarsにハードコード
db_password = "MySecretPassword123!"
# ✅ 環境変数で渡す(Gitに残らない)
# export TF_VAR_db_password="MySecretPassword123!"
# ✅ AWS Secrets ManagerやSSM Parameter Storeから取得する(dataブロックを使う)
.gitignoreでシークレットを含むtfvarsを除外:
# 秘密情報を含むtfvarsは除外
secrets.tfvars
*secret*.tfvars
*.pem
8. 関連記事
- variable(入力変数)の使い方 — 変数の型制約・validation
- ディレクトリ構成ベストプラクティス — tfvarsの配置場所
- dataブロック(データソース)の使い方 — シークレットをSSMから取得
- backendの設定方法 — State管理との連携
- locals(ローカル値)— DRYなコードを書く
- 環境分離パターン比較 — workspace vs ディレクトリ
9. まとめ
terraform.tfvarsと*.auto.tfvarsは自動読み込み。任意の名前のファイルは-var-fileで指定- 環境ごとに
dev.tfvars/prd.tfvarsを用意し、-var-fileで切り替えるのが実務の定番 - 変数の優先順位:
-varフラグ > auto.tfvars >-var-file>TF_VAR_*> default - シークレット情報はtfvarsに書かない。環境変数かAWSシークレットストアを使う
- シークレットを含むtfvarsファイルは
.gitignoreで除外する
動作確認バージョン: Terraform >= 1.9 / AWS Provider ~> 5.0 公式ドキュメント: https://developer.hashicorp.com/terraform/language/values/variables#variable-definitions-tfvars-files