本文へスキップ

関数呼び出し

OpenTofu言語には、式内で値を変換および結合するために使用できる多くの組み込み関数があります。これらは演算子に似ていますが、すべて共通の構文に従います。

コードブロック
<FUNCTION NAME>(<ARGUMENT 1>, <ARGUMENT 2>)

関数名は、呼び出す関数を指定します。定義された各関数は、特定の数の引数(特定の値の型)を期待し、結果として特定の値の型を返します。

一部の関数は、任意の数の引数を取ります。たとえば、`min`関数は任意の数の数値引数を取り、数値的に最も小さいものを返します。

コードブロック
min(55, 3453, 2)

関数呼び出し式は、関数の戻り値として評価されます。

利用可能な関数

利用可能な関数の完全なリストについては、関数リファレンスを参照してください。

関数引数の展開

関数に渡す引数がリストまたはタプル値として利用可能な場合、その値は個別の引数に展開できます。リスト値を引数として提供し、その後に`...`記号を付けます。

コードブロック
min([55, 2453, 2]...)

展開記号は3つのピリオド(`...`)であり、Unicodeの省略記号文字(`…`)ではありません。展開は、関数呼び出しでのみ使用できる特別な構文です。

関数引数としての機密データの使用

機密データ(例:入力変数または機密として定義された出力)を関数引数として使用する場合、引数の機密情報は関数呼び出し中に追跡されます。

たとえば、機密入力変数を含むオブジェクトを`keys()`関数に渡すと、期待どおりすべてのキーを含むリストが返されますが、`values()`関数は最初の項目が機密であるリストを返すことになります。これはキー"a"の値が機密であるためです。

コードブロック
> local.baz
{
"a" = (sensitive value)
"b" = "dog"
}
> keys(local.baz)
[
"a",
"b",
]
> values(local.baz)
[
(sensitive value),
"dog",
]

OpenTofuによる関数呼び出し

OpenTofuの組み込み関数のほとんどは、プログラミング言語の用語では純粋関数です。これは、その結果は引数のみによって決定されることを意味し、OpenTofuがそれらをいつ呼び出すかは実際的な違いを生みません。

ただし、少数の関数は外部の状態とやり取りするため、OpenTofuがそれらを他のOpenTofu実行で発生するイベントと関連していつ呼び出すかを知ることは役立つ場合があります。

特殊な関数の小規模なセットには、`file``templatefile``timestamp`、および`uuid`が含まれます。これらの関数を使用していない場合は、このセクションを読む必要はありませんが、ここにある情報は興味深い背景情報となる可能性があります。

`file`関数と`templatefile`関数は、構成の静的な一部として含まれるファイルの読み取りを目的としており、OpenTofuは構成の他の処理を行う前に、初期構成検証の一部としてこれらの関数を実行します。つまり、構成によって計画の一部として、または適用ステップの一部としてディスク上に動的に生成される可能性のあるファイルを読み取るために、どちらの関数も使用できません。

`timestamp`関数は、OpenTofuが呼び出した時点の現在のシステム時間の表現を返し、`uuid`関数は、各呼び出しで異なるランダムな結果を返します。特別な動作がない場合、これらは両方とも、適用ステップでの最終的な構成が計画に示されているアクションと一致しない原因となり、OpenTofuの実行モデルに違反します。

そのため、OpenTofuは、計画ステップ中にこれらの関数が未知の値の結果を生成するように手配し、実際の結果は適用ステップでのみ決定されます。特に`timestamp`の場合、これは記録された時間がOpenTofuが変更の適用を開始した瞬間であり、OpenTofuが変更を計画した瞬間ではないことを意味します。

これらの関数の動作の詳細については、それぞれのドキュメントページを参照してください。