locals は、モジュール内で繰り返し現れる式に名前を付けて再利用するための仕組みです。命名規約やタグの共通化のような“変わりにくい規則”を一箇所に集約できます。
本稿は、Terraform Associate 受験者が理解しておくべき安定的な概念と、現場で効果が高い使い方に絞って解説します。
locals はモジュール内限定の名前付き式です。入力値ではなく、変換・結合・既定値の計算結果を指し示します。参照は local.<name> で行います。
テキストの定義順に評価されるわけではなく、依存グラフに基づき必要になった時点で評価されます。外部から上書きはできません。
| 概念 | 意味 | スコープ | 供給源 |
|---|---|---|---|
| locals | 計算済みの名前付き式 | 現在のモジュール | 変数・定数・他の式 |
| variable | 外部からの入力 | 現在のモジュール | tfvars/CLI/環境変数/親モジュール |
| output | モジュールの出力 | 現在のモジュール | モジュール内の値 |
| data source | 外部読み取り | 現在のモジュール | プロバイダ/API |
locals を中心にした値の流れ
クラウドやプロバイダごとに命名制約は異なりますが、共通して言えるのは“規則を一箇所に集約し、全リソースで使い回す”ことです。locals に命名の組み立てを集約すると、規約変更の影響範囲を局所化できます。
推奨は、組織・環境・アプリ・コンポーネントを配列にし、join で結合、lower で小文字化、必要に応じて substr で長さを制御する形です。禁止文字の置換が必要なときは regexreplace を使います。
以下は locals を使って命名とタグを一元化し、複数コンポーネントの名前を派生させる例です。プロバイダに依存しないよう、モジュール呼び出しで利用しています。
ポイントは、locals のみで規約を完結させ、モジュールにはできるだけ“完成済みの名前/タグ”を渡すことです。
locals による命名とタグの一元化(例)
variable "org" { type = string }
variable "environment" { type = string }
variable "app" { type = string }
variable "region" { type = string }
variable "extra_tags" { type = map(string) default = {} }
locals {
env = var.environment
app = var.app
component = "web"
name_parts = [var.org, local.env, local.app, local.component]
name = lower(join("-", compact(local.name_parts)))
name63 = substr(local.name, 0, 63)
tags_base = {
org = var.org
env = local.env
app = local.app
}
tags_common = merge(local.tags_base, var.extra_tags)
component_names = toset(["web", "api", "db"]) # 必要に応じて可変
component_map = { for c in local.component_names : c => lower(join("-", [var.org, local.env, local.app, c])) }
}
module "web" {
source = "./modules/web"
name_prefix = local.name
tags = local.tags_common
}
module "components" {
source = "./modules/component"
for_each = local.component_map
name = each.value
common_tags = local.tags_common
}環境差分は variable に寄せ、環境ごとの tfvars で値を供給します。locals はその差分を取り込み、命名・タグ・しきい値など“派生値”を作る担当に徹します。
terraform.workspace を名前に埋め込むことは可能ですが、本番・検証などの環境分離をワークスペースに任せる設計は推奨されません。環境は明示的な variable と tfvars で管理し、再現性を高めます。
locals はモジュール内でのみ有効で、親や子から上書き・参照はできません。共有したい場合は output 経由で値を公開し、親から子へは variable で渡します。
評価は宣言順ではなく依存グラフで行われます。locals が“早めに確定する”わけではないため、plan 時点で未確定の値が含まれると unknown として伝播します。循環参照はエラーになります。
Associate レベルでは、locals の役割と他要素(variables/outputs/data)との違い、スコープ、代表的な使い所(命名・タグ・計算済み定数)が問われやすいです。
現場での落とし穴は、locals を“設定”のように誤用することです。入力は variable、規約や派生は locals、公開は output という基本の型を守りましょう。
Associate
問題 1
組織の方針で、すべてのリソース名に org-env-app-component を小文字かつハイフン区切りで含める必要があります。Terraform で最も適切な実装はどれですか。
正解: A
命名規約のような派生・固定ロジックは locals に一元化し再利用するのが最適です。B は重複増大、C は output の用途外、D はワークスペース依存の設計を助長するため不適切です。
locals と variables の違いは何ですか?
variables は外部から供給される入力値、locals はその値や定数から派生する計算済みの名前付き式です。locals は上書きできず、モジュール外から直接渡すこともできません。
親モジュールから子モジュールの locals を上書きできますか?
できません。locals はモジュール内部の実装詳細です。共有したい値は子モジュールの output として公開し、親から別の子に渡す場合は variable を使います。
locals はリソース属性を参照できますか?評価順序はどうなりますか?
参照できます。Terraform は依存グラフに基づき評価するため、記述順に依存しません。ただし plan 時点で未確定の値は unknown として locals にも伝播し、locals によって確定させることはできません。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける
Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...
Terraform Authoring & Ops Pro: 上位資格の範囲と対策
上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...
Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす
Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...
Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義
Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...
Terraform Data Source徹底理解:既存リソースの参照で壊さず足す
Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...