Spec-Zone.ru › OpenTofu 1.11

Метааргумент enabled

Примечание

В одном блоке ресурса или модуля нельзя использовать enabled вместе с count или for_each. Подробнее см. в разделе Ограничения.

Метааргумент enabled, появившийся в OpenTofu v1.11, предоставляет более удобный способ условно создавать или пропускать один экземпляр ресурса или модуля в блоке lifecycle. В отличие от традиционного обходного решения с count = var.enabled ? 1 : 0, для доступа к отдельным экземплярам которого требуется индексация массива, enabled обеспечивает прямой доступ, когда ресурс создан, и корректно обрабатывает состояние null, когда ресурс отключен.

Базовый синтаксис​

enabled — это метааргумент, который указывается внутри блока lifecycle. Он принимает выражения, возвращающие логические значения, чтобы определить, следует ли создавать ресурс или модуль.

Блок кода
variable "create_instance" {
  type    = bool
  default = true
}

resource "aws_instance" "example" {
  # ...
  lifecycle {
    enabled = var.create_instance
  }
}

Если enabled имеет значение true (или не указано), ресурс работает как обычно. Если enabled имеет значение false, ресурс не создается, и его значение становится null.

Переход с count​

Если в существующих ресурсах используется шаблон count = var.enabled ? 1 : 0, можно перейти на enabled без ручного изменения состояния.

После перехода больше не нужно обращаться к ресурсу, используя ключ экземпляра [0]. Вместо aws_instance.example[0] можно просто использовать aws_instance.example. OpenTofu автоматически выполнит миграцию состояния индексированного экземпляра в неиндексированный.

До​

Блок кода
variable "create_instance" {
  type    = bool
  default = true
}

resource "aws_instance" "example" {
  count = var.create_instance ? 1 : 0
  # ...
}

output "instance_id" {
  value = length(aws_instance.example) > 0 ? aws_instance.example[0].id : "not-created"
}

После​

Блок кода
variable "create_instance" {
  type    = bool
  default = true
}

resource "aws_instance" "example" {
  # ...
  lifecycle {
    enabled = var.create_instance
  }
}

output "instance_id" {
  value = aws_instance.example != null ? aws_instance.example.id : "not-created"
}

После применения этого изменения OpenTofu автоматически переместит существующий ресурс из aws_instance.example[0] в aws_instance.example. Блок moved или ручное изменение состояния не требуются.

Доступ к отключенным ресурсам​

Если ресурс может быть отключен, его значение будет null, поэтому к нему нельзя обращаться напрямую. Для безопасной обработки используйте условные выражения:

Блок кода
# Using try() - most concise but masks other errors
output "instance_id" {
  value = try(aws_instance.example.id, "not-created")
}

# Using null check - most verbose but clearest intent
output "instance_id" {
  value = aws_instance.example != null ? aws_instance.example.id : "not-created"
}

Попытка напрямую обратиться к ресурсу, настроенному с помощью enabled = false, приведет к ошибке во время plan или apply:

Блок кода
│ Error: Attempt to get attribute from null value
│
│   on main.tf line 10, in output "instance_id":
│   10:     value = aws_instance.example.id
│     ├────────────────
│     │ aws_instance.example is null
│
│ This value is null, so it does not have any attributes.

Ограничения​

Метааргумент enabled нельзя использовать вместе с count или for_each, поскольку эти метааргументы предназначены для разных целей. Используйте enabled для условного создания ресурсов с одним экземпляром, count — для создания нескольких нумерованных экземпляров или for_each — для создания нескольких именованных экземпляров.

Метааргумент enabled не может использовать:

  • Неизвестные значения (значения, которые становятся известны только при применении конфигурации)
  • Конфиденциальные значения
  • Значения null
  • Эфемерные значения
  • Нелогические значения

Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.11/language/meta-arguments/enabled/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API