- OpenTofu言語
- 関数
- try
try
関数
try
関数は、引数の式を順番に評価し、エラーが発生しなかった最初の式の結果を返します。
これは、引数の評価時に発生するエラーをキャッチできる特別な関数であり、実装時に形状が不明な複雑なデータ構造を扱う場合に特に役立ちます。
たとえば、外部システムからJSONまたはYAML形式でデータを取得してデコードする場合、結果には設定が保証されていない属性が含まれている可能性があります。try
関数を使用して、予測可能な型を持つ正規化されたデータ構造を作成することで、構成の他の場所でより便利に使用できます。
locals {
raw_value = yamldecode(file("${path.module}/example.yaml"))
normalized_value = {
name = tostring(try(local.raw_value.name, null))
groups = try(local.raw_value.groups, [])
}
}
上記のローカル値式を使用すると、モジュールの他の場所で、エラーが発生する可能性のある属性の欠損を繰り返し確認および処理する必要なく、local.normalized_value
属性を参照できます。
try
関数を使用して、値が2つの異なる形式で提供される可能性のある状況に対処し、最も一般的な形式に正規化することもできます。
variable "example" {
type = any
}
locals {
example = try(
[tostring(var.example)],
tolist(var.example),
)
}
上記により、var.example
はリストまたは単一の文字列のいずれかになります。単一の文字列の場合、その文字列を含む単一要素のリストに正規化されます。これにより、構成の他の場所の式では、local.example
が常にリストであると想定できます。
この2番目の例には、どちらも失敗する可能性のある2つの式が含まれています。たとえば、var.example
が{}
に設定されている場合、文字列にもリストにも変換できません。try
関数がすべての式を実行しても成功しない場合、遭遇したすべての問題を説明するエラーを返します。
エラー処理がモジュールの単一の位置に限定され、モジュールの残りの部分は正規化された構造への単純な参照を使用できるため、将来の保守担当者にとってより読みやすくなるように、正規化を実行する式の特別なローカル値でのみtry
関数を使用することを強くお勧めします。
try
関数は、実行時まで不明なデータへのアクセスから生じる*動的*エラーのみをキャッチして処理できます。不正なリソース参照など、任意の入力に対して無効であることが証明できる式に関連するエラーはキャッチされません。
try
関数は、オブジェクト属性の存在と型を簡潔にテストするためだけに意図されています。技術的にはあらゆる種類の式を受け入れることができますが、上記の例に示すように、単純な属性参照と型変換関数でのみ使用することをお勧めします。エラーを抑制するためにtry
関数を過剰に使用すると、理解および保守が困難な構成になります。
例
> local.foo
{
"bar" = "baz"
}
> try(local.foo.bar, "fallback")
baz
> try(local.foo.boop, "fallback")
fallback
try
関数は、動的式評価の前であっても、不正な参照や宣言されていないトップレベルオブジェクトへの参照など、証明可能に無効な構成に関連するエラーはキャッチしません。
> try(local.nonexist, "fallback")
Error: Reference to undeclared local value
A local value with the name "nonexist" has not been declared.
関連関数
can
関数。これは式を評価しようと試み、成功したかどうかを示すブール値を返します。