azure 如何在Terraform中验证内联输出?

m4pnthwp  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(98)

我想验证一个纯对象,它是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”,但它们会产生类似的错误消息。有没有一种语法可以做到这一点?

guz6ccqo

guz6ccqo1#

自定义条件的文档很清楚:
每个前置条件和后置条件都需要一个条件参数。这是一个表达式,如果条件满足,则必须返回true,如果条件无效,则必须返回false。表达式可以引用同一模块中的任何其他对象,只要引用不创建循环依赖关系。资源后置条件也可以使用self对象来引用配置它们的资源的每个示例的属性。
强调我的。输出必须引用另一个对象(因此不能使用self)。

vcudknz3

vcudknz32#

self行为仅适用于 * 后置条件 *,因为它们在与之关联的对象求值后才被检查。前提条件不能引用self,因为该值尚未被计算;前置条件的目的是防止在不满足某些先决条件时计算对象,因此返回的错误可以是关于前置条件检查的任何内容,而不是关于由于它而失败的表达式。
输出值没有后置条件,因为它们没有任何固有的副作用。输出值具有先决条件,主要是为了防止从配置中导出不正确的值,然后可能使用terraform_remote_statetfe_outputs使用这些值,因此可能会破坏该信息的使用者。
你分享的例子似乎是人为的,因为你写的假设后置条件永远不会失败;它将检查的值被硬编码在正上方,并被设置为通过该条件的值。
然而,在一个更现实的场景中,输出值是从其他东西构建的,您可以使用先决条件来检查value表达式引用的其他对象。举例来说:

output "public_ip" {
  value = aws_instance.example.public_ip

  precondition {
    condition     = aws_instance.example.public_ip != ""
    error_message = "EC2 instance does not have a public IP address."
  }
}

这将阻止value表达式的求值,因此,如果值最终是空字符串,则输出值将被导出。

相关问题