1. 概要
lookup関数の基本構文とデフォルト値の使い方map["key"]との違い(キーが存在しない場合の挙動)for_eachとlookupの組み合わせパターン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. 関連記事
- for_each — map/setで動的にリソースを作成するメタ引数
- for式の使い方
- locals(ローカル値)の使い方
- coalesce / try / can — nullとエラーを安全にハンドリングする関数
- length / keys / values / contains — コレクション検査
- merge / concat / flatten — mapとリストの結合・平坦化
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