Terraformの変数と変数ファイルの活用
はじめに
前回は、VPCとサブネットという相互に依存するリソースを構築しました。しかし、前回のコードはCIDRブロックやタグ名がテンプレートに直接書かれており、再利用が困難でした。今回は、Terraformの強力な機能である**変数(Variables)**を使い、テンプレートを柔軟で再利用しやすいものに改良する方法を解説します。
1. 変数(Variables)の定義
変数は、テンプレートの実行時に値を指定できるようにする機能です。これにより、コードを変更することなく、異なる環境や設定に対応できます。
変数は通常、variables.tfというファイルで定義します。
# variables.tf
variable "vpc_cidr_block" {
description = "VPCのCIDRブロック"
type = string
default = "10.0.0.0/16"
}
variable "public_subnet_cidr_block" {
description = "パブリックサブネットのCIDRブロック"
type = string
default = "10.0.1.0/24"
}
variable "private_subnet_cidr_block" {
description = "プライベートサブネットのCIDRブロック"
type = string
default = "10.0.2.0/24"
}
variable "availability_zone" {
description = "アベイラビリティゾーン"
type = string
default = "ap-northeast-1a"
}
variable "environment" {
description = "デプロイする環境名 (例: dev, staging, prod)"
type = string
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "環境名は dev, staging, prod のいずれかである必要があります。"
}
}
variable "project_name" {
description = "プロジェクト名"
type = string
default = "myproject"
}
variable "common_tags" {
description = "すべてのリソースに適用される共通タグ"
type = map(string)
default = {
ManagedBy = "Terraform"
}
}
変数定義のポイント
-
description: 変数の説明。terraform plan実行時に表示されるため、分かりやすく記述します -
type: 変数に期待するデータ型(string,number,bool,list,mapなど)を指定します -
default: 変数が指定されなかった場合のデフォルト値を設定します(オプション) -
validation: 変数の値に対する検証ルールを定義できます(オプション)
2. 変数の利用
定義した変数は、他の.tfファイル内でvar.プレフィックスを使って参照します。
# vpc.tf
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr_block
enable_dns_hostnames = true
enable_dns_support = true
tags = merge(var.common_tags, {
Name = "${var.project_name}-vpc-${var.environment}"
Environment = var.environment
})
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = var.public_subnet_cidr_block
availability_zone = var.availability_zone
map_public_ip_on_launch = true
tags = merge(var.common_tags, {
Name = "${var.project_name}-public-subnet-${var.environment}"
Environment = var.environment
Type = "Public"
})
}
resource "aws_subnet" "private" {
vpc_id = aws_vpc.main.id
cidr_block = var.private_subnet_cidr_block
availability_zone = var.availability_zone
tags = merge(var.common_tags, {
Name = "${var.project_name}-private-subnet-${var.environment}"
Environment = var.environment
Type = "Private"
})
}
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = merge(var.common_tags, {
Name = "${var.project_name}-igw-${var.environment}"
Environment = var.environment
})
}
このように変数を分離することで、VPCのCIDRブロックや環境名を変更したい場合に、変数の値を変更するだけで済みます。
3. 変数に値を渡す方法
Terraformの実行時に変数に値を渡す方法は複数あります:
3.1 コマンドライン引数
terraform apply -var="vpc_cidr_block=192.168.0.0/16" -var="environment=prod"
3.2 環境変数
export TF_VAR_environment="prod"
export TF_VAR_vpc_cidr_block="192.168.0.0/16"
terraform apply
3.3 対話形式
terraform planやapply実行時に、デフォルト値がない変数の値を入力するよう求められます。
3.4 変数ファイル(推奨)
最も一般的で管理しやすい方法です。
4. 変数ファイル(terraform.tfvars)の活用
terraform.tfvarsというファイルに変数とその値を記述することで、コマンドラインで毎回入力する手間を省けます。
# terraform.tfvars
# 開発環境の設定
project_name = "myapp"
environment = "dev"
vpc_cidr_block = "10.0.0.0/16"
public_subnet_cidr_block = "10.0.1.0/24"
private_subnet_cidr_block = "10.0.2.0/24"
availability_zone = "ap-northeast-1a"
common_tags = {
ManagedBy = "Terraform"
Project = "MyApp"
CostCenter = "Engineering"
}
terraform applyを実行すると、Terraformは自動的にterraform.tfvarsファイルを読み込み、変数を適用します。
💡 環境ごとの変数ファイル
開発環境と本番環境で異なる設定を管理したい場合は、環境ごとに変数ファイルを作成します:
# dev.tfvars
project_name = "myapp"
environment = "dev"
vpc_cidr_block = "10.0.0.0/16"
public_subnet_cidr_block = "10.0.1.0/24"
private_subnet_cidr_block = "10.0.2.0/24"
availability_zone = "ap-northeast-1a"
# prod.tfvars
project_name = "myapp"
environment = "prod"
vpc_cidr_block = "10.1.0.0/16"
public_subnet_cidr_block = "10.1.1.0/24"
private_subnet_cidr_block = "10.1.2.0/24"
availability_zone = "ap-northeast-1c"
デプロイ時に適用するファイルを指定します:
# 開発環境にデプロイ
terraform apply -var-file="dev.tfvars"
# 本番環境にデプロイ
terraform apply -var-file="prod.tfvars"
5. ベストプラクティス
5.1 変数ファイルの管理
-
terraform.tfvars: 機密情報を含む場合は.gitignoreに追加 -
terraform.tfvars.example: テンプレートとしてバージョン管理対象にする - 環境ごとの変数ファイルは適切に名前を付ける(
dev.tfvars,staging.tfvars,prod.tfvars)
5.2 変数の命名規則
- 分かりやすく一貫した命名を心がける
- 環境固有の情報は変数に分離する
- 複数の単語はアンダースコア(
_)で区切る
5.3 デフォルト値の設定
- 開発環境向けの安全なデフォルト値を設定
- 本番環境では明示的に値を指定することを推奨
まとめ
| 機能 | メリット |
|---|---|
| 変数の定義 | デプロイ時の柔軟性を高め、コードの再利用性を向上させる |
| 変数の利用 | コードの重複をなくし、DRY(Don't Repeat Yourself)原則を遵守する |
| 変数ファイル | 設定を外部化し、環境ごとの管理を容易にする |
| バリデーション | 不正な値の入力を防ぎ、インフラの安全性を確保する |
変数を適切に活用することで、単一のTerraformテンプレートで複数の環境や用途に対応できるようになります。これにより、コードの保守性が飛躍的に向上し、インフラ管理の効率化が図れます。
次回は、インフラの情報を外部に公開するOutputsと、既存のリソースをTerraform管理下に取り込むterraform importについて解説します。お楽しみに!