本文へスキップ

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関数は、実行時まで不明なデータへのアクセスから生じる*動的*エラーのみをキャッチして処理できます。不正なリソース参照など、任意の入力に対して無効であることが証明できる式に関連するエラーはキャッチされません。

コードブロック
> 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関数。これは式を評価しようと試み、成功したかどうかを示すブール値を返します。