0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IaC超入門】30日でAWS CloudFormationとTerraformをマスターするロードマップ - 20日目: Terraformの変数と変数ファイルの活用

Posted at

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 planapply実行時に、デフォルト値がない変数の値を入力するよう求められます。

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について解説します。お楽しみに!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?