はじめに
この記事では、TerraformにおけるVariables(変数)とLocals(ローカル変数)の違いについて説明します。
TerraformにおけるVariable
Terraformでは、Variableを使用してTerraformモジュールに設定可能な入力値を提供します。これにより、モジュールのソースコードを変更せずに、モジュールの要素をカスタマイズすることが可能となり、修正なしでモジュールを再利用することができます。
定義上の制限事項
TerraformのVariableは、他のプログラミング言語とは異なり、定義時に条件式を許容しません。
variable "image_id" {
type = string
}
外部変数の上書き
Terraformで定義されたVariableは、外部から上書きすることができます。これにより、異なる環境や条件に基づいて値を調整する柔軟性が生まれます。
変数への値の設定
TerraformのVariableには、複数の方法で値を割り当てることができます。
apply実行時の対話型入力
terraform apply
コマンドを実行する際に、値が割り当てられていないVariableについては対話的に入力を求められます。
$ terraform apply
var.image_id
Enter a value:
コマンドラインでのオプション指定(-var、-var-file)
-var
または-var-file
オプションを使用して、コマンドラインから直接Variableの値を指定することもできます。
$ terraform apply -var="image_id=ami-abc123"
terraform.tfvarsファイルでの値の指定
Variableの値は、terraform.tfvars
ファイルで定義することができます。このファイルが存在する場合、Terraformは自動的に読み込みます。
image_id = "ami-abc123"
環境変数を使用した値の指定(TF_VAR_xxx)
Terraformは、TF_VAR_name
という名前の環境変数を読み取り、Variableの値を取得することも可能です。
$ export TF_VAR_image_id=ami-abc123
$ terraform apply
変数定義時のデフォルト値の設定
最後に、Variable定義内で直接デフォルト値を指定することもできます。このデフォルト値は、他の値が提供されていない場合に使用されます。
variable "image_id" {
type = string
default = "ami-abc123"
}
TerraformにおけるLocals
TerraformにおけるLocals(ローカル変数)は、名前付きの式であり、設定内で同じ値や式を繰り返し記述するのを避けるための便利な手段として使用されます。
定義時の条件式の使用
Variableとは異なり、ローカル変数では定義時に条件式(三項演算子)を使用することができます。
locals {
count = var.is_prod ? 1 : 0
}
部ソースからの上書き不可
Variableとは異なり、ローカル変数は外部ソースから上書きすることができません。これにより、Terraformの設定内で安定性と予測可能性を提供することができます。
複数回の定義が可能
ローカル変数は、設定内で複数回定義することができます。それぞれの定義で異なる値を指定することができます。
locals {
server_name = "hoge"
server_core = 1
server_memory = 2
}
VariableとLocalsのユースケース
tfファイル内でのLocalsの活用
tfファイル内で変数を扱う場合、設定の安定性を確保し、設定の繰り返しを減らすためにローカル変数を使用することが一般的です。例えば、設定内の複数の場所で共通の値や式を使用する場合、ローカル変数として一度定義し、その後はローカル変数の値を参照することができます。
locals {
common_value = "shared_among_resources"
}
resource "aws_instance" "example" {
ami = local.common_value
instance_type = "t2.micro"
}
resource "aws_ebs_volume" "example" {
availability_zone = "us-west-2a"
size = 40
tags = {
Name = local.common_value
}
}
外部入力が必要な場合のVariableの活用
ただし、外部ソースから値を入力する必要がある場合は、Variableの使用が不可欠です。
variable "instance_type" {
description = "The instance type to use for our EC2 Instance"
type = string
default = "t2.micro"
}
resource "aws_instance" "example" {
ami = "ami-abc123"
instance_type = var.instance_type
}
変数とローカル変数の使用に関する推奨事項
ローカル変数は複雑な式の整理や共通の値の再利用に適しており、Variableは設定の外部カスタマイズしたい場合に適しています。