- OpenTofu言語
- 式
- スプラット式
スプラット式
スプラット式 は、for
式で実行できる一般的な操作を、より簡潔に表現する方法を提供します。
var.list
がすべて属性 id
を持つオブジェクトのリストである場合、id のリストは次の for
式で生成できます。
[for o in var.list : o.id]
これは、次の*スプラット式*と同等です。
var.list[*].id
特別な [*]
記号は、左側に指定されたリストのすべての要素を反復処理し、それぞれから右側に指定された属性名にアクセスします。スプラット式は、記号の右側に操作のシーケンスを拡張することにより、複雑な型のリストから属性とインデックスにアクセスするためにも使用できます。
var.list[*].interfaces[0].name
上記の式は、次の for
式と同等です。
[for o in var.list : o.interfaces[0].name]
マップを使用したスプラット式
上記のスプラット式のパターンは、リスト、セット、およびタプルにのみ適用されます。マップまたはオブジェクト値で同様の結果を得るには、for
式を使用する必要があります。
for_each
引数を使用するリソースは、式にオブジェクトのマップとして表示されるため、これらのリソースでスプラット式を使用することはできません。詳細については、リソースインスタンスの参照を参照してください。
単一値をリストとして扱う
スプラット式は、リスト、セット、またはタプルではない値に適用すると、特別な動作をします。
値がnull値以外の場合、スプラット式はそれを単一要素のリスト、より正確には単一要素のタプル値に変換します。値が*null*の場合、スプラット式は空のタプルを返します。
この特別な動作は、デフォルト値が null
であるオプションの入力変数を受け入れるモジュールで、値がないことを表す場合に役立ちます。これにより、モジュールはコレクションで動作するように設計されたOpenTofu言語機能に合わせて変数値を調整できます。例えば、
variable "website_setting" {
type = object({
index_document = string
error_document = string
})
default = null
}
resource "aws_s3_bucket" "example" {
# ...
dynamic "website" {
for_each = var.website_setting[*]
content {
index_document = website.value.index_document
error_document = website.value.error_document
}
}
}
上記の例では、dynamic
ブロックを使用しています。これは、コレクション値に基づいてゼロ個以上のネストされたブロックを生成します。入力変数 var.website_setting
はnullの可能性のある単一オブジェクトとして定義されているため、dynamic
ブロックの for_each
式は [*]
を使用して、モジュール呼び出し側がwebsite引数を設定した場合は1つのブロックを、呼び出し側がnullのままにした場合はゼロ個のブロックを確保します。
スプラット式のこの特別な動作は、慣れていない読者には明らかではないため、コンテキストがコレクションでの作業を暗示している for_each
引数や同様の状況でのみ使用することをお勧めします。そうでない場合、式の意図が将来の読者にとって不明瞭になる可能性があります。
レガシー (属性のみ) スプラット式
以前のバージョンのOpenTofu言語では、スプラット式のバージョンがわずかに異なっており、OpenTofuは下位互換性のために引き続きサポートしています。この古いバリアントは、上記の最新の形式ほど有用ではないため、新しい構成で使用することはお勧めしません。
レガシーの「属性のみ」スプラット式は、[*]
の代わりに .*
シーケンスを使用します。
var.list.*.interfaces[0].name
この形式の動作は微妙に異なり、次の for
式と同等です。
[for o in var.list : o.interfaces][0].name
属性のみのスプラット式では、インデックス操作 [0]
が反復処理自体の一部としてではなく、反復処理の結果に適用されることに注意してください。属性のルックアップのみが入力の各要素に適用されます。この制限は、古いバージョンのOpenTofuを使用している一部の人々を混乱させていたため、より一貫した動作を得るためには、常に [*]
を使用した新しいスタイルのスプラット式を使用することをお勧めします。