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-rg2 つ目はファイルである。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 での例
# 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
}