1. 概要
coalesce— 最初の非null・非空文字列値を返すcoalescelist— 最初の非空listを返すtry— エラーになる式を評価し、失敗したらデフォルト値を返すcan— 式がエラーなく評価できるかを確認する(bool)lookupとの使い分け
coalesce・try・canはTerraformでnullやエラーを安全にハンドリングするための関数です。optional変数やネストした構造から値を取り出すときに使います。
2. coalesce — 最初の非null値を返す
coalesce(v1, v2, ...)は、引数を左から評価し、最初のnull以外・非空文字列の値を返します。
# terraform consoleで確認
> coalesce(null, null, "default")
"default"
> coalesce("", "fallback")
"fallback" # 空文字列もスキップされる
> coalesce("first", "second")
"first" # 最初の非null・非空文字列を返す
> coalesce(null, "b", "c")
"b"
変数のデフォルト値フォールバック
terraform {
required_version = ">= 1.9"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
variable "custom_ami_id" {
description = "カスタムAMI ID(未指定の場合はAmazon Linux 2023を使用)"
type = string
default = null # nullをデフォルトにして「未指定」を表現
}
data "aws_ami" "amazon_linux_2023" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-x86_64"]
}
}
resource "aws_instance" "app" {
# custom_ami_idが指定されていればそれを使い、nullならデフォルトAMIを使う
ami = coalesce(var.custom_ami_id, data.aws_ami.amazon_linux_2023.id)
instance_type = "t3.micro"
root_block_device {
volume_size = 20
volume_type = "gp3"
encrypted = true
}
tags = {
Name = "app"
Environment = "dev"
ManagedBy = "terraform"
}
}
coalescelist — 最初の非空listを返す
# terraform consoleで確認
> coalescelist([], ["a", "b"])
["a", "b"] # 最初の空listをスキップ
> coalescelist(["x"], ["a", "b"])
["x"] # 最初の非空listを返す
3. try — エラーを握りつぶしてデフォルト値を返す
try(expr1, expr2, ...)は、最初にエラーなく評価できた式の値を返します。存在しないキーへのアクセスやnullのフィールド参照に便利です。
# terraform consoleで確認
> try({"a" = 1}["b"], "default")
"default" # キー"b"が存在しないためエラー → "default"を返す
> try(null.field, "fallback")
"fallback" # nullのフィールドアクセスがエラー → "fallback"を返す
> try("success", "fallback")
"success" # 最初の式が成功 → "success"を返す
オプショナルなネスト構造から値を取り出す
variable "instance_config" {
description = "インスタンス設定"
type = object({
instance_type = string
# monitoringは省略可能(optional、Terraform 1.3以降)
monitoring = optional(object({
enabled = bool
retention_days = optional(number, 7)
}))
})
default = {
instance_type = "t3.micro"
monitoring = null # monitoringを省略
}
}
locals {
# monitoring.retention_daysが存在しなければ14日をデフォルト
retention_days = try(var.instance_config.monitoring.retention_days, 14)
}
tryでlookupの代替
local {
instance_type_map = {
dev = "t3.micro"
prd = "t3.medium"
}
# lookupのデフォルト値と同じ動作
instance_type = try(local.instance_type_map[var.environment], "t3.micro")
# ↑ lookup(local.instance_type_map, var.environment, "t3.micro") と等価
}
4. can — 式がエラーなく評価できるかを確認する
can(expr)は、式がエラーなく評価できればtrue、エラーになればfalseを返します。validationブロックでの値チェックに使います。
# terraform consoleで確認
> can({"a" = 1}["a"])
true
> can({"a" = 1}["b"])
false # キーが存在しないためエラー
> can(regex("^[a-z]+$", "hello"))
true
> can(regex("^[a-z]+$", "Hello123"))
false
validationブロックでの使用
variable "bucket_name" {
description = "S3バケット名(英小文字・数字・ハイフンのみ)"
type = string
validation {
# regexがエラーなく評価できれば(パターンにマッチすれば)OK
condition = can(regex("^[a-z0-9-]+$", var.bucket_name))
error_message = "バケット名は英小文字、数字、ハイフンのみ使用できます。"
}
validation {
condition = length(var.bucket_name) >= 3 && length(var.bucket_name) <= 63
error_message = "バケット名は3〜63文字にしてください。"
}
}
5. try / coalesce / lookupの使い分け
| 関数 | 用途 | デフォルト値の型 |
|---|---|---|
coalesce(v1, v2) | null・空文字列のフォールバック | 同じ型 |
coalescelist(l1, l2) | 空listのフォールバック | list |
lookup(map, key, default) | mapからキーで検索(キー存在チェック) | 任意 |
try(expr, default) | 任意のエラーをキャッチ | 任意 |
can(expr) | エラー有無をboolで確認 | bool |
# ネストしたオプション属性の取り出し → try が最適
value = try(var.config.optional_field.sub_field, "default")
# mapからキーが存在しない場合のデフォルト → lookup
value = lookup(local.type_map, var.environment, "t3.micro")
# null変数のフォールバック → coalesce
value = coalesce(var.override_value, local.default_value)
6. 関連記事
- lookup関数の使い方 — mapからの安全な値取り出し
- 条件式(三項演算子)の使い方 — シンプルな条件分岐
- variable(入力変数)の使い方 — optional型とvalidation
- 型システム入門 — null型の扱い
- for式 — リスト・mapを変換・フィルタリング
- 「Inconsistent result types」エラーの解決方法
7. まとめ
coalesce(v1, v2, ...)— 最初のnull以外・非空文字列を返す。null変数のデフォルト値に使うcoalescelist(l1, l2, ...)— 最初の非空listを返すtry(expr, default)— エラーになる式を安全に評価。ネストした構造のオプション属性取得に最適can(expr)— 式がエラーなく評価できるかをboolで返す。validationブロックでのパターンチェックに使うlookupは「mapのキー存在チェック」、tryは「任意のエラーキャッチ」と使い分ける
動作確認バージョン: Terraform >= 1.9 公式ドキュメント: https://developer.hashicorp.com/terraform/language/functions/try