Назад | Перейти на главную страницу

Что значит «Ошибка: цикл». значит в Terraform?

Документы Terraform по какой-то странной причине не объясняют, что означает «Ошибка: цикл». Я искал везде, но в официальных документах об этом нет упоминания.

В рамках работы Terraform анализирует зависимости между вашими resource блоки data блоки и другие конструкции конфигурации, чтобы определить подходящий порядок их обработки, чтобы были доступны необходимые входные данные.

Например, рассмотрим следующую надуманную простую конфигурацию:

resource "null_resource" "foo" {
}

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

Terraform проанализирует вышесказанное и заметит, что конфигурация null_resource.bar содержит ссылку на null_resource.foo, и, следовательно, операции, связанные с 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
  }
}

Сейчас null_resource.foo также относится к null_resource.bar. Теперь есть два отношения "должно произойти после", подразумеваемых этой конфигурацией:

  • Операции для null_resource.bar должно произойти после операции для null_resource.foo.
  • Операции для null_resource.foo должно произойти после операции для null_resource.bar.

Два приведенных выше утверждения противоречат друг другу: null_resource.bar не может быть обработан одновременно и после null_resource.foo. Terraform ответит на эту ситуацию, сообщив о цикле зависимости, используя сообщение об ошибке, которое вы видели:

Cycle: null_resource.foo, null_resource.bar

Когда Terraform возвращает эту ошибку, решение состоит в том, чтобы удалить хотя бы одну из стрелок «должно произойти после» (зависимости) из конфигурации, чтобы она больше не противоречила. Не видя вашей конфигурации, я не могу предположить, какое конкретное изменение может привести к этому в вашем случае, но вполне вероятно, что где-то в вашей конфигурации есть два таких взаимозависимых ресурса, как этот, или, возможно, ресурс, относящийся к самому себе.


Если у вас зрение, то в зависимости от сложности вашей конфигурации может быть полезно попросить Terraform создать график, аналогичный тем, которые я включил выше в этот ответ, но с выделением циклов. Для этого можно использовать то terraform graph команда, как это:

terraform graph -draw-cycles

Результатом этой команды является описание графика в формате, принятом Graphviz. Если на вашем локальном компьютере не установлен Graphviz, вы можете вместо этого скопировать и вставить вывод в Graphviz Online для создания графического изображения. В -draw-cycles Команда заставляет Terraform отмечать стрелки, относящиеся к отчетному циклу, красным цветом. Если вы не можете визуально отличить красный от черного, вы можете сначала отредактировать сгенерированный код Graphviz, чтобы заменить red с каким-то другим цветом, который вы можете отличить.

Графическая визуализация конфигурации имеет тенденцию становиться непригодной для нетривиальных конфигураций, потому что существует так много графиков и ребер, поэтому, если ваша конфигурация имеет много объектов, может быть лучше проследить зависимости через саму конфигурацию.