🔧
Terraformにおけるterraform.tfvarsとvariables.tfの関係性と挙動を理解する
terraform.tfvars
とvariables.tf
の関係性
TerraformにおけるTerraformでインフラストラクチャをコード化する際、変数の管理は重要な要素です。特にvariables.tf
とterraform.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.tf
のdefault
値が使用されます
デフォルト値の使用条件
-
terraform.tfvars
や環境変数で値が設定されていない場合のみ、variables.tf
のdefault
値が使用されます -
default
値が設定されておらず、他の方法でも値が提供されていない場合、Terraformは実行時に値の入力を求めます
実例
-
variables.tf
でproject_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