🔧

Terraformにおけるterraform.tfvarsとvariables.tfの関係性と挙動を理解する

に公開

Terraformにおけるterraform.tfvarsvariables.tfの関係性

Terraformでインフラストラクチャをコード化する際、変数の管理は重要な要素です。特にvariables.tfterraform.tfvarsの2つのファイルは、変数の宣言と値の設定において中心的な役割を果たします。この記事では、これらのファイルの関係性、デフォルト値の挙動について解説します。

基本的な役割

variables.tf

  • 変数の宣言を行うファイルです
  • 変数の型定義、説明、デフォルト値を設定します
  • インフラストラクチャのコードで使用する変数の「型」や「構造」を定義します
  • 例えば、VPCのCIDRブロックを定義する場合、variables.tfでは以下のように変数を宣言します
    ※ 全てのパラメータは必須ではありません
variables.tf
variable "vpc_cidr" {
  type        = string
  description = "CIDR block for the VPC"
  default     = "10.0.0.0/16"
}

terraform.tfvars

  • 宣言された変数の値を設定するファイルです
  • variables.tfで宣言された変数に具体的な値を割り当てます
  • 環境ごとに異なる設定値を管理するのに適しています
  • 例えば、terraform.tfvarsでは以下のように値を設定します:
terraform.tfvars
vpc_cidr = "20.0.0.0/16"  # 本番環境用のVPC CIDR

デフォルト値の挙動

優先順位

  • terraform.tfvarsで設定された値が最も優先されます
  • 次に環境変数(TF_VAR_変数名)が優先されます
  • 最後にvariables.tfdefault値が使用されます

デフォルト値の使用条件

  • terraform.tfvarsや環境変数で値が設定されていない場合のみ、variables.tfdefault値が使用されます
  • default値が設定されておらず、他の方法でも値が提供されていない場合、Terraformは実行時に値の入力を求めます

実例

  • variables.tfproject_idのデフォルト値が"ax00000"と設定されています
  • terraform.tfvarsではproject_id = "dev"と設定されています
  • 実際に適用される値は"dev"になります

変数定義の注意点

同じ変数に対する複数の値の定義

  • terraform.tfvars内で同じ変数に複数回値を割り当てた場合、最後の定義が優先されます
  • 例えば、以下のようにaws_regionが2回定義されている場合:
terraform.tfvars
# terraform.tfvars
aws_region = "us-west-1"
# 中略
aws_region = "ap-northeast-1"

実際に使用される値は2回目の定義の"ap-northeast-1"になります

変数が宣言されていない場合

  • variables.tfで宣言されていない変数をterraform.tfvarsで定義しても、その変数は使用されません
  • Terraformはエラーを出し、未定義の変数が指定されていることを警告します

実際の例を使った説明

実際のTerraformプロジェクトから具体例を見てみましょう。AWSのVPC(Virtual Private Cloud)のCIDRブロック設定を例に、変数の使用方法と挙動を詳しく解説します。

VPCのCIDRブロック設定

変数の宣言(variables.tf)

まず、variables.tfでVPCのCIDRブロックを変数として宣言します:

variables.tf
variable "vpc_cidr" {
  type        = string
  description = "CIDR block for the VPC"
  default     = "10.0.0.0/16"
}

この宣言の解説:

  • type: 型定義 - CIDRブロックは文字列として扱われます
  • description: 説明 - 変数の目的(VPCのネットワーク範囲設定)を明確に説明
  • default: デフォルト値 - 例として10.0.0.0/16を設定

リソースでの使用(main.tf)

main.tfでは、この変数を使ってVPCを作成します:

main.tf
resource "aws_vpc" "test_vpc" {
  cidr_block = var.vpc_cidr
}

このコードの特徴:

  • var.vpc_cidrで変数を参照し、VPCのCIDRブロックとして設定
  • この設定により、VPCの使用可能なIPアドレス範囲が決定される

環境別の設定(terraform.tfvars)

本番環境では異なるCIDR範囲を設定する例:

terraform.tfvars
vpc_cidr = "172.16.0.0/16"  # 本番環境用のアドレス範囲

この設定のポイント:

  • variables.tfのデフォルト値10.0.0.0/16より優先される
  • 172.16.0.0/16は別のプライベートIPアドレス範囲を指定
  • 本番環境用に独立したネットワーク空間を確保

変数設定の優先順位と動作

デフォルト値の使用

terraform.tfvarsで値が設定されていない場合:

terraform.tfvars
# vpc_cidr = "172.16.0.0/16"  # コメントアウトされている場合など

この場合:

  • variables.tfのデフォルト値10.0.0.0/16が使用される
  • VPCは10.0.0.0/16のCIDRブロックで作成される

環境変数での上書き

環境変数を使用してCIDRブロックを設定する場合:

.env
export TF_VAR_vpc_cidr="192.168.0.0/16"

この方法の特徴:

  • 環境変数の値が使用される(192.168.0.0/16のVPCが作成)
  • ただし、terraform.tfvarsでの設定がある場合はそちらが優先される

デフォルト値を設定せず、上書きもしていない場合

variables.tfで変数を宣言してデフォルト値を設定していない

variables.tf
variable "vpc_cidr" {}

さらに環境変数やterraform.tfvarsで変数を上書きしていない場合、terraform実行時に値の入力を求められます

var.vpc_cidr
  Enter a value:

まとめ

役割の違い

  • variables.tf:変数の宣言と型定義、オプションでデフォルト値を設定
  • terraform.tfvars:変数に具体的な値を割り当て

優先順位

  • terraform.tfvars > 環境変数 > variables.tfのデフォルト値

変数定義の注意点

  • terraform.tfvars内で同じ変数が複数回定義された場合は最後の定義が優先
  • variables.tfで宣言されていない変数をterraform.tfvarsで定義するとエラーになる

ベストプラクティス

  • variables.tf:すべての変数を適切な型と説明で宣言し、可能な限りデフォルト値を設定
  • terraform.tfvars:環境固有の値や機密情報を設定(通常はバージョン管理から除外)
  • terraform.tfvars.example:サンプル値を含むテンプレートとして提供(実際の使用時にコピーしてterraform.tfvarsとして使用)

Terraformでの変数管理を適切に行うことで、環境間での設定の違いを効率的に管理し、安全かつ再利用可能なインフラストラクチャコードを作成することができます。

Discussion