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?

【Terraform】variable と locals、どっちに何を書くか毎回迷うので整理した

Last updated at Posted at 2026-01-07

はじめに

Terraformを触り始めてまだ日が浅いのですが、書いていて毎回止まるポイントがあります。

「この値、variable? locals?」

どっちも「変数」っぽいし、とりあえず動くから雑に書いてしまいがち…
でもあとから読むと「なぜここで locals?」みたいになることが多かったので、
自分なりに整理した内容をメモとして残します。


また、今回の変数まわりの考え方については、
Terraformで学ぶAWS(1): サーバーレスから始める再利用可能なインフラストラクチャ
をかなり参考にしています。

Terraformを学び始めた自分にとって、
「なぜそう書くのか」を丁寧に説明してくれる内容で、とても助けられています。

著者さま:https://qiita.com/koshian2

まず結論

最初に結論を書いておきます。

種類 役割
variable 外から値を渡したいとき
locals モジュールの中だけで使う値

外部入力か、内部用か
ここでほぼ決まるな、という理解になりました。

locals:モジュール内だけで使う値

locals は、Terraform のコードの中だけで完結する変数です。
外から値を渡すことはできません。

使いどころ(初心者目線)

  • 同じ値を何回も書くのがつらい
  • 文字列を組み立てたい
  • ちょっとした計算結果をまとめたい

例:localsで文字列を組み立てる

locals {
  app_name = "sample-app"
  replica  = 2
}

output "info" {
  value = "Application ${local.app_name} is running with ${local.replica} replicas."
}

terraform apply すると、こんな感じで出ます。

Application sample-app is running with 2 replicas.

学んだこと

  • 参照は local.<名前>
  • 外部から値は渡せない
  • 文字列結合するときは ${} が必要

AWSのリソース名に環境名を付ける、みたいな用途でよく使われそうだなと思いました。

variable:外部から値を受け取る変数

variable は、Terraformの外から値を渡すための変数です。

  • 環境ごとに値を変えたい
  • モジュールを再利用したい
  • 本番・検証で切り替えたい

こういうときは variable。

locals の例を variable で書き直す

variable "app_name" {
  type    = string
  default = "sample-app"
}

variable "replica" {
  type    = number
  default = 2
}

output "info" {
  value = "Application ${var.app_name} is running with ${var.replica} replicas."
}

このまま terraform apply すると、locals のときと同じ結果になります。

-var で一時的に値を変える

terraform apply 実行時に -var を付けると、
デフォルト値を上書きできます。

terraform apply -var="app_name=api"
Application api is running with 2 replicas.

複数もOK。

terraform apply -var="app_name=batch" -var="replica=1"
Application batch is running with 1 replicas.

ただ、毎回これを打つのは正直しんどいです。

terraform.tfvars:変数をまとめて書く

そこで使うのが terraform.tfvars

構成

.
├── main.tf
└── terraform.tfvars

main.tf(変数定義)

variable "app_name" {
  type    = string
  default = "sample-app"
}

variable "replica" {
  type    = number
  default = 2
}

output "info" {
  value = "Application ${var.app_name} is running with ${var.replica} replicas."
}

terraform.tfvars

app_name = "frontend"
replica  = 4

この状態で terraform apply すると、

Application frontend is running with 4 replicas.

になります。

環境ごとの設定を書く場所、という理解をしました。

変数の優先順位でちょっとハマった

Terraformの変数には優先順位があります。

高い順に:

  1. 環境変数
  2. terraform.tfvars
  3. -var オプション
  4. variable の default

「なんで値変わらないんだ?」と思ったら、
どこかで上書きされていることが多かったです。

自分なりの整理まとめ

今の自分の理解はこんな感じです。

  • 外から変えたい → variable
  • 中だけで使う → locals
  • variable を加工した結果 → locals

参考文献

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?