本文へスキップ

one関数

one関数は、要素数が0個または1個のリスト、セット、またはタプル値を受け取ります。コレクションが空の場合、one関数はnullを返します。そうでない場合、one関数は最初の要素を返します。要素が2個以上ある場合、one関数はエラーを返します。

これは、条件付きアイテムが0個または1個の要素を持つリストとして表される一般的な状況(モジュール作成者がnullになる可能性のある単一の値を返すことを望む場合)を対象とした特殊な関数です。

例:

コードブロック
variable "include_ec2_instance" {
type = bool
default = true
}

resource "aws_instance" "example" {
count = var.include_ec2_instance ? 1 : 0

# (other resource arguments...)
}

output "instance_ip_address" {
value = one(aws_instance.example[*].private_ip)
}

上記のaws_instanceリソースではcount引数が条件付きの式に設定されているため、aws_instance.exampleの値は0個または1個の要素を持つリストになります。instance_ip_address出力値は、one関数を簡潔な方法で使用して、単一インスタンスのプライベートIPアドレスまたはインスタンスが作成されなかった場合はnullを返します。

「スプラット」演算子との関係

OpenTofu言語には、スプラット演算子として知られる組み込み演算子[*]があり、その機能の1つは、nullの可能性があるプリミティブ値を0個または1個の要素を持つリストに変換することです。

コードブロック
variable "ec2_instance_type" {
description = "The type of instance to create. If set to null, no instance will be created."

type = string
default = null
}

resource "aws_instance" "example" {
count = length(var.ec2_instance_type[*])

instance_type = var.ec2_instance_type
# (other resource arguments...)
}

output "instance_ip_address" {
value = one(aws_instance.example[*].private_ip)
}

この場合、one関数は、ある意味では、プリミティブ型の値に[*]を適用することの逆であることがわかります。スプラットは、nullの可能性のある値を0個または1個のリストに変換でき、one関数はそれを元に戻して、nullの可能性のあるプリミティブ値を返すことができます。

コードブロック
> one([])
null
> one(["hello"])
"hello"
> one(["hello", "goodbye"])

Error: Invalid function argument

Invalid value for "list" parameter: must be a list, set, or tuple value with
either zero or one elements.

セットでのoneの使用

one関数は、要素数が0個または1個であることがわかっているセットがある場合に特に役立ちます。セット値はインデックス付けをサポートしていないため、セットの「最初の」要素を抽出するためにvar.set[0]を書くことは無効ですが、要素が1つしかないことがわかっている場合は、oneを使用してその単一要素を分離して返すことができます。

コードブロック
> one(toset([]))
null
> one(toset(["hello"]))
"hello"

2つ以上の要素を含む可能性のあるセットではoneを使用しないでください。この関数は、その場合に失敗します。

コードブロック
> one(toset(["hello","goodbye"]))

Error: Invalid function argument

Invalid value for "list" parameter: must be a list, set, or tuple value with
either zero or one elements.