coalesce / try / can — nullとエラーを安全にハンドリングする関数

1. 概要

  • coalesce — 最初の非null・非空文字列値を返す
  • coalescelist — 最初の非空listを返す
  • try — エラーになる式を評価し、失敗したらデフォルト値を返す
  • can — 式がエラーなく評価できるかを確認する(bool)
  • lookupとの使い分け

coalescetrycanは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. 関連記事


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