- OpenTofu言語
- チェック
チェック
check
ブロックは、通常のリソースライフサイクルの外でインフラストラクチャを検証できます。チェックブロックは、適用後とインフラストラクチャの機能検証の間のギャップに対処します。
チェックブロックを使用すると、OpenTofuのプランまたは適用操作の全体的なステータスに影響を与えることなく、すべてのOpenTofuプランまたは適用操作で実行されるカスタム条件を定義できます。チェックブロックは、OpenTofuがインフラストラクチャを計画またはプロビジョニングした後、プランまたは適用の最後のステップとして実行されます。
構文
check
ブロックは、ローカル名、0個または1個のスコープ付きデータソース、および1個以上のアサーションで宣言できます。
次の例では、Webサイトをロードし、期待されるステータスコード200
が返されることを検証します。
check "health_check" {
data "http" "opentofu_org" {
url = "https://www.opentofu.org"
}
assert {
condition = data.http.opentofu_org.status_code == 200
error_message = "${data.http.opentofu_org.url} returned an unhealthy status code"
}
}
スコープ付きデータソース
check
ブロック内のスコープ付きデータソースとして、任意のプロバイダーの任意のデータソースを使用できます。
check
ブロックには、ネストされた(別名、スコープ付き)データソースをオプションで含めることができます。このdata
ブロックは、外部のデータソースのように動作しますが、囲んでいるcheck
ブロックの外で参照することはできません。さらに、スコープ付きデータソースのプロバイダーがエラーを発生させた場合、それらは警告としてマスクされ、OpenTofuが操作の実行を継続することを妨げません。
スコープ付きデータソースを使用して、通常OpenTofuリソースライフサイクルの外でインフラストラクチャの状態を検証できます。上記の例では、opentofu_org
データソースのロードに失敗した場合、check
ブロックの外でこのデータソースを宣言した場合に発生するブロックエラーではなく、警告が表示されます。
メタ引数
スコープ付きデータソースは、depends_on
およびprovider
メタ引数をサポートしています。スコープ付きデータソースは、count
またはfor_each
メタ引数をサポートしていません。
depends_on
depends_on
メタ引数は、スコープ付きデータソース内で使用すると特に強力になります。
前の例で、OpenTofuが最初のプランを作成したとき、OpenTofuがまだ構成を適用していないため、プランは失敗します。つまり、このWebサイトが存在するようにリソースを作成する必要があるため、このテストは失敗します。したがって、OpenTofuがこのチェックを初めて実行すると、常に気を散らす可能性のあるエラーメッセージがスローされます。
depends_on
をスコープ付きデータソースに追加することで、ロードバランサーなど、サイトのインフラストラクチャの重要な部分に依存するようにすることで、これを修正できます。チェックは、Webサイトの重要な部分が準備できるまで、適用後に既知
を返します。この戦略により、セットアップ中に不要な警告が発生するのを防ぎ、チェックは後続のプランと適用中に実行されます。
この戦略の1つの問題は、スコープ付きデータソースがdepends_on
依存しているリソースが変更された場合、OpenTofuがそのリソースを更新するまで、チェックブロックが適用後に既知
を返すことです。ユースケースによっては、この動作が許容される場合と問題となる場合があります。
スコープ付きデータソースが別のリソースの存在に依存しており、それを直接参照していない場合は、depends_on
メタ引数を実装することをお勧めします。
アサーション
チェックブロックは、assert
ブロックを使用してカスタムアサーションを検証します。各check
ブロックには、少なくとも1つ、場合によっては多数のassert
ブロックが必要です。各assert
ブロックには、condition
属性と、error_message
属性があります。
他のカスタム条件とは異なり、アサーションはOpenTofuの操作の実行に影響を与えません。失敗したアサーションは、進行中の操作を停止することなく警告を報告します。これは、OpenTofuがすぐにエラーを生成し、操作を停止して将来のリソースの適用または計画をブロックする、事後条件などの他のカスタム条件とは対照的です。
assert
ブロック内の条件引数は、囲んでいるcheck
ブロック内のスコープ付きデータソース、および現在のモジュール内の任意の変数、リソース、データソース、またはモジュール出力を参照できます。
メタ引数
チェックブロックは現在、メタ引数をサポートしていません。この機能に関するフィードバックをまだ収集しているため、チェックブロックでメタ引数をサポートするとユースケースが改善される場合は、お知らせください。
TACOS(TF自動化およびコラボレーションソフトウェア)での継続的な検証
TACOS(TF自動化およびコラボレーションソフトウェア)は、OpenTofuが新しいインフラストラクチャをプロビジョニングした後、ワークスペースの構成内のチェックが引き続き成功するかどうかを自動的に検証できます。
チェックまたは他のカスタム条件の選択
チェックブロックは、OpenTofu内で最も柔軟な検証ソリューションを提供します。チェックアサーション内で出力、変数、リソース、およびデータソースを参照できます。また、チェックを使用して、他のすべてのカスタム条件をモデル化することもできます。ただし、これはすべてのカスタム条件をチェックブロックに置き換えるべきという意味ではありません。
チェックブロックのアサーションと他のカスタム条件の間には、動作に大きな違いがあります。主な違いは、チェックブロックはOpenTofuの操作実行に影響を与えないということです。この非ブロック動作を利用して、ユースケースに最適な検証タイプを決定できます。
出力と変数
出力の事後条件と変数の検証はどちらも、入力と出力に関するアサーションを行います。
これは、OpenTofuにそれ以上の実行をブロックさせたい場合に該当します。
例えば、OpenTofuが入力変数を含む構成全体を適用した後に、その入力変数が無効であると警告しても役に立ちません。この場合、チェックブロックは無効な入力変数を警告しますが、操作を中断しません。同じ入力変数の検証ブロックは、無効な変数を警告し、計画または適用操作を停止させます。
リソースの事前条件と事後条件
事前条件と事後条件とチェックブロックの違いは、より微妙です。
事前条件は、リソースの変更が適用または計画される前に実行されるという点で、カスタム条件の中で独自です。事前条件と事後条件の選択は、事前条件と事後条件の選択に関するガイダンスを提供しており、事前条件とチェックブロックの選択にも同じことが当てはまります。
多くの場合、事後条件をチェックブロックと相互に使用して、リソースとデータソースを検証できます。
例えば、上記のcheck
ブロックの例を事後条件を使用するように書き換えることができます。以下のコードでは、postcondition
ブロックを使用して、ウェブサイトが期待されるステータスコード200
を返すことを検証します。
data "http" "opentofu_org" {
url = "https://www.opentofu.org"
lifecycle {
postcondition {
condition = self.status_code == 200
error_message = "${self.url} returned an unhealthy status code"
}
}
}
check
とpostcondition
のブロックの例はどちらも、計画または適用操作中にウェブサイトが200
のステータスコードを返すことを検証します。2つのブロックの違いは、それぞれが失敗をどのように処理するかです。
postcondition
ブロックが失敗した場合、OpenTofuは現在の操作の実行をブロックします。check
ブロックが失敗した場合、OpenTofuは操作の実行をブロックしません。
上記の例の事後条件が失敗した場合、回復することは不可能です。計画段階で事後条件が満たされない場合、OpenTofuは将来の計画または適用操作をブロックします。この問題が発生するのは、事後条件がOpenTofuの構成に直接依存するのではなく、複数のリソース間の複雑な相互作用に依存するためです。
インフラストラクチャ全体のステータスを検証するには、チェックブロックを使用することをお勧めします。事後条件は、リソースの構成に基づいて単一のリソースに関する保証が必要な場合にのみ使用することをお勧めします。