tfvarsファイル — 変数に値を設定する環境別設定管理

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. 変数の優先順位(高い順)

同じ変数に複数の設定がある場合、以下の優先順位が適用されます。

  1. コマンドライン -varフラグ(最高優先度)
  2. *.auto.tfvars / terraform.tfvars
  3. -var-fileで指定したファイル
  4. 環境変数 TF_VAR_<変数名>
  5. 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. 関連記事


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