lookup — mapから安全に値を取り出す関数

1. 概要

  • lookup関数の基本構文とデフォルト値の使い方
  • map["key"]との違い(キーが存在しない場合の挙動)
  • for_eachlookupの組み合わせパターン
  • try関数との比較

lookup(map, key, default)は、mapから指定したキーの値を安全に取り出す関数です。キーが存在しない場合にデフォルト値を返す点が、直接参照map["key"]との最大の違いです。


2. 基本構文

lookup(map, key, default)
# map:     検索対象のmap
# key:     取り出したいキー(文字列)
# default: キーが存在しない場合に返す値(省略可だがdeprecatedのため常に指定推奨)

注意: default引数はTerraform v0.7以降、省略することは非推奨(deprecated)です。省略するとmap["key"]と同等になります。必ず3引数で使用してください。

# terraform console で動作確認
> lookup({ dev = "t3.micro", prd = "t3.medium" }, "dev", "t3.micro")
"t3.micro"

> lookup({ dev = "t3.micro", prd = "t3.medium" }, "stg", "t3.micro")
"t3.micro"  # "stg" が存在しないためデフォルト値が返る

3. map[“key”]との違い

比較項目lookup(map, key, default)map["key"]
キーが存在しない場合デフォルト値を返すエラー
デフォルト値の指定第3引数で指定不可
用途オプション値・環境別設定必ず存在するキーの参照
locals {
  instance_types = {
    dev = "t3.micro"
    prd = "t3.medium"
  }
}

# ❌ キーが存在しない場合はエラーになる
# instance_type = local.instance_types["stg"]  # Error: invalid index

# ✅ lookupならデフォルト値で安全に対処できる
instance_type = lookup(local.instance_types, var.environment, "t3.micro")

4. 実用パターン

環境名でインスタンスタイプを切り替える

terraform {
  required_version = ">= 1.9"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

variable "environment" {
  description = "環境名(dev/stg/prd)"
  type        = string
  default     = "dev"
}

locals {
  instance_type_map = {
    dev = "t3.micro"
    stg = "t3.small"
    prd = "t3.medium"
  }
}

data "aws_ami" "amazon_linux_2023" {
  most_recent = true
  owners      = ["amazon"]
  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

resource "aws_instance" "app" {
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = lookup(local.instance_type_map, var.environment, "t3.micro")

  root_block_device {
    volume_size = 20
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    Name        = "${var.environment}-app"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

for_eachとlookupの組み合わせ

locals {
  # 環境ごとのデフォルト設定
  default_config = {
    instance_type = "t3.micro"
    volume_size   = 20
  }

  # 環境固有の設定(部分的に上書き)
  env_overrides = {
    prd = { instance_type = "t3.medium", volume_size = 100 }
    stg = { instance_type = "t3.small",  volume_size = 50  }
  }

  environments = toset(["dev", "stg", "prd"])
}

resource "aws_instance" "app" {
  for_each = local.environments

  ami           = data.aws_ami.amazon_linux_2023.id
  # 環境固有の設定があればそれを使い、なければデフォルト
  instance_type = lookup(
    lookup(local.env_overrides, each.key, {}),
    "instance_type",
    local.default_config.instance_type
  )

  tags = {
    Name        = "${each.key}-app"
    Environment = each.key
    ManagedBy   = "terraform"
  }
}

5. lookupより安全な書き方

Terraform 0.13以降では、try関数やlocal.map[key]のエラーキャッチが使えます。lookupより型安全な場合があります。

# lookupの第3引数(デフォルト値)は型が一致する必要がある
# 型が複雑な場合はtryを使う
instance_type = try(local.instance_type_map[var.environment], "t3.micro")

詳細は「coalesce / try / can関数の使い方」を参照。


6. 関連記事


7. まとめ

  • lookup(map, key, default) — mapからキーを検索し、存在しない場合はデフォルト値を返す
  • map["key"]はキーが存在しない場合にエラーになるため、存在しない可能性がある場合はlookupを使う
  • 環境別設定の切り替えや、オプション値に使うのが典型的なパターン
  • 型が複雑な場合や複数のフォールバックが必要な場合はtry関数も検討する

動作確認バージョン: Terraform >= 1.9 / AWS Provider ~> 5.0 公式ドキュメント: https://developer.hashicorp.com/terraform/language/functions/lookup