Зависимость между элементами в цикле foreach в terraform

У меня есть модуль, который отвечает за создание частных конечных точек Azure. Для одного ресурса я хотел бы создать две частные точки, поэтому я использую цикл terraform forech следующим образом:

module "azure_private_endpoint" {
  source = "../azure-private-endpoint"
  for_each = { for k, v in var.endpoints : k => merge(v, { index = index(keys(var.endpoints), k) + 1 }) }
  name                = "testpe_${each.key}_${each.value.type}"
  location            = var.resource_location
  resource-group-name = "MyResourceGroup"
  subnet-key          = each.value.subnet
   ....
}

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

Как я могу реализовать это требование за один вызов модуля?

Уверен, что нет ничего, кроме хакерских способов (см. здесь ) или вообще нежелательного способа использования terraform apply -parallelism=1 (см. здесь)

Lorenzo Felletti 30.07.2024 23:07
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Зависимость между предметами для создания одного за другим в terraform

Спасибо Лоренцо Феллетти за ваш ценный вклад в достижение требования не создавать ресурсы одновременно, а создавать их один за другим.

В конфигурации, которой вы поделились при создании частной точки, не зависело друг от друга, хотя мы используем метааргумент dependent_on , он не работает, потому что depend_on работает со статическими входными данными, чего невозможно достичь при использовании foreach как он предоставляет динамические ссылки.

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

Конфигурация:

provider "azurerm" {
  features {}
}

variable "resource_group_name" {
  description = "Name of the resource group."
  type        = string
}

variable "vnet_name" {
  description = "Name of the virtual network."
  type        = string
}

variable "endpoints" {
  description = "List of private endpoints with their configurations."
  type        = list(object({
    name                          = string
    subnet                        = string
    private_connection_resource_id = string
    group_ids                     = list(string)
    connection_name               = string
  }))
}

resource "null_resource" "set_initial_state" {
  provisioner "local-exec" {
    interpreter = ["pwsh", "-c"]
    command = "Set-Content -Path current_state.txt -Value '0'"
  }
}

resource "null_resource" "sequential_resources" {
  count = length(var.endpoints)

  provisioner "local-exec" {
    interpreter = ["pwsh", "-c"]
    command = <<EOT
      while ((Get-Content current_state.txt) -ne "${count.index}") {
        Write-Host "${count.index} is waiting..."
        Start-Sleep -Seconds 5
      }
    EOT
  }

  provisioner "local-exec" {
    interpreter = ["pwsh", "-c"]
    command = <<EOT
      az network private-endpoint create `
        --name ${var.endpoints[count.index].name} `
        --resource-group ${var.resource_group_name} `
        --vnet-name ${var.vnet_name} `
        --subnet ${var.endpoints[count.index].subnet} `
        --private-connection-resource-id ${var.endpoints[count.index].private_connection_resource_id} `
        --group-ids ${join(" ", var.endpoints[count.index].group_ids)} `
        --connection-name ${var.endpoints[count.index].connection_name}
    EOT
  }

  provisioner "local-exec" {
    interpreter = ["pwsh", "-c"]
    command = "Set-Content -Path current_state.txt -Value '${count.index + 1}'"
  }

  depends_on = [null_resource.set_initial_state]
}

Развертывание:

Когда я запускал команды terraform, журналы состояния подготовки выглядели примерно так

это означает, что при создании pe1 остальные два находились в состоянии ожидания.

Ссылаться:

Последовательное создание ресурсов в terraform с помощью count или for_each. Возможный? - Stack Overflow ответил Федор Петров

https://developer.hashicorp.com/terraform/language/resources/provisioners/local-exec

Другие вопросы по теме

Похожие вопросы