什么是“错误:循环”。在 Terraform 中意味着什么?

Jua*_*nez 23 terraform

由于某种奇怪的原因,Terraform 文档没有解释“错误:循环”的含义。我到处找,但官方文档中没有提到它。

Mar*_*ins 28

作为 Terraform 工作的一部分,它分析您的resource块、data块和其他配置结构之间的依赖关系,以确定处理它们的合适顺序,以便提供必要的输入数据。

例如,考虑以下人为的简单配置:

resource "null_resource" "foo" {
}

resource "null_resource" "bar" {
  triggers = {
    foo = null_resource.foo.id
  }
}
Run Code Online (Sandbox Code Playgroud)

Terraform 会分析以上内容,注意到 的配置null_resource.bar包含对 的引用null_resource.foo,因此相关的操作null_resource.foo必须发生在 之前null_resource.bar。我们可以将其形象化为一个图形,其中箭头表示“必须发生在之后”或“取决于”:

一个用于 null_resource.foo 的框和一个用于 null_resource.bar 的框,带有从后者指向前者的箭头

  • 操作null_resource.bar 必须发生在操作之后null_resource.foo

现在考虑如果我们像这样修改配置会发生什么:

resource "null_resource" "foo" {
  triggers = {
    bar = null_resource.bar.id
  }
}

resource "null_resource" "bar" {
  triggers = {
    foo = null_resource.foo.id
  }
}
Run Code Online (Sandbox Code Playgroud)

现在null_resource.foo也指null_resource.bar。此配置隐含了两个“必须发生在之后”的关系:

一个用于 null_resource.foo 的框和一个用于 null_resource.bar 的框,其中一个箭头从后者指向前者,箭头指向它们之间的两个方向

  • 操作null_resource.bar 必须发生在操作之后null_resource.foo
  • 操作null_resource.foo 必须发生在操作之后null_resource.bar

上面的两个语句相互矛盾:null_resource.bar不能在 beforeafter 中处理null_resource.foo。Terraform 将通过报告依赖循环来响应这种情况,使用您看到的错误消息:

Cycle: null_resource.foo, null_resource.bar
Run Code Online (Sandbox Code Playgroud)

当 Terraform 返回此错误时,解决方案是从配置中删除至少一个“必须发生在”之后的箭头(依赖项),使其不再矛盾。在没有看到您的配置的情况下,我无法建议在您的情况下可以实现哪些特定更改,但很可能在您的配置中的某个地方,您有两个这样的相互依赖的资源,或者可能是一个引用自身的资源。


如果您有视力,根据您的配置的复杂程度,要求 Terraform 生成一个类似于我上面在此答案中包含的图形可能会有所帮助,但要突出显示周期。要做到这一点,你可以使用terraform graph命令,如下所示:

terraform graph -draw-cycles
Run Code Online (Sandbox Code Playgroud)

此命令的输出是以Graphviz接受的格式对图形的描述。如果您的本地计算机上没有安装 Graphviz,您可以将输出复制粘贴到Graphviz Online 中以生成图形图像。该-draw-cycles命令使 Terraform 使用红色标记与报告的循环相关的箭头。如果您无法在视觉上区分红色和黑色,您可能希望首先编辑生成的 Graphviz 代码以替换red为您可以区分的其他颜色。

配置的图形可视化往往无法用于非平凡的配置,因为有太多的图形和边,所以如果您的配置有很多对象,最好通过配置本身跟踪依赖关系。

  • 优秀的答案。谢谢你。我只是想知道为什么他们使用了不正确的术语。这不是循环,这是循环依赖。这样就清楚多了。 (4认同)
  • @JuanJimenez fwiw,在找到这个答案之前我有完全相同的想法 - 为什么不直接称其为循环依赖?可能值得向 Hashi 提交罚单...... (2认同)
  • 在我看来,在这个意义上,“依赖循环”和“循环依赖”是同义词。对我来说,这个错误消息的主要问题是它错过了一个好的错误消息的两个重要部分:为什么这很重要,以及我应该做什么?我希望可能有一种方法可以将我在这里所说的内容总结为一个简短的段落,从而更好地说明它的含义以及如何处理它。如果这包括同时更改术语,那就太好了,但我认为这不足以使其成为一个好的错误消息。 (2认同)