terraform destroy вызывает ошибку цикла, если циклы отсутствуют

Версия Terraform

Terraform v0.12.1

Файлы конфигурации Terraform

main.tf в моем корневом провайдере:

provider "google" {}

module "organisation_info" {
  source           = "../../modules/organisation-info"
  top_level_domain = "smoothteam.fi"
  region           = "us-central1"
}

module "stack_info" {
  source            = "../../modules/stack-info"
  organisation_info = "${module.organisation_info}"
}

Вот модуль "информация об организации":

variable "top_level_domain" {}
variable "region" {}

data "google_organization" "organization" {
  domain = "${var.top_level_domain}"
}

locals {
  organization_id    = "${data.google_organization.organization.id}"
  ns = "${replace("${var.top_level_domain}", ".", "-")}-"
}

output "organization_id" {
  value = "${local.organization_id}"
}

output "ns" {
  value = "${local.ns}"
}

Затем модуль 'stack-info':

variable "organisation_info" {
  type        = any
  description = "The organisation-scope this environment exists in."
}

module "project_info" {
  source            = "../project-info"
  organisation_info = "${var.organisation_info}"
  name              = "${local.project}"
}

locals {
  # Use the 'default' workspace for the 'staging' stack.
  name = "${terraform.workspace == "default" ? "staging" : terraform.workspace}"
  # In the 'production' stack, target the production project. Otherwise, target the staging project.
  project = "${local.name == "production" ? "production" : "staging"}"
}

output "project" {
  value = "${module.project_info}" # COMMENTING THIS OUTPUT REMOVES THE CYCLE.
}

И, наконец, модуль "информация о проекте":

variable "organisation_info" {
  type        = any
}
variable "name" {}

data "google_project" "project" {
  project_id = "${local.project_id}"
}

locals {
  project_id = "${var.organisation_info.ns}${var.name}"
}

output "org" {
  value = "${var.organisation_info}"
}

Вывод отладки

После выполнения terraform destroy -auto-approve я получаю:

Error: Cycle: module.stack_info.module.project_info.local.project_id, module.stack_info.output.project, module.stack_info.module.project_info.data.google_project.project (destroy), module.organisation_info.data.google_organization.organization (destroy), module.stack_info.var.organisation_info, module.stack_info.module.project_info.var.organisation_info, module.stack_info.module.project_info.output.org

И terraform graph -verbose -draw-cycles -type=plan-destroy дает мне этот график: imageИсточник:

digraph {
        compound = "true"
        newrank = "true"
        subgraph "root" {
                "[root] module.organisation_info.data.google_organization.organization" [label = "module.organisation_info.data.google_organization.organization", shape = "box"]
                "[root] module.stack_info.module.project_info.data.google_project.project" [label = "module.stack_info.module.project_info.data.google_project.project", shape = "box"]
                "[root] provider.google" [label = "provider.google", shape = "diamond"]
                "[root] module.organisation_info.data.google_organization.organization" -> "[root] module.stack_info.module.project_info.data.google_project.project"
                "[root] module.organisation_info.data.google_organization.organization" -> "[root] provider.google"
                "[root] module.stack_info.module.project_info.data.google_project.project" -> "[root] provider.google"
        }
}

Ожидаемое поведение

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

Я пропустил кучу другой логики в модулях, чтобы они были чистыми для этой проблемы.

По terraform циклов нет, а destroy должно работать нормально.

Фактическое поведение

Мы получаем цикл, который я опубликовал выше, хотя terraform не показывает циклов.

Действия по воспроизведению

  1. Настройте три модуля, organisation-info, project-info и stack-info, как показано выше.
  2. Настройте корневого провайдера, как показано выше.
  3. terraform init
  4. terraform destroy (кажется, не имеет значения, подавали ли вы заявку первым)

Дополнительный контекст

Странно то, что если я закомментирую этот вывод в stack-info, цикл остановится:

output "project" {
  value = "${module.project_info}" # IT'S THIS... COMMENTING THIS OUT REMOVES THE CYCLE.
}

Это кажется действительно странным ... Я не понимаю, почему вывод переменной должен иметь значение, и почему я получаю ошибку цикла, когда цикла нет.

Как ни странно, terraform plan -destroy не раскрывает цикл, только terraform destroy.

Мое паучье чутье подсказывает мне, что грядет зло.

Благодарим всех, кто может сказать мне, что происходит, является ли это ошибкой и, возможно, как ее обойти.


person Sebastian Nemeth    schedule 09.06.2019    source источник
comment
У меня что-то похожее, такая же версия. Любые идеи? stackoverflow.com/questions/56548780/   -  person Joe    schedule 11.06.2019
comment
Спасибо, я буду следить за этим.   -  person Joe    schedule 12.06.2019
comment
та же проблема. Я обновился до Terraform v0.13.2 .. но все та же проблема Error: Cycle: ....destroy deposed :(   -  person Abdennour TOUMI    schedule 05.09.2020


Ответы (1)


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

person sudhir tataraju    schedule 14.01.2021