Traffine I/O

日本語

2022-10-12

TerraformにおけるVariablesとLocalsの比較

はじめに

この記事では、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の値を取得することも可能です。

bash
$ 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は設定の外部カスタマイズしたい場合に適しています。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!