TL;DR

  • 入力変数は variable ブロックで宣言し、var.<変数名> で参照する。
  • 値は環境変数、tfvars ファイル、コマンド実行時の入力、デフォルト値で渡せる。

内容

第3章 Terraformをはじめようの 3.4 節。公式ドキュメントは https://developer.hashicorp.com/terraform/language/values/variables 。

Terraform の変数

変数を使う目的は、他のプログラミング言語と同じく、重複を減らすこと(DRY)である。他の言語と異なるのは、Terraform のコードを実行するときに値を入力できる点である。

変数は variable ブロックで宣言し、resource ブロックなどからは var.<変数名> で参照する。慣習として variables.tf ファイルにまとめて宣言する。

値の渡し方

1 つ目は環境変数で、TF_VAR_<変数名> の形で渡す。

export TF_VAR_rgname=example-rg

2 つ目はファイルである。terraform.tfvars、terraform.tfvars.json、*.auto.tfvars、*.auto.tfvars.json は自動で読み込まれる。

rgname = "Terraform-rg"

testing.tfvars のように他の名前を付けたファイルは、-var-file オプションで指定する。

terraform apply -var-file="testing.tfvars"

3 つ目はコマンド実行時の入力である。値が与えられていない変数があると、実行時に値を入力するよう求められる。

$ terraform apply
var.rglocation
Resource Group location like West Europe etc.
Enter a value:

4 つ目はデフォルト値で、variable ブロックの default に書く。

variable "rgname" {
  description = "リソースグループ名を指定する(必須)"
  type        = string
  default     = "example-rg"
}

同じ変数に複数の方法で値を渡した場合、公式ドキュメントによると、優先度の高い順に -var / -var-file オプション、*.auto.tfvars ファイル、terraform.tfvars.json、terraform.tfvars、環境変数、default となる。入力を求められるのは、default がなく、どの方法でも値が渡されなかったときである。

AWS での例

3.3 節の AWS のコードを、変数を使って書き換える。

# main.tf
resource "aws_instance" "web" {
  ami           = var.ami
  instance_type = var.instance_type
}
# variables.tf
variable "ami" {
  description = "AMI の名称を指定する"
  type        = string
}
 
variable "instance_type" {
  description = "インスタンスタイプの名称を指定する"
  type        = string
}

Google Cloud での例

3.3 節の Google Cloud のコードも、同じように書き換えられる。

# main.tf
resource "google_project" "my_project" {
  name       = var.myproject_name
  project_id = var.project_id
  org_id     = var.org_id
}
 
resource "google_app_engine_application" "app" {
  project     = google_project.my_project.project_id
  location_id = var.location_id
}
# variables.tf
variable "myproject_name" {
  description = "Google プロジェクト名を指定する"
  type        = string
}
 
variable "project_id" {
  description = "プロジェクトIDを指定する"
  type        = string
}
 
variable "org_id" {
  description = "組織IDを指定する"
  type        = string
}
 
variable "location_id" {
  description = "ロケーションを指定する"
  type        = string
}

キーワード