🧩 Terraform 便利関数まとめ(主要カテゴリ別)
Terraform には、lookup() のように「map」「list」「string」「数値」などを安全・柔軟に扱うための便利なビルトイン関数がたくさんあります。
ここでは、カテゴリ別に体系的に整理します。Terraform を書く上で「実務で頻出&覚えると劇的に便利」なものを厳選しました。
🗺️ ① map / object / 構造体関連
| 関数 |
用途 |
例 |
| lookup(map, key, default) |
mapから安全に値を取得 |
lookup(var.env, "tags", {}) |
| merge(map1, map2, …) |
複数mapを統合(後勝ち) |
merge(local.base, var.override) |
| keys(map) |
mapのキー一覧を取得(list形式) |
keys(var.environments) |
| values(map) |
mapの値一覧を取得(list形式) |
values(var.environments) |
| zipmap(keys, values) |
2つのlistをmapに変換 |
zipmap(["a","b"], [1,2]) → {a=1,b=2} |
| tomap(value) |
listやobjectをmapに変換 |
tomap(local.obj) |
| coalesce(…) |
最初の非null値を返す |
coalesce(var.tag_override, var.default_tag) |
| try(expr, default) |
式が失敗したらdefaultを返す(lookupの上位互換) |
try(var.settings["value"], "default") |
💡 ポイント
-
lookup() は存在チェック用。
-
try() は「エラーごとキャッチ」できるためより安全。
📋 ② list / set / 配列操作系
| 関数 |
用途 |
例 |
| length(list) |
要素数を返す |
length(var.subnets) |
| element(list, index) |
指定位置の要素を取得(循環する) |
element(["a","b","c"], 4) → "b"
|
| index(list, value) |
要素の位置を返す |
index(["a","b","c"], "b") → 1
|
| contains(list, value) |
含まれているか判定 |
contains(var.azs, "ap-northeast-1a") |
| concat(list1, list2, …) |
リストを結合 |
concat(var.a, var.b) |
| flatten(list) |
ネストしたリストを1階層にする |
flatten([[1,2],[3,4]]) → [1,2,3,4]
|
| distinct(list) |
重複要素を除外 |
distinct(["a","b","a"]) → ["a","b"]
|
| sort(list) |
ソート |
sort(["c","a","b"]) → ["a","b","c"]
|
| toset(list) |
listをsetに変換(重複除去) |
toset(["a","a","b"]) |
| tolist(set) |
setをlistに変換 |
tolist(var.myset) |
| chunklist(list, size) |
指定サイズで分割 |
chunklist([1,2,3,4,5], 2) → [[1,2],[3,4],[5]]
|
💡 ポイント
-
flatten()、distinct()、concat() はモジュールで複数リソースを扱うときによく登場。
🔤 ③ string / テキスト操作系
| 関数 |
用途 |
例 |
| join(delim, list) |
リストを区切り文字で結合 |
join(",", ["a","b"]) → "a,b"
|
| split(delim, string) |
文字列を区切ってリスト化 |
split(".", "a.b.c") → ["a","b","c"]
|
| upper(string) |
大文字化 |
upper("dev") → "DEV"
|
| lower(string) |
小文字化 |
lower("PROD") → "prod"
|
| replace(string, old, new) |
置換 |
replace("abc", "a", "z") → "zbc"
|
| regex(regex, string) |
正規表現マッチで最初の結果を返す |
regex("[0-9]+", "ver123") → "123"
|
| regexall(regex, string) |
全マッチ結果を返す |
regexall("[a-z]", "abc123") → ["a","b","c"]
|
| format(fmt, args…) |
printf風フォーマット |
format("subnet-%03d", 5) → "subnet-005"
|
| trimspace(string) |
前後の空白除去 |
trimspace(" hello ") → "hello"
|
| substr(string, offset, length) |
部分文字列 |
substr("abcdef", 2, 3) → "cde"
|
💡 ポイント
- Terraform は YAML/JSON変換で文字列を多用するため、
join / replace / format は必須レベル。
🧮 ④ 数値 / 条件 / 論理演算系
| 関数 |
用途 |
例 |
| min(a, b, …) |
最小値 |
min(3,5) → 3
|
| max(a, b, …) |
最大値 |
max(3,5) → 5
|
| abs(num) |
絶対値 |
abs(-5) → 5
|
| ceil(num) |
切り上げ |
ceil(3.2) → 4
|
| floor(num) |
切り捨て |
floor(3.9) → 3
|
| coalesce(a, b, c) |
最初の非null値 |
coalesce(null, "x") → "x"
|
| try(expr, fallback) |
エラーになったら fallback |
try(var.data[0], "none") |
| can(expr) |
式が評価できるかboolで返す |
can(var.map["key"]) → true/false
|
| ternary(cond, a, b) |
条件演算子 |
var.flag ? "yes" : "no" と同義 |
💡 ポイント
- Terraformには if文がないため、
? : や coalesce()、try() が代わりになります。
🧱 ⑤ 型変換 / コレクションユーティリティ
| 関数 |
用途 |
例 |
| tolist(any) |
任意の値をlistに変換 |
tolist(var.myset) |
| toset(any) |
list→set変換 |
toset(["a","a","b"]) |
| tomap(any) |
object→map変換 |
tomap(local.config) |
| tostring(any) |
任意の型をstringに変換 |
tostring(var.number) |
| tonumber(string) |
stringをnumberに変換 |
tonumber("123") → 123
|
| jsonencode(any) |
HCLをJSON文字列に変換 |
jsonencode(var.config) |
| jsondecode(string) |
JSON文字列をHCL値に変換 |
jsondecode(file("config.json")) |
💡 ポイント
- API構築やLambdaなど「JSON入出力」を扱うときに
jsonencode/decode が非常に便利。
⏰ ⑥ 時間 / ランダム値系
| 関数 |
用途 |
例 |
| timestamp() |
現在のUTC時刻をISO8601形式で返す |
"2025-10-18T07:40:00Z" |
| uuid() |
ランダムUUIDを生成 |
"e7a2f1b8-..." |
| file(path) |
ファイルの内容を文字列で取得 |
file("user_data.sh") |
| filebase64(path) |
ファイルをbase64エンコードして取得 |
filebase64("cert.pem") |
🔄 ⑦ for式 / フィルタリング / map操作系
| 構文 |
用途 |
例 |
| [for x in list : expr] |
各要素を変換してlist生成 |
[for n in [1,2,3] : n*2] → [2,4,6]
|
| {for k,v in map : k => expr} |
各要素を変換してmap生成 |
{for k,v in var.map : k => upper(v)} |
| if 条件 |
フィルタリング |
{for k,v in var.map : k => v if v.enabled} |
| for_each |
リソースやモジュールの繰り返し |
for_each = var.instances |
💡 ポイント
- Terraform は命令的言語ではないので、for式と関数を組み合わせてデータを加工するのが基本設計。
🧠 よく使う関数組み合わせパターン(実務で超便利)
| 目的 |
使用関数 |
例 |
| mapにキーが存在しない場合に安全に取得 |
lookup() |
lookup(var.cfg, "region", "ap-northeast-1") |
| 複数タグをまとめる |
merge() + lookup()
|
merge(local.base, lookup(var.env,"tags",{})) |
| ネストlistをフラット化 |
flatten() |
flatten([aws_subnet.public, aws_subnet.private]) |
| 値の存在チェック |
contains() / can()
|
contains(var.azs, "ap-northeast-1a") |
| 複数mapを一括で結合 |
merge() + for
|
merge(var.common, { for k,v in var.env : k => v }) |
| JSON変換してLambdaへ渡す |
jsonencode() |
user_data = jsonencode(local.config) |
✅ まとめ
| カテゴリ |
主な関数 |
主な用途 |
| Map操作 |
lookup, merge, keys, values, zipmap, try
|
設定やタグのマージ・安全参照 |
| List操作 |
flatten, distinct, concat, contains
|
サブネットやリソース集合の加工 |
| 文字列操作 |
replace, join, split, format
|
名前生成・正規表現処理 |
| 型変換 |
tostring, tonumber, jsonencode/decode
|
データ交換・構成管理 |
| 条件系 |
coalesce, try, can
|
柔軟なデフォルト処理 |
| for式 |
[for ...], {for ...}
|
動的構築・filter処理 |