我想验证一个纯对象,它是Terraform源的输出(由其他模块使用)。具体来说,我想在输出声明中验证它,而不是在父模块中。我的理解是,precondition
表达式允许在output
块中使用,但我找不到一种方法来实际引用输出变量:
output "this" {
value = {
foo = {
bar = true
}
}
# Doesn't work
precondition {
condition = self.foo.bar != false
error_message = "bar is false."
}
}
我得到的错误是:Error: Invalid "self" reference: The "self" object is not available in this context. This object can be used only in resource provisioner, connection, and postcondition blocks.
我尝试了其他方法来引用输出的“self”,但它们会产生类似的错误消息。有没有一种语法可以做到这一点?
2条答案
按热度按时间guz6ccqo1#
自定义条件的文档很清楚:
每个前置条件和后置条件都需要一个条件参数。这是一个表达式,如果条件满足,则必须返回true,如果条件无效,则必须返回false。表达式可以引用同一模块中的任何其他对象,只要引用不创建循环依赖关系。资源后置条件也可以使用self对象来引用配置它们的资源的每个示例的属性。
强调我的。输出必须引用另一个对象(因此不能使用
self
)。vcudknz32#
self
行为仅适用于 * 后置条件 *,因为它们在与之关联的对象求值后才被检查。前提条件不能引用self
,因为该值尚未被计算;前置条件的目的是防止在不满足某些先决条件时计算对象,因此返回的错误可以是关于前置条件检查的任何内容,而不是关于由于它而失败的表达式。输出值没有后置条件,因为它们没有任何固有的副作用。输出值具有先决条件,主要是为了防止从配置中导出不正确的值,然后可能使用
terraform_remote_state
或tfe_outputs
使用这些值,因此可能会破坏该信息的使用者。你分享的例子似乎是人为的,因为你写的假设后置条件永远不会失败;它将检查的值被硬编码在正上方,并被设置为通过该条件的值。
然而,在一个更现实的场景中,输出值是从其他东西构建的,您可以使用先决条件来检查
value
表达式引用的其他对象。举例来说:这将阻止
value
表达式的求值,因此,如果值最终是空字符串,则输出值将被导出。