Документы 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
с каким-то другим цветом, который вы можете отличить.
Графическая визуализация конфигурации имеет тенденцию становиться непригодной для нетривиальных конфигураций, потому что существует так много графиков и ребер, поэтому, если ваша конфигурация имеет много объектов, может быть лучше проследить зависимости через саму конфигурацию.