- OpenTofu言語
- 関数
- one
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.